为何NPM Audit要求降级mssql?jsonwebtoken依赖漏洞排查
为什么npm audit要求降级mssql而非使用最新版本?
我们收到关于jsonwebtoken <= 8.5.1的npm audit警告,官方建议修复方案是升级mssql至7.2.0。但我们执行npm remove mssql卸载后,重新安装最新版本npm i -D mssql,最终安装了9.0.1版本。
然而npm audit仍发出警告,要求安装mssql@7.2.0,这是为什么?
npm audit 输出
$ npm audit --registry=https://registry.npmjs.org/ # npm 审计报告 jsonwebtoken <=8.5.1 严重程度:高 jsonwebtoken不受限制的密钥类型可能导致旧密钥被使用 jsonwebtoken的jwt.verify函数存在不安全输入验证 jsonwebtoken密钥检索函数实现不安全,可能导致RSA到HMAC的可伪造公/私令牌 jsonwebtoken因jwt.verify()默认算法不安全,存在签名验证绕过漏洞 可通过`npm audit fix --force`修复 将安装mssql@7.2.0,这是一个破坏性变更 node_modules/jsonwebtoken @azure/msal-node * 依赖易受攻击版本的jsonwebtoken node_modules/@azure/msal-node @azure/identity >=1.2.0-alpha.20200903.1 依赖易受攻击版本的@azure/msal-node node_modules/@azure/identity tedious >=11.0.9 依赖易受攻击版本的@azure/identity node_modules/tedious mssql >=7.2.1 依赖易受攻击版本的tedious node_modules/mssql 5个漏洞(4个中等,1个高风险) 要解决所有问题(包括破坏性变更),请运行: npm audit fix --force
依赖关系链
- "mssql": "9.0.1"
- "tedious": "^15.0.1"(实际安装15.1.2)
- "@azure/identity": "^2.0.4"
- "@azure/msal-node": "^1.10.0"
- "jsonwebtoken": "^8.5.1"
- "@azure/msal-node": "^1.10.0"
- "@azure/identity": "^2.0.4"
- "tedious": "^15.0.1"(实际安装15.1.2)
我们没有其他直接依赖jsonwebtoken的库。
package.json 内容
{ "dependencies": { "express": "^4.18.1", "flatted": "^3.1.1", "http-proxy-middleware": "^2.0.6", "log-timestamp": "^0.3.0", "node-fetch": "^2.6.1", "nodemon": "^2.0.20", "sha1-hex": "^1.0.0" }, "devDependencies": { "@types/jest": "^26.0.3", "eslint": "^7.7.0", "eslint-config-strongloop": "^2.1.0", "jest": "^28.1.3", "jest-junit": "^8.0.0", "mssql": "^9.0.1" } }
原因分析
npm audit的修复建议是基于现有依赖树中能解决漏洞的最低版本变更,而非优先推荐最新版本:
- 从依赖链可见,mssql@9.0.1依赖的tedious@15.x版本,会引入@azure/identity@2.x,进而依赖@azure/msal-node@1.10.x,最终带入易受攻击的jsonwebtoken@8.5.1。
- npm audit检测到,mssql@7.2.0依赖的tedious版本更低,其依赖树中不存在这条带漏洞的链路。
- npm自动修复逻辑会选择能解决问题的最小版本变更路径,哪怕是降级操作。它不会主动判断最新版本是否有其他未被收录的修复方案,仅依据已有的漏洞数据库信息给出建议。
可行解决方案
- 强制指定安全版本:在package.json中添加
resolutions字段(npm 8+支持),强制将jsonwebtoken锁定到安全版本(如^9.0.0):
执行"resolutions": { "jsonwebtoken": "^9.0.0" }npm install即可应用该强制解析。 - 等待上游更新:关注@azure/msal-node、@azure/identity或tedious的版本更新,当它们升级jsonwebtoken到安全版本后,再升级mssql就能自动解决漏洞。
- 忽略漏洞(不推荐):若确认该漏洞在项目中无实际风险,可执行
npm audit --ignore=GHSA-8cf7-32gw-wr33,GHSA-27h2-hvpr-p74q,GHSA-hjrf-2m68-5959,GHSA-qwph-4952-7xr6忽略特定漏洞,但这会留存安全隐患。
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

