第三方依赖安全问题
现如今进行应用开发,无论是后端服务器应用还是前端应用开发,绝大多数时候我们都是在借助开发框架和各种类库进行快速开发。
据统计,一个应用有将近80%的代码其实是来自于第三方组件、依赖的类库等,而应用自身的代码其实只占了20%左右。
然而,一旦这些来自第三方的代码有安全漏洞(例如曾经的 lodash 原型污染),那么对应用整体的安全性依然会造成严峻的挑战。
对于前端开发来说,项目中可能会引入大部分 NPM 仓库的包,而我们知道,在 NPM 发布作品,NPM 不会做任何质量检查,只要包名没有重复,就可以发布。
NPM 包众多且良莠不齐,甚至还有一些钓鱼的包,为了降低来自第三方依赖的安全风险,我们只能:
- 尽量减少第三方依赖,选用相对成熟的依赖包,或尽量自己开发相应的功能,或使用公司自己的 npm 仓库
- 定期检测依赖包的风险
检测依赖包的风险
我们不可能手动检查所有依赖包,以及这个包的依赖包的安全漏洞,必须借助一些自动化工具。
常用的依赖包自动化检测工具:
npm audit
为了提高 npm 依赖的安全,npm 在 6.0 后添加了 npm audit 命令。
这个命令可以递归的分析当前项目的依赖树,将依赖包的信息发送给官方 registry,根据维护的漏洞数据库,生成并返回一个包含包名称、漏洞严重性(CVSS)、简介、路径等信息的报告。
返回的报告包括不安全依赖的信息,以及有关如何采取行动的说明,例如哪些依赖是不安全的,建议替换,或者使用 npm audit fix
工具修复。
CVSS(Common Vulnerability Scoring System):通用安全漏洞评分系统,是一个“行业公开标准,其被设计用来评测漏洞的严重程度,并帮助确定所需反应的紧急度和重要度”。
npm audit 基于NSP的漏洞数据库,它维护了一个已知不良依赖的名单,来判断项目中的依赖是否在这个名单中。
NSP(Node Security Platform) 本身是一个成熟的自动化扫描工具,在 2018年4月10日,被 npm 收购,是之成为 npm 的官方支持平台,旧的 NSP 已彻底关闭。
npm audit 原理:
- 它只评估软件包的依赖关系是否存在漏洞,通过查找和修复依赖关系中的已知问题(可能会导致数据丢失、服务中断,对敏感信息的未授权访问或其他问题)来帮助保护用户。
- 它不会进行代码分析或关心 node_modules 目录中的内容。
- 它的主要思想是使开发人员更了解依赖项的潜在问题,并使用该信息将软件包的安全性从安装的那一刻起嵌入到开发过程中。
- 它的工作方式是扫描
package.json
和package-lock.json
文件,以创建完整的依赖关系列表,然后将依赖关系树中的软件包与已知漏洞列表(NSP数据库)进行比较。
使用 npm audit
命令进行安全扫描的限制:
- npm 仅支持镜像源(registry) 为官方仓库(https://registry.npmjs.org )的应用
- 如果是其他的镜像源(例如taobao),执行命令会报错
Your configured registry (https://registry.npm.taobao.org/) does not support audit requests.
- 如果是其他的镜像源(例如taobao),执行命令会报错
- npm 需要
package.json
和package-lock.json
文件- 如果缺少
package.json
执行命令会报错No package.json found: Cannot audit a project without a package.json
- 如果缺少
package-lock.json
执行命令会报错Cannot audit a project without a lockfile
- 如果缺少
- 如果是从 Github 而不是 npm 仓库中获取的依赖,或不知名的依赖,npm audit 也无法发现威胁
- 例如使用 Github 地址安装的并没有发布到 npmjs 上的依赖
npm install https://github.com/xxxxx
- 例如使用 Github 地址安装的并没有发布到 npmjs 上的依赖
在项目中安装依赖时 npm install
,npm 也会自动进行 audit 并提示报告信息,并不会因上面提到的限制影响依赖安装或报错。
snyk
snyk 是一款漏洞扫描工具。
- 可以集成到自己的源代码管理系统(例如 Gitlab),让 snyk 主动监控项目。
- 它也提供 CLI 命令手动扫描项目, 需要用户凭证(可以使用 Github 账户登录)
snyk 仅对开源项目免费,私有项目有免费计划,每月有一定的测试次数限制(每月200/300次)。
使用:
# npm 安装
npm install -g snyk
# 安装之后,您需要使用Snyk帐户进行身份验证
snyk auth
# 进行扫描
snyk test
npm audit VS snyk
详细参考:Comparing npm audit with Snyk
主要区别:
- 费用
- 作为 npm 包管理器的一部分,npm audit 是免费的,在 npm 6 以上的版本都可以使用。
- snyk 是商业工具,对于开源项目是免费的,对私有项目也有一个免费计划,限制每月使用次数。
- 支持语言
- npm audit 用于审核 npmjs 官方仓库的软件包,仅支持 JavaScript。
- snyk 是用于多个开发语言的依赖关系分析平台,涵盖 JavaScript、Java、.Net、Ruby、Python、PHP、Docker 等多个语言。
- snyk 维护的漏洞数据库比 npm audit(NSP)更全面。
- 其中包括 Snyk 自己的专门研究团队发现的漏洞、来源于社区(如Github)以及公共数据源(如NVD美国国家通用漏洞数据库)的漏洞。
- 他们的数据库具有丰富的内容,代码段和帮助性链接,以获取更多信息。
- 集成
- snyk 主要优点就是它可以与基于 git 的源代码管理系统集成(Github、Gitlab等),通过集成,可以无缝扫描每个 commit 和 pull 请求。
Sonarqube
Sonarqube 是近年业界最为流行的代码审查工具,它使用了和其他开源软件一样的软件开源服务收费策略。
我们可以自己搭建公司内部的代码审查平台,也可以直接使用 Sonarqube 在线的扫描服务。
公开服务的 Sonarqube 可以直接和 Github 和 Bitbucket 集成,但是需要提供相应的授权,因此使用 Sonarqube 需要提供仓库权限。
Sonarqube 中发现威胁只是它的功能之一。
它提供了发现 Code Smells(代码异味)、Bugs、Vulnerabilities(漏洞) 三大特性,并且支持 Java、JavaScript 和 C# 等大量语言。
如果仅仅需要检查前端项目中代码的安全缺陷,可以使用更加轻量级的,能集成到构建脚本中的工具,例如 snyk(轻量,不需要暴露仓库权限,并且也支持本地扫描)。