npm 包安全缺陷

自从 npm 在执行npm install命令时自动开启安全审计(npm audit)之后,很多前端或 Node.js 项目都报出几个或者一堆安全缺陷问题,尤其对于庞大的旧项目,数百乃至上万个安全缺陷问题。后来,Github 添加了 Security 功能,对项目开启依赖自动审计后,就不断接收到依赖存在安全缺陷的消息。之前只是简单的通过npm audit fix或者升级依赖来解决,这通常能解决绝大部分问题,然后并没有仔细研究过这方面,现在是时候了。

何为安全缺陷(Security Vulnerability)?

根据维基百科 Vulnerability 定义:

In computer security, a vulnerability is a weakness which can be exploited by a threat actor, such as an attacker, to perform unauthorized actions within a computer system.

即,在电脑安全领域,缺陷是指可以被攻击者来利用的弱点,攻击者可以用来在电脑系统当中执行一些未授许可的操作。比如,访问一些没有权限的数据,修改没有权限的数据,使系统正常的服务出现问题等等。因此,作为开发者需要关注应用的安全缺陷,作为开源维护者更需要关注安全问题,也即项目缺陷管理(Vulnerability Management)

我们可以经常接触到的前端代码安全缺陷管理主要是npm audit命令以及 Github Security 功能。另外,还有很多免费或商业的代码安全审计服务。

npm audit

注意:npm audit命令在 npm@6 当中添加。

执行npm audit命令需要存在package.jsonpackage-lock.json文件,否则会报错。

执行npm audit之后,会输出类似于下面的安全报告表格以及不同严重级别的总数。

# Run  npm update handlebars --depth 7 to resolve 1 vulnerability
┌───────────────┬──────────────────────────────────────────────────────────────┐
│ High          │ Prototype Pollution                                          │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package       │ handlebars                                                   │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ jest [dev]                                                   │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path          │ jest > jest-cli > @jest/core > @jest/reporters >             │
│               │ istanbul-reports > handlebars                                │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info     │ https://npmjs.com/advisories/1325                            │
└───────────────┴──────────────────────────────────────────────────────────────┘
found 38015 vulnerabilities (37997 low, 15 moderate, 3 high) in 877392 scanned packages
  run `npm audit fix` to fix 37905 of them.
  104 vulnerabilities require semver-major dependency updates.
  6 vulnerabilities require manual review. See the full report for details.

npm audit还支持各种参数用于过滤,可以通过npm help audit查看帮助手册。

yarn audit

npm audit命令类似,yarn audit同样可以输出安全报告表格,并且支持过滤:

  • yarn audit [--level info|low|moderate|high|critical]
  • yarn audit [--groups group_name ...]group_name是指dependencies/devDependencies之类的。

但是并没有npm audit fix用于修复缺陷的命令。

审计报告(Audit Report)

上面的表格是审计报告,包含严重性(Severity)、缺陷描述、缺陷来源包、依赖缺陷包的包、依赖路径、更多信息链接。详细解读查看 About audit reports

修复缺陷

  • 使用npm audit fix修复所有可修复的缺陷。
  • 使用审计报告提示的命令npm update handlebars --depth 7来升级存在缺陷的 handlebars 包,该命令会修改package-lock.json,也需要把该文件添加到源码仓库里面。
  • 直接升级项目package.json里面的依赖。

Github Security

Github Security 功能如果发现了依赖当中的安全缺陷会在仓库展示警告信息(只有仓库拥有者才能看到),另外也有通过发送消息来提醒。Security Alerts 页面可以查看具体哪些依赖存在问题,可以生成自动更新 Pull Request。具体的使用文档可以查看 Managing vulnerabilities in your project's dependencies

当然,使用 Github Security 来作为提醒,使用 npm audit 来解决是一种不错的结合。另外,Github Security 有 CVE 链接,npm 审计报告有更多信息链接,这些链接可以查看更详细的关于缺陷的描述、分析、资源等。

代码审计服务

下面这些都是对开源项目免费的代码审计服务:

另外,在 Github Marketplace 可以发现不少免费的代码审计服务。

总结

  • 使用 Github Security 或者免费的代码审计服务来监控安全缺陷。
  • 使用 npm audit 来修复。
  • 参考相关链接进一步了解缺陷相关问题。

参考