几乎每个项目都会引用许多第三广告的包, 有人统计一个项目大约80%的代码来自于第三方依赖, 自己写的代码不足20%. 我们用尽全力保证我们20%的代码质量, 却很可能不知不觉间被80%的第三方代码中的漏洞坑害. 同时npm仓库里的包质量良莠不齐, 如果你有在npm官方仓库中提交过自己的作品,你会发现npm不会做任何质量检查, 只要你的包名没有重复, 你就可以提交, npm包虽然众多,但质量参差不齐, 甚至还有一些钓鱼的包. 我们不可能手动检查所有依赖包的安全漏洞,必须借助一些自动化工具.
目前已知的这类自动化工具主要有:nsp (node security platform), npm audit fix, snyk, retire, greenkeeper, OWASP Dependency Check.本文主要介绍nsp及npm收购后做的整合, 和一个商用扫描工具snyk. 并对它们做一个简单的对比. 最后简单介绍了一下retire, greenkeeper, OWASP Dependency Check.
nsp是一个叫^Lift公司的产品.安装和使用方法都很简单.
1 npm i -g nsp
1 nsp check
上图是nsp check当前项目时报告的结果, 该项目的第三方依赖含有2个已知漏洞, 下面的表格详细描述了其中一个漏洞的详情.下文中我们会详细说明类似表格的意思.
除了默认table方式输出的漏洞详情之外, 还有summary, json, codeClimate, minimal等方式输出结果. 还有官方也提供了方法编写自定义reporter来输出.
nsp check --reporter [table|summary|json|codeClimate|minimal|自定义reporter]
nsp 还提供了filer功能, 能根据漏洞的CVSS分数做filter.如只关注分数高于4的漏洞.
CVSS: (Common Vulnerability Scoring System, 通用安全漏洞评分系统)是一个标准的漏洞评分系统. 分数0-10之间, 从各种维度给某个漏洞打分, 然后加权计算漏洞的分数.
nsp check --filter 4
/* hide all CVSS score is below 4 */
nsp check --threshold 4
/* 至少有一个漏洞CVSS高于4, 才会返回错误 */
今年4月, npm收购nsp, 使之成为npm的官方支持平台. 同时今年9月底旧的nsp也会彻底关闭, nsp也将会成为历史.
Severity有四个等级: critical(立即处理), High(尽快处理), Moderate(有时间就处理), Low(自行决定要不要处理)
Description: 描述
Package: 哪个包有问题
Dependency of: 你的项目中哪个包依赖了这个有问题的包
Path: 项目中的这个包到有问题的包之间的依赖路径
More info: 查看这个问题的更多详细信息, 链到nsp的具体advisory中去.
clin@CNclin:~/Documents/javascript/date-input$ npm audit --json
{
"actions": [{
"action": "update",
"module": "fsevents",
"depth": 3,
"target": "1.2.4",
"resolves": [{
"id": 534,
"path": "babel-cli>chokidar>fsevents>node-pre-gyp>tar-pack>debug",
"dev": false,
"optional": true,
"bundled": true
}],
}],
}
clin@CNclin:~/Documents/javascript/date-input$ npm audit --parseable
update debug low npm update fsevents --depth 3 Regular
Expression Denial of Service https://nodesecurity.io/advisories/534
babel-cli>chokidar>fsevents>node-pre-gyp>tar-pack>debug N
如下图扫描出了13个漏洞, audit fix 可以修复其中3个, audit fix –force可以修复其中7个, 还有3个没有可修复版本, 无法自动修复.
snyk是一款商业漏洞扫描工具. 仅对开源项目免费, 闭源项目受限次数的扫描(每月200次). 相比于官方的npm audit, 有以下优势:
我从github上找了20个常用的包,分别用npm和snyk扫描,结果如下:
一个开源的依赖监测工具,提供命令行和Grunt, Firfox, Chrome等插件。从NIST NVD,漏洞追踪系统,博客和邮件列表等收集漏洞数据。
并没有漏洞扫描功能,只是会自动帮你把所有的依赖升级到最新版, 有可能最新版本包含更多的漏洞.
OWASP开发的依赖扫描工具,除了node,还支持Ruby,Python, C/C++.
1)提issue: 给有漏洞的包作者提issue, 等其修复.
2)提PR: 修复漏洞, 给作者提PR.
3)报告漏洞: 发邮件给 [email protected] 或 [email protected]报告漏洞. 也可以在线提交一个表单(https://nodesecurity.io/report)