npm 依赖包安全审计修复更新

329 阅读3分钟

公司一年一度的代码安全审计如期而至,每次因为安全问题反反复复搞很久, 我们这边分为两种扫描,SAST(代码扫描)与SCA(依赖扫描),

SCA主要扫描的问题集中于:
  1. dependencies,devDependencies依赖包有安全问题
  2. 依赖包无最新版本,但依赖包的依赖有修复版本
  3. 依赖包有最新版本,但依赖包的依赖无修复版本

运行命令:

npm/yarn/pnpm audit // 检查依赖安全问题
npm/yarn/pnpm audit fix // 修复依赖
npm/yarn/pnpm audit fix --force // 强制修复依赖,破坏性修复,意味着代码可能跑不起来

这种方式一般是能修复第1种情况一小部分问题,如果是跨越大版本修复可能会有调整编码的工作量,自行评估。

对于第2种情况,一般做法是先强制指定版本,然后针对版本做代码调整打补丁,针对npm、yarn、pnpm 都有解决方案:

npm

强制指定版本,如果需要npm支持,需要使用npm-force-resolutions包,参考链接

打补丁方式使用 patch-package 参考链接,这个包的大概工作原理:

  1. 使用npx patch-package {package-name} 会生成一个git diff文件
  2. 每次使用npm i的时候会执行postinstall脚本,有类似的preinstall脚本,参考 npm生命周期
  3. 执行diff文件修改的代码覆盖至依赖中进行打补丁

使用步骤:

  1. 添加脚本 image.png

  2. 进入依赖包修改源码,例如我这里是loader-utils有安全问题,升级到最新版本1.4.2之后,nunjucks-html-loader1.1.0引入loader-utils会报错,找到源码路径修改 node_modules/nunjucks-html-loader/index.js image.png

  3. 运行命令 npx patch-package nunjucks-html-loader 自动生成patch文件如下: image.png

此时如果删除依赖包重新安装,就会自动执行 postinstall 重新打补丁。

yarn

package.json使用resolutions字段,可强行指定使用版本号,参考链接classic.yarnpkg.com/en/docs/sel…

image.png

打补丁方式也是使用patch-package

pnpm

如果使用的是pnpm 强制指定不版本有 pnpm.overrides(版本5.10.0之后支持) 功能和 yarnresolutions 字段类似,在package.json 文件中添加

image.png

如果你的版本低于5.10.0,可使用pnpm hooks,参考:

pnpm.io/zh/pnpmfile

github.com/pnpm/pnpm/i…

打补丁pnpm有自带的pnpm patchpatch-package类似

image.png

//电脑复制地址访问文件夹
cd /private/var/folders/7m/9292jc5n6xq8h94zt9xy68r00000gn/T/8111c7e22dacf6fca8fccf11358caf50
//修改源码完成之后,按照提示执行
pnpm patch-commit /private/var/folders/7m/9292jc5n6xq8h94zt9xy68r00000gn/T/8111c7e22dacf6fca8fccf11358caf50

会在你的项目目录生成patch文件夹,在package.json文件夹会多出pnpm.patchedDependencies字段,在下次安装的时候,会自动打上补丁,可将patch文件夹提交到git方便团队其他同事安装。

对于第3种情况,如果依赖包有安全问题,且未更新,建议到git提交issue给作者,这个修复时间就未知了。

最后,建议在前期架构设计的时候,选择依赖库以社区活跃度高,更新迭代快的依赖包,方便升级更新。