npm audit fix 修复依赖安全漏洞

使用 npm audit fix 来自动更新有安全漏洞的项目依赖。

起因

有一天我在执行npm install时出现如下提醒

1
added 253 packages from 162 contributors and audited 1117 packages in 42.157sfound 5 vulnerabilities (1 low, 4 high)  run `npm audit fix` to fix them, or `npm audit` for details html

按照控制台提示的命令,输入npm audit fix后,终端提示:

1
2
1 package update for 5 vulns involved breaking changes
(use `npm audit fix --force` to install breaking changes; or do it by hand)

这让我想起了 GitHub 不断给我发的安全提醒邮件:

**wmaqingbo,**

We found a potential security vulnerability in a repository for which you have been granted security alert access

wmaqingbo/common-components

Known **low severity** security vulnerability detected in `extend >= 3.0.0, < 3.0.2`defined in `package-lock.json`.
`package-lock.json` update suggested: `extend ~> 3.0.2`.

每次收到这种邮件,我都是在本地的仓库执行npm i extend@3.0.2来升级相关的依赖,现在才知道 npm 有相关的更新依赖命令啊!!

npm audit 命令

npm 官网 上查阅了对于npm audit fix的相关介绍:

npm@6 的一大更新是新增了 npm audit 命令,该命令会在项目中更新或者下载新的依赖包之后会自动运行,如果你在项目中使用了具有已知安全问题的依赖,就收到官方的警告通知。

# 扫描项目漏洞把不安全的依赖项自动更新到兼容性版本
npm audit fix

# 在不修改 node_modules 的情况下执行 audit fix,仍然会更改 pkglock
npm audit fix --package-lock-only

# 跳过更新 devDependencies
npm audit fix --only=prod

# 强制执行 audit fix 安装最新的依赖项(toplevel)
npm audit fix --force

# 单纯的获取 audit fix 会做的事,并以 json 格式输出
npm audit fix --dry-run --json

# 获取详情
npm audit

# 以 JSON 格式打印报告
npm audit --json

注意

有时候执行完npm audit fix后并不能自动的帮你 fix 掉这些错误,但是执行npm audit fix --force就可以。

但是不推荐直接执行 npm audit fix --force,因为对于没能自动修复的问题,说明肯定出现了 SEMVER WARNING之类的警告,这意味着推荐的修复版本存在让代码出问题的可能,主要发生在依赖包更改了 API 或者升级了大版本的情况下。如果强制更新,很有可能会出 bug!这时候就需要格外的小心甚至需要改动一些自己的代码了。

另外还有一种情况,就是官方发现了漏洞,但是目前没有可用的补丁。这时候就是个体力劳动了 😃

关闭检查

如何关闭安全检查,可以采用以下方式:

  • 安装单个包关闭安全审查: npm install example-package-name --no-audit
  • 安装所有包关闭安全审查 - 运行 npm set audit false - 手动将 ~/.npmrc 配置文件中的 audit 修改为 false

audit 报告

通过查看文档和源码发现,npm aduit 主要动作就是在 npm install 完成之后把需要检查的包的信息发送给一个官方接口, 再根据返回信息生成一个包含包名称、漏洞严重性、简介, 路径等的报告。处理格式化什么的主要在于 npm-audit-report 模块,有兴趣的也可以研究下。

那么报告是根据什么生成的呢,根据 audit 的提示信息我们能发现一个 node 安全平台,进去首页就看到一句类似『好消息,2018 年 4 月 10 号,npm 正式入驻我们平台』的通知。看来 audit 的数据来源也大概知道了。

该平台的公布一个漏洞的步骤跟大多安全平台类似:

  1. 漏洞被披露 or 反馈到此安全平台。
  2. 通知维护者相关信息(如果不是维护者自己汇报的)。
  3. 通知使用该依赖的用户,给给予推荐性的解决方案。
  4. 修复完成之后发布公开补丁,并申请 CVE
  5. 如果 45 天之后还没有修复,则通知超时并公开漏洞。

总结

总的来说,安全的问题不容忽视。 很多时候,大家拿到项目之后直接 npm install,只要项目能成功运行基本没有人会去关注装了什么。一大堆错综复杂的相互关联的依赖包,就算开发者有安全意识,也缺乏解决安全漏洞的手段。 此时有个官方平台来帮忙管理收集反馈给出报告给出建议等,是一件很值得称赞的事。

参考资料

  • npm audit 文档
  • 【科普】不了解CVE 就不能算是安全圈的人 来看看官方权威解答
  • 百度EUX