OSS 安全审计 - 个人也能做的依赖关系安全检查
本文约需 13 分钟阅读
现代软件项目依赖数百个开源包。平均 Node.js 应用有超过 1,200 个传递依赖,Synopsys 2024 年开源安全与风险分析报告发现 96% 的商业代码库包含开源组件,其中 84% 包含至少一个已知漏洞。然而大多数个人开发者从未对其依赖进行安全审计。好消息是 npm audit、Snyk 和 Dependabot 等强大工具使依赖审计对所有人都触手可及。本文介绍任何开发者今天就能采取的实际步骤来验证开源依赖的安全性。
用 npm audit 开始依赖检查
npm audit 的基本用法
npm audit 是检测 Node.js 项目依赖中已知漏洞的内置命令。只需在项目目录中运行 `npm audit`,即可扫描整个依赖树,列出漏洞严重程度(Critical / High / Moderate / Low)、受影响的包名和修复版本的有无。运行 `npm audit fix` 可在不破坏兼容性的范围内自动更新包。但如果需要主版本更新,则需要 `npm audit fix --force`,这可能包含破坏性变更,请谨慎执行。
如何解读 CVSS 分数
与 CVE 关联的 CVSS(通用漏洞评分系统)分数用 0.0 到 10.0 的数值表示漏洞严重程度。9.0 以上为 Critical,7.0 以上为 High,4.0 以上为 Medium,以下为 Low。但仅凭 CVSS 分数决定优先级是危险的。即使分数很高,如果项目中没有使用相关功能,实际风险可能很低。相反,与认证或数据处理相关的包的中等分数漏洞应优先处理。
使用 GitHub Dependabot 自动监控
Dependabot 的配置与运用
GitHub Dependabot 自动监控仓库依赖,发现漏洞时自动生成拉取请求。所有 GitHub 公共仓库免费可用,私有仓库需要 GitHub Advanced Security 许可。只需在仓库中添加 `.github/dependabot.yml` 文件即可启用。可以细致配置更新频率(daily / weekly / monthly)、目标包生态系统(npm、pip、Maven 等)和自动合并条件。个人开发者推荐 weekly 设置 - daily 通知太多会疲惫,monthly 漏洞放置时间太长。
Snyk 的比较与使用场景
Snyk 与 Dependabot 类似检测依赖漏洞,但有几点不同。Snyk 拥有自己的漏洞数据库,有时能在 NVD 注册之前检测到漏洞。还提供自动生成修复补丁、容器镜像扫描和 IaC 模板扫描等更广泛的安全检查。免费计划每月可进行 200 次测试,对个人开发者足够。Dependabot 的优势是与 GitHub 无缝集成,Snyk 的优势是更详细的分析和更广泛的覆盖。两者并用可最小化检测遗漏。
用 SBOM 可视化依赖关系
SBOM(软件物料清单)是列出软件中所有组件及其版本的文档。在 npm 中可以用 `npm sbom --sbom-format cyclonedx` 命令生成 CycloneDX 格式的 SBOM。定期生成 SBOM 并与漏洞数据库比对,可以持续掌握项目的安全状态。美国通过第 14028 号行政命令要求向联邦政府提供的软件必须提供 SBOM。作为供应链攻击的防御,通过 SBOM 可视化依赖关系不可或缺。
个人开发者的实践工作流
融入日常开发流程
将安全审计融入日常开发流程而非作为特殊事件是持续的关键。具体来说,养成在 `npm install` 后必定运行 `npm audit` 的习惯。在 package.json 的 scripts 中添加 `"postinstall": "npm audit --audit-level=high"` 可在包安装时自动检查 High 以上的漏洞。建议在 CI/CD 管道中也加入 `npm audit --audit-level=critical`,在有 Critical 漏洞时使构建失败。使用 GitHub Actions 结合 Dependabot 警报,可以从漏洞检测到修复 PR 生成全部自动化。
关于供应链安全的更广泛视角,请参阅供应链攻击。要深入了解 OSS 安全实践,开源安全指南 (Amazon)是有价值的资源。
现在就能做的事
- 在项目目录中运行 `npm audit`,了解当前的漏洞状况
- 在 GitHub 仓库中添加 `.github/dependabot.yml`,启用 weekly 自动监控
- 优先修复 Critical 和 High 漏洞,无法修复的确认影响范围后决定应对方针
- 使用 Passtsuku.com 为 npm / GitHub 账户设置唯一的强密码,防止包注册表账户被劫持
常见问题
- npm audit 显示大量漏洞该怎么办?
- 首先集中处理 Critical 和 High。从 `npm audit fix` 能自动修复的开始,其余手动处理。仅影响 devDependencies 的漏洞生产环境风险较低,可以降低优先级。不要试图一次解决所有问题,从严重程度高的开始逐步处理。
- 个人开发也需要 Dependabot 吗?
- 是的,个人开发更需要 Dependabot。企业有安全团队,但个人开发者需要独自追踪漏洞。Dependabot 免费自动检测漏洞并生成修复 PR,大幅减轻个人开发者的负担。
- 应该使用 npm audit 还是 Snyk?
- 建议两者并用。npm audit 是内置的易于使用,Snyk 提供更广泛的漏洞数据库和详细分析。先从 npm audit 开始,有余力时添加 Snyk 的免费计划是现实的方法。
这篇文章对您有帮助吗?