信任的断点:软件供应链安全的证据链与治理边界
断点常发生在漏洞库之外
软件供应链安全容易被压缩成一句话:把依赖漏洞扫干净。省事,也失真。攻击者盯上的往往不是某个CVE编号,而是源码到制品之间的信任传递:包管理器、构建机、凭证、缓存、仓库、发布流水线。一个依赖被替换,一次构建缓存被污染,一枚权限过大的令牌,都会把同一段恶意代码送进下游成百上千个系统。
去年秋天在南京软件谷的一次产学研闭门交流上,有企业安全负责人说了个反差:定位某个开源库的漏洞版本,两小时;查清某个内部制品由哪次流水线、哪台构建机、哪份依赖锁文件产出,三周。日志并不少。缺的是把代码、依赖、构建、制品、部署串起来的证据链。短句。这事麻烦。
软件构建流水线依赖解析与制品签名证据链示意图
所以,问题不只是“用了什么组件”,还包括“这些组件在什么环境里被组合成制品”。软件供应链安全的中心对象是制品及其证明,而不是一份静态的组件清单。清单有用,但清单本身没有时间、构建参数、源仓库、签名身份,就无法回答归因和爆炸半径。
SBOM与签名:能证明什么,不能证明什么
SBOM常被赋予过高期待。SPDX、CycloneDX能描述组件、版本、许可证和部分关系,但它的质量取决于生成工具和构建过程的接入深度。运行时动态加载、容器基础镜像、私有包、二进制依赖,都可能让SBOM出现盲区。更现实的是,SBOM不天然携带漏洞信息;它需要与漏洞库、影响声明、VEX关联,才能从物料清单变成修复决策依据。
签名也一样。Sigstore、cosign、GPG能回答“谁签了这个制品”“签名后有没有被篡改”。它不能回答“构建过程有没有被投毒”。签名证明来源与完整性,不证明安全性。这个边界必须说清。否则团队会误以为上了签名就完成了治理,实际只是把信任锚点前移了一步。
更完整的做法是构建证明:记录构建输入、依赖锁文件、构建命令、构建环境、产物摘要,并用可验证身份签名。in-toto、SLSA的思路都在这里。说实话,落地并不轻松。可复现构建要求工具链固定、时间戳可归一、路径和环境变量可收敛,成本不低。对多数团队,先做到“构建证明可追溯”比追求逐字节可复现更务实。
开源组件传递依赖漏洞传播路径与SBOM关联分析图
构建环境是更高价值的攻击面
构建环境是更高价值的攻击面
依赖混淆是典型例子。内部包名与公共源包名冲突,包管理器又优先从公网源解析,攻击者抢注同名包,就能把恶意版本送进构建。它成立有前提:私有源配置不严、命名空间隔离不足、锁文件与源优先级管理混乱。名称仿冒、恶意维护者接管、代理缓存投毒,逻辑类似。单点看都不新鲜,串起来就是流水线级风险。
CI/CD的身份问题更隐蔽。第三方Action直接引用浮动标签,构建令牌权限过大,OIDC短时凭证配置粗糙,缓存跨分支共享,都会扩大爆炸半径。修复方向不神秘:第三方构建步骤固定到提交摘要,令牌最小权限,构建环境隔离,缓存按信任域分区,制品仓库只允许经过准入的制品进入部署。难的是组织协调,不是写一条策略。
治理应把准入做在流水线里,而不是等制品进了生产再补扫描。入口收敛、依赖准入、构建隔离、制品签名、部署校验、运行时监控,这些环节要形成闭环。闭环不意味着每个环节都上重工具。小团队可以先做依赖源收敛和锁文件审查;中大型组织再推进构建证明与部署准入。条件不同,路径不同。
修复决策比漏洞数量更难
修复决策比漏洞数量更难
传递依赖的修复经常卡住。直接依赖可以升级,间接依赖受制于上游;替换库有兼容成本;隔离运行有性能与架构代价。漏洞库的噪声也不小,同一个CVE在不同制品里的实际影响可能完全不同。VEX能缓解噪声,但它依赖厂商和维护者的准确声明。声明不透明时,安全团队只能回到人工研判。
这时指标要克制。依赖数量、签名覆盖率、构建证明覆盖率、漏洞修复周期都有用,但不能单独当成绩。一个团队签名覆盖率高,可能只是签了外层镜像;SBOM条目多,可能只是工具把许可证文件也算了进去。度量要能回答具体问题:某个高危漏洞从发现到部署阻断用了多久?某次构建失败能否定位到依赖变更?某批制品能否在半小时内圈定影响范围?
合同与流程也得跟上。供应商交付SBOM的粒度、漏洞通知时限、VEX声明责任、制品签名验证方式,都应写进采购与运维条款。开源维护者激励不足是长期约束,下游不能把治理成本全压给上游。反过来说,下游如果连最基本的依赖清单和构建证明都不留存,出事后的归因就只能靠猜。
趋势:攻击面正在向开发者工具链迁移
AI生成代码会带来新的依赖引入方式。自动补全给出的包名可能不存在,也可能被抢注;生成式工具推荐的构建脚本,未必经过团队审查。私有包投毒、开发者工具链攻击、凭证泄露后的横向移动,都会更常见。防御重点不是禁掉新工具,而是让工具产物进入同一套准入与证明体系。
软件供应链安全最终是信任边界的设计问题。边界画在包管理器、构建机、制品仓库还是部署网关,决定了治理成本和可观测性。画得太外,内部裸奔;画得太内,流程窒息。更可行的做法是分层设防,保留证据链,接受不完美。签名不是终点,SBOM也不是。能回答“这个制品从哪来、经过了什么、影响了谁”,才算摸到了门。