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.json
和package-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 来修复。
- 参考相关链接进一步了解缺陷相关问题。