依赖安全与供应链风险

依赖安全与供应链风险

这篇笔记还在编辑中,内容可能会继续补充、调整或重写。

风险贯穿整个依赖生命周期

已知漏洞只是供应链风险的一部分。攻击者还可能利用拼写相似包、依赖混淆、维护者账号失陷、恶意安装脚本、被篡改的 CI Action、锁文件冲突或发布令牌泄露。

“扫描结果为零”不能证明安全。治理目标是减少依赖面、控制代码来源、让变更可审查、让构建可追溯,并在风险出现时能够快速定位消费者和升级。

引入依赖前

至少检查:

  • 是否可以使用平台或现有依赖完成
  • 包名、Registry 和仓库是否对应
  • 维护活跃度、所有者变化和发布历史
  • 传递依赖数量、安装脚本和二进制下载
  • 许可证与组织政策
  • 导出 API、体积、运行环境和退出成本

下载量和星标只能作为线索,不能代替源码与发布来源验证。

安装与 CI

  • 提交 lockfile,并在 CI 使用冻结安装
  • 固定包管理器和运行时版本
  • 默认审查或限制依赖安装脚本
  • 外部 CI Action 使用不可变提交而不是浮动标签
  • 缓存恢复后仍执行完整性和锁文件校验
  • 生产构建使用最小权限、短期凭证和隔离环境

锁文件能固定解析结果,但无法判断被固定的代码是否可信,也不能阻止拥有发布权限的维护者发布恶意新版本。

SBOM 与来源证明

软件物料清单(SBOM)记录制品实际包含的组件和版本,使团队能在漏洞披露后快速查询影响范围。来源证明和签名用于说明制品由哪套受控流程从什么源码构建。

这些元数据只有与最终不可变制品关联并能够验证时才有价值;从 package.json 临时生成一张清单,不一定代表生产产物真正包含的内容。

升级与响应

自动升级按风险和生态分组,限制同时打开的 Pull Request,并执行类型、测试、构建和产物差异检查。高危漏洞需要明确响应时限;无法立即升级时,记录可利用条件、缓解措施和到期时间。

实践任务

  1. 盘点一个项目的直接依赖、传递依赖、安装脚本和许可证。
  2. 修改 lockfile 制造冻结安装失败,并确认 CI 阻止构建。
  3. 为生产制品生成 SBOM,再从其中查询一个传递依赖。
  4. 模拟某个依赖被披露漏洞,完成影响查询、升级、验证和发布记录。

验收标准

  • 新依赖有必要性、来源和退出成本记录
  • CI 使用冻结安装和最小权限凭证
  • 安装脚本与第三方 Action 经过显式治理
  • SBOM 与具体生产制品和发布版本关联
  • 自动升级不会跳过兼容测试
  • 漏洞响应包含可利用性、负责人、时限和验证结果

参考资料