题记与说明
- 标题: Maintainers' Guide: Securing CI/CD Pipelines After the tj-actions and reviewdog Supply Chain Attacks
- 作者: Ashish Kurmi(StepSecurity 联合创始人兼 CTO),发表于 OpenSSF Blog(Guest Blog)
- 来源 URL: https://openssf.org/blog/2025/06/11/maintainers-guide-securing-ci-cd-pipelines-after-the-tj-actions-and-reviewdog-supply-chain-attacks/
- 存档日期: 2026-11-03
- 标签: CI/CD 安全, 供应链攻击, GitHub Actions, OpenSSF, 纵深防御, 安全加固
这篇讲什么
OpenSSF 2025 年 6 月发布的维护者加固指南,复盘当年 3 月震动开源圈的 tj-actions/changed-files 与 reviewdog/action-setup 供应链攻击。攻击链分两段:第一阶段,攻击者利用 reviewdog 组织有缺陷的自动化邀请流程混入维护者团队,推送恶意 commit 并把 v1 tag 重定向过去——payload 是一个扫描 runner 内存、把 secrets 打印进 CI 日志的 Python 脚本;第二阶段,用第一阶段顺带偷到的 bot 账号凭证攻入 tj-actions,把 v1.0.0 到 v44.5.1 的每一个版本 tag 全部指向同一个恶意 commit,波及整个开源生态。文末给出五层纵深防御清单:SHA pin 与 allowed-actions 白名单、MFA 与写权限审计、tag/分支保护与变更监控、OIDC 短时凭证 + Environments 审批门、运行时异常检测与日志扫密。
核心观点
- 攻击不是孤立事件,而是级联链:一次入侵直接解锁下一次入侵,CI/CD 在基础安全实践缺失时就是一条脆弱的供应链。这次事件会成为后来者的攻击蓝图。
- tag 重定向是最阴险的一招:你以为 pin 在旧版本上就是安全的,攻击者把所有历史 tag 一并改写——浮动 tag(@v1、@main、latest)等于把运行权交给别人随时改写。
- 最优雅的外泄不走网络:攻击者不连外部服务器,直接拿 GitHub 自己的 workflow 日志当 exfiltration 通道,绕过传统告警;且 commit 未签名、作者伪装成 Renovate bot,签名与声誉工具全部失灵。
- 解法是纵深防御而非单点银弹:CI/CD 必须按生产基础设施对待——不可变引用(全长 commit SHA)、最小权限(GITHUB_TOKEN 细粒度、OIDC 短时凭证)、人为审批门(Environments)、运行时基线监控,四层缺一不可。
最值得记住的 2-3 个金句/数据
- "They updated every version tag, from v1.0.0 through v44.5.1, to point to a single malicious commit." —— 44 个版本 tag 一次全改,"旧版本更安全"的直觉在 tag 可变的世界里是幻觉。
- "Instead of using a remote server to steal secrets, the attacker relied on GitHub's own logs as the exfiltration channel." —— 平台自带功能即可被武器化,检测思路要从"拦外联"转向"看异常"。
- "CI/CD pipelines must be treated as production-level assets and secured with the same rigor." —— 全文一句话版本,也是清单背后的心态转变。
对我的启发
- AI 编程工具:AI 生成的 workflow 天然偏爱
@v1浮动 tag"能跑就行",这正是本次攻击的温床。以后让 AI 写 CI YAML,SHA pin 和permissions: read-all应该写进我的提示词规范;CI 是 AI agent 会实际触碰的生产基础设施,必须用生产标准审。 - Agent 系统:整个攻击链就是一条被击穿的自动化信任链——自动邀请→自动进团队→自动改 tag,没有任何人工闸门。给 agent 配工具与凭证时应照搬文中的对应物:OIDC 短时凭证=agent 的临时最小授权,Environments 审批门=敏感操作的 human-in-the-loop,"任何第三方组件都可能是目标"=agent 工具链的零信任前提。
- 个人知识管理:这篇文章是"事故复盘→根因清单→可执行 checklist"的标准知识形态,可与库里已有归档互相引用:
2026-11-03-github-actions-security-hardening(GitHub 官方 Secure use reference,本清单的权威底本)、2026-11-03-dissecting-xz-utils-backdoor与2026-11-03-xz-backdoor-timeline(同属开源供应链攻击的深度案例),凑成一个小型供应链安全专题。
适合谁读
开源维护者与所有写 GitHub Actions 的人(先照清单检查自己的 workflow);正在给 AI agent / 自动化流水线设计权限模型的人(信任链与审批门的思路直接可迁移);对供应链攻击案例感兴趣的安全学习者——文章短小、结构清晰,是 xz 案例之外又一个必读的当代样本。