依赖安全与供应链风险
依赖安全与供应链风险
这篇笔记还在编辑中,内容可能会继续补充、调整或重写。
风险贯穿整个依赖生命周期
已知漏洞只是供应链风险的一部分。攻击者还可能利用拼写相似包、依赖混淆、维护者账号失陷、恶意安装脚本、被篡改的 CI Action、锁文件冲突或发布令牌泄露。
“扫描结果为零”不能证明安全。治理目标是减少依赖面、控制代码来源、让变更可审查、让构建可追溯,并在风险出现时能够快速定位消费者和升级。
引入依赖前
至少检查:
- 是否可以使用平台或现有依赖完成
- 包名、Registry 和仓库是否对应
- 维护活跃度、所有者变化和发布历史
- 传递依赖数量、安装脚本和二进制下载
- 许可证与组织政策
- 导出 API、体积、运行环境和退出成本
下载量和星标只能作为线索,不能代替源码与发布来源验证。
安装与 CI
- 提交 lockfile,并在 CI 使用冻结安装
- 固定包管理器和运行时版本
- 默认审查或限制依赖安装脚本
- 外部 CI Action 使用不可变提交而不是浮动标签
- 缓存恢复后仍执行完整性和锁文件校验
- 生产构建使用最小权限、短期凭证和隔离环境
锁文件能固定解析结果,但无法判断被固定的代码是否可信,也不能阻止拥有发布权限的维护者发布恶意新版本。
SBOM 与来源证明
软件物料清单(SBOM)记录制品实际包含的组件和版本,使团队能在漏洞披露后快速查询影响范围。来源证明和签名用于说明制品由哪套受控流程从什么源码构建。
这些元数据只有与最终不可变制品关联并能够验证时才有价值;从 package.json 临时生成一张清单,不一定代表生产产物真正包含的内容。
升级与响应
自动升级按风险和生态分组,限制同时打开的 Pull Request,并执行类型、测试、构建和产物差异检查。高危漏洞需要明确响应时限;无法立即升级时,记录可利用条件、缓解措施和到期时间。
实践任务
- 盘点一个项目的直接依赖、传递依赖、安装脚本和许可证。
- 修改 lockfile 制造冻结安装失败,并确认 CI 阻止构建。
- 为生产制品生成 SBOM,再从其中查询一个传递依赖。
- 模拟某个依赖被披露漏洞,完成影响查询、升级、验证和发布记录。
验收标准
- 新依赖有必要性、来源和退出成本记录
- CI 使用冻结安装和最小权限凭证
- 安装脚本与第三方 Action 经过显式治理
- SBOM 与具体生产制品和发布版本关联
- 自动升级不会跳过兼容测试
- 漏洞响应包含可利用性、负责人、时限和验证结果