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 记录完整性和来源。攻击者使用合法依赖执行恶意操作时,还需要内容与行为检查来识别风险。
企业检查清单
- 为六个节点登记现有措施、责任人和最近检查时间。
- 核查开发者、CI 管理员和制品发布账号的 MFA 与权限。
- 确认 CI 凭证的取得、使用、轮换和撤销过程均可审计。
- 检查一次性 Runner 的环境清理、网络出口和缓存隔离。
- 使用真实制品验证部署前的身份、签名和来源策略。
- 演练受影响依赖定位、停止部署、凭证轮换与重新构建。
