node依赖安全扫描工具

企业级node安全保障

第三方依赖的安全隐患

安全现状

  • 去年11月, snyk公司发布《2017开源软件安全报告》, 其中扫描了43万个站点, 发现77%的站点包含到至少1个以上已知漏洞.
  • OWASP把"Using Components with Known Vulnerabilities"列为十大安全威胁之一.

为什么需要漏洞扫描工具

几乎每个项目都会引用许多第三广告的包, 有人统计一个项目大约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

nsp是一个叫^Lift公司的产品.安装和使用方法都很简单.

安装: :B_exampleblock:

1  npm i -g nsp

使用方法:

1  nsp check
20180810_134122_4932a3P.png

上图是nsp check当前项目时报告的结果, 该项目的第三方依赖含有2个已知漏洞, 下面的表格详细描述了其中一个漏洞的详情.下文中我们会详细说明类似表格的意思.
除了默认table方式输出的漏洞详情之外, 还有summary, json, codeClimate, minimal等方式输出结果. 还有官方也提供了方法编写自定义reporter来输出.

nsp check --reporter [table|summary|json|codeClimate|minimal|自定义reporter]
20180810_135207_4932nBW.png

20180810_135407_49320Lc.png
20180810_135618_4932BWi.png
20180810_135651_4932Ogo.png

nsp filter

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也将会成为历史.

npm

npm@6.0新特性

  • npm从6.0开始会基于nsp数据库自动检查安装请求,如果代码包含安全漏洞的话,将会返回警告。
  • 可以用npm set audit true/false 来打开/关闭开关.
  • 也可以用命令行参数npm install –no-audit来指定本次安装不进行扫瞄.
  • 同时提供了新命令"npm aduit [fix]"来扫描和修复已知漏洞
    如安装shelljs成功之后会自动报告漏洞怀


    20180810_141825_4932bqu.png

npm audit [–json | –parseable]

20180912_182525_57705iUv.png

Severity有四个等级: critical(立即处理), High(尽快处理), Moderate(有时间就处理), Low(自行决定要不要处理)
Description: 描述
Package: 哪个包有问题
Dependency of: 你的项目中哪个包依赖了这个有问题的包
Path: 项目中的这个包到有问题的包之间的依赖路径
More info: 查看这个问题的更多详细信息, 链到nsp的具体advisory中去.

除了table之外, npm audit还可以输出json和纯文本

--json(输出成json)

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
        }],
    }],
}

–parseable(输出成纯文本)

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

npm audit fix [--force]

  • 扫描并会自动更新到semver兼容的版本来消除漏洞.
  • --force 强制更新到安全版本, 即使semantic versioning不兼容也会更新.
  • 不一定能帮你修复所有的漏洞

如下图扫描出了13个漏洞, audit fix 可以修复其中3个, audit fix –force可以修复其中7个, 还有3个没有可修复版本, 无法自动修复.


20180810_142636_4932o00.png

snyk

snyk是一款商业漏洞扫描工具. 仅对开源项目免费, 闭源项目受限次数的扫描(每月200次). 相比于官方的npm audit, 有以下优势:

更多的支持的语言

20180810_143401_4932a-D.png

更好的整合

20180810_143753_4932nIK.png

更大的漏洞库 (2018/08/11号的数据)

  • snyk vulnerability DB: 1142个
  • npm/nsp vulnerability DB: 612个

实验结果 (2018/08/11号的数据)

我从github上找了20个常用的包,分别用npm和snyk扫描,结果如下:

20180912_183312_57705ve1.png

其它工具

retire

一个开源的依赖监测工具,提供命令行和Grunt, Firfox, Chrome等插件。从NIST NVD,漏洞追踪系统,博客和邮件列表等收集漏洞数据。

greenkeeper

并没有漏洞扫描功能,只是会自动帮你把所有的依赖升级到最新版, 有可能最新版本包含更多的漏洞.

OWASP dependency check

OWASP开发的依赖扫描工具,除了node,还支持Ruby,Python, C/C++.

总结

总结

  • 仅扫描 已知依赖包 里的漏洞
  • yarn audit 目前还在讨论, 还没有实现
  • 安全没有一个终点,一直是一个过程

我们可以贡献什么?

1)提issue: 给有漏洞的包作者提issue, 等其修复.
2)提PR: 修复漏洞, 给作者提PR.
3)报告漏洞: 发邮件给 report@nodesecurity.iosecurity@npmjs.com报告漏洞. 也可以在线提交一个表单(https://nodesecurity.io/report)

参考文献

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352