NPM 项目开源漏洞分析和处理 - GcsSloop/web-note GitHub Wiki

1. 分析漏洞

  • 使用分析工具检测是否有漏洞,例如: Dependency-Check
  • 使用分析 npm audit 检查 npm 官方报告的漏洞

2. 检查漏洞所在依赖

在漏洞检测中,会发现某依赖项目有漏洞,但它并不是我们直接依赖的内容,而是间接依赖。
可以通过 npm list $name 来查看依赖树,例如:

npm list browserslist
[email protected] /Users/gcssloop/WorkSpace/Sansi/ccs-web-2/ccs-platform-editor/server
├─┬ @babel/[email protected]
  └─┬ [email protected]
    └── [email protected]  deduped


如果是 npm audit 指令则会直接报出所在路径。

┌───────────────┬──────────────────────────────────────────────────────────────┐
│ Moderate      │ Regular Expression Denial of Service                         │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package       │ browserslist                                                 │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ @babel/preset-env [dev]                                      │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path          │ @babel/preset-env > core-js-compat > browserslist            │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info     │ https://npmjs.com/advisories/1747                            │
└───────────────┴──────────────────────────────────────────────────────────────┘

3. 尝试修复

可以先尝试使用 npm audit fix 进行简单的修复,其实就是升级对应的依赖版本。
在修复完成后再检查一次是否正常,如果依旧有问题,那么就需要有针对性的修复。

先检查直接依赖的部分是否可以升级,例如: browserslist 的最直接依赖是 @babel/preset-env 那就先尝试升级 @babel/preset-env。如果直接依赖已经是最新版本或者升级成本过高,比如跨了大版本,vue2 -> vue3, 那就可以尝试直接引用次级依赖的新版本,进而带动底层依赖的升级。

如果底层依赖的确无法升级,那么可以尝试寻找是否有替代方案,或者提交开源项目申请原作者更新,当然,还有另外一种临时方案就是下载源码进行依赖更新后转为私有仓库,等公开仓库修复后再转回去。

4. 功能验证

在进行漏洞修复更新后,需要对漏洞修复部分相关功能进行验证,有时候一些依赖升级根本不讲码德,只升级了一个最低位的小版本,然后里面添加了不兼容的内容,所以升级了依赖后,要对依赖相关的功能进行二次验证,确保升级后功能可以正常运行。