返回安全研究

CI/CD 攻击面实战:从源码到运行产物的纵深防御

软件供应链安全专题 · EP.04 · 2026-08-28

上海见形信息科技有限公司 · 灵御(Aegis)安全实验室

CI/CD 的身份与信任关系

代码从开发者工作目录进入生产环境,会经过仓库权限、依赖来源、构建脚本、Runner、制品仓库和部署平台。每个环节都依赖特定身份与配置,攻击者可以利用其中的授权,把恶意内容送入后续过程。

Codecov、3CX、xz-utils 等供应链事件说明,开发工具、构建环境与发布渠道需要纳入同一份安全检查清单。Rust arrayref 依赖投毒进一步说明了编译阶段的代码执行风险。

六个攻击节点

节点关键身份与资源主要风险
源代码仓库开发者、维护者、仓库管理员账号失陷、恶意 PR、发布权限变更
依赖图包管理器、lockfile、私有镜像名称仿冒、维护者投毒、来源替换
CI 配置与脚本CI 系统账号、工作流、secrets参数注入、权限扩大、凭证外泄
构建机与 Runner执行镜像、任务凭证、缓存镜像污染、跨任务影响、异常出站
制品存储制品仓库、签名授权、版本索引版本替换、摘要变化、签名身份被盗用
部署与运行Kubernetes、部署账号、准入策略镜像替换、策略绕过、运行行为异常

源代码审查需要连接到最终制品:审查通过的 commit、构建使用的输入、签名对象和生产运行的镜像摘要应能互相追踪。

各节点的纵深防御

源代码仓库

发布账号和仓库管理员启用 FIDO2 / WebAuthn 等防钓鱼 MFA。主分支保护、强制 code review、CI 配置变更审批与发布授权分别设置。异常登录、权限修改和非常规发布需要进入告警系统。

依赖与镜像来源

关键依赖通过受控镜像或代理获取,保留来源、摘要、版本与获取记录。SCA、依赖差异审查、恶意包检测和维护者变化检查共同使用。新增依赖与来源例外需要责任人、有效期和审批记录。

CI 配置与凭证

对来自 PR、issue、分支名和其他外部输入的内容执行参数检查。低信任任务使用受限令牌,发布凭证仅在需要的任务中提供。工作流变更需要独立审查,日志按允许字段输出并处理敏感信息。

Runner 与构建行为

构建使用一次性 Runner,限制任务间共享目录、缓存与凭证。Runner 镜像保留版本与签名记录,执行过程中监控异常子进程、系统文件修改和出站连接。

依赖安装脚本与 Rust 过程宏可以在构建期间执行代码,网络出口和凭证范围必须按任务限制。任务结束后清理执行环境,并保存必要的审计证据。

制品仓库与签名

容器镜像、二进制和 SDK 以摘要标识。签名、SBOM、Provenance 与制品对应保存。签名密钥或签名授权通过 KMS、HSM 或支持短期身份的签名服务管理,验证方检查允许的身份与来源。

部署与运行

准入策略检查镜像仓库、摘要、签名、发行者和来源声明。验证失败时阻止发布。运行时继续监控网络访问、进程和凭证使用,检查实际行为是否符合服务职责。

依赖投毒场景中的检查顺序

步骤需要查询的证据可执行的控制
维护者身份被接管登录、令牌授权和发布记录MFA、最小发布权限和异常告警
新版本加入隐藏依赖包内容、依赖差异与 lockfile新依赖审核、来源限制和包分析
编译阶段执行载荷进程、文件和网络记录任务隔离、出站限制和行为检测
构建生成污染制品制品摘要、SBOM 和测试结果内容检查、来源验证和独立发布审批
合法渠道发布制品签名身份、发布任务和授权检查身份与构建输入的关联
下游部署准入决策与运行镜像摘要验签、来源策略和运行监控

一次性 Runner 限制任务之间的影响范围。签名与 Provenance 记录完整性和来源。攻击者使用合法依赖执行恶意操作时,还需要内容与行为检查来识别风险。

企业检查清单

  1. 为六个节点登记现有措施、责任人和最近检查时间。
  2. 核查开发者、CI 管理员和制品发布账号的 MFA 与权限。
  3. 确认 CI 凭证的取得、使用、轮换和撤销过程均可审计。
  4. 检查一次性 Runner 的环境清理、网络出口和缓存隔离。
  5. 使用真实制品验证部署前的身份、签名和来源策略。
  6. 演练受影响依赖定位、停止部署、凭证轮换与重新构建。

相关研究与参考资料