如何查找阻断NPM嵌套依赖更新的包 定位持有漏洞版lodash的依赖
lodash安全漏洞依赖排查操作方法
定位持有漏洞版本lodash的项目依赖
- 直接执行带版本过滤的依赖查询命令,将
4.17.21替换为对应漏洞公告里的最低安全版本即可:npm ls lodash@<4.17.21
命令输出会自动列出所有引入了非安全版本lodash的完整依赖链路,每条链路上紧邻lodash的上层节点,就是直接持有漏洞版本的依赖包,不需要手动统计去重后的实例数量。 - 需要精简输出时,可以加参数过滤冗余信息:
类Unix环境执行:npm ls lodash --all | grep -E 'lodash@|^[├└]'
Windows环境执行:npm ls lodash --all | findstr "lodash@ ├ └"
输出中每个漏洞版lodash条目上方缩进层级更高的包名,就是对应的依赖持有方。 - 若
npm audit已返回具体漏洞编号,可执行npm audit --json输出结构化结果,找到对应lodash漏洞的advisories条目,其下findings字段会直接列出所有引入漏洞版本的依赖路径,无需手动梳理依赖树。
定位阻断嵌套依赖更新的NPM包
嵌套依赖无法自动更新到安全版本的核心原因,是依赖链路上存在包对lodash的版本约束范围不覆盖安全版本,导致npm无法完成版本抬升或去重。可按以下方法定位:
- 从上一步拿到的漏洞版本依赖链路入手,逐个排查链路上非项目直接依赖的中间包,执行
npm view <包名>@<实际安装版本> dependencies.lodash查看其声明的lodash版本范围,如果返回固定版本号、或版本范围上限低于安全版本,该包就是阻断更新的节点。 - 批量排查时可执行
npm outdated lodash,输出结果中wanted列版本低于安全版本的条目,对应的上层依赖就是卡版本的阻断点;如果多个上层依赖声明的lodash版本范围无交集,会导致多版本lodash共存无法去重,所有版本范围不覆盖安全版的包都是阻断点。 - 快速定位硬阻断包可直接在项目
package.json中添加版本强制覆盖配置(npm 8.3.0及以上版本支持):
配置完成后重新执行{ "overrides": { "lodash": "^4.17.21" } }npm install,再运行npm ls lodash,输出会直接标记出所有与强制版本规则冲突的依赖,这些就是无法通过自动更新解决问题的硬阻断包。
*注:如果使用yarn、pnpm包管理器,排查逻辑完全一致,仅对应命令替换为yarn why lodash、pnpm ls lodash即可;yarn环境下强制覆盖版本使用resolutions字段,pnpm与npm一致使用overrides字段。
内容的提问来源于stack exchange,提问作者linuxdan
相关产品推荐
相关产品推荐

