Claude Code Action:盲目信任「机器人」账号,打开供应链攻击通道
研究者发现 Claude Code GitHub Action 会信任任何以 [bot] 结尾的触发者,使自行注册的 GitHub App 得以在公共仓库上触发 agent 模式工作流,并将提示注入与 OIDC 令牌窃取串联。已在 v1.0.94 修复。
这是什么?
2026 年 6 月 1 日,GMO Flatt Security 的 RyotaK 发布了《Poisoning Claude Code: One GitHub Issue to Break the Supply Chain》,记录了 Claude Code GitHub Action 权限模型中的一处缺陷——该工作流由 Anthropic 提供,用于将 Claude 集成进 CI/CD(工单分类、打标签、代码审查、斜杠命令)。核心发现是:任何注册了自己 GitHub App 的攻击者都能绕过该 Action 的写权限校验,使不受信任的内容进入一个本应只处理可信输入的工作流。与间接提示注入串联后,该绕过可导致用于签发特权仓库令牌的凭据被窃取——而由于该 Action 自身的仓库也运行着一个易受攻击的工作流,攻击可进一步波及所有下游依赖它的项目。
RyotaK 于 2026 年 1 月 12 日向 Anthropic 报告了此绕过;Anthropic 四天内修复,并在春季进一步加固,相关修复随 claude-code-action v1.0.94 发布。Anthropic 依 CVSS v4.0 将这些问题评为 7.8 分并支付了漏洞赏金。文章发布于公开披露之后,研究者指出,同一模式的错误配置变体在文章发表前就已在真实环境中被利用。
工作原理
默认情况下,该工作流对仓库的代码、工单、拉取请求、讨论和工作流文件拥有读写权限。由于权限较广,该 Action 本应严格限定触发者——只允许具有写权限的用户。这一校验位于 checkWritePermissions 函数中,它对任何名称以 [bot] 结尾的触发者返回 true,其假设是 GitHub App 都是管理员安装的可信实体。
但在公共仓库上这一假设并不成立。任何人都可以注册一个 GitHub App,将其安装到自己拥有的仓库上,再用它的安装令牌在任意公共仓库上创建工单或拉取请求——GitHub 会赋予 App 对公共资源的隐式访问权。该 Action 看到一个以 [bot] 结尾的触发者,便放行了攻击者控制的内容。tag 模式带有额外的 checkHumanActor 校验;agent 模式在当时则没有。
在此之后,攻击者依靠间接提示注入——将指令藏入代理会读取的内容中,使模型转而执行这些指令而非其本职任务。在已公开的概念验证中,注入文本被构造成让代理误以为读取失败,从而通过执行内嵌命令「恢复」,进而读取 /proc/self/environ 以提取运行器的环境变量。真正关键的值是 GitHub Actions 用于申请 OIDC 令牌的一对凭据;该令牌会被换取为具有写权限的 Claude GitHub App 安装令牌。窃取这对凭据、重放该交换过程,即可获得对目标代码与工作流的写权限。将其指向该 Action 自身的仓库,毒害便向下游扩散。本文不复现任何可用的攻击载荷;重点在于信任边界的失效,且研究者仅在自己的测试仓库中验证了整条链路。
一种更简单的变体完全绕过了「机器人」这一环节:随附的示例工单分类工作流设置了 allowed_non_write_users: "*",而代理会把任务摘要发布到运行记录的公开摘要面板中——这是一条现成的数据外泄通道,被大量复制粘贴的部署所继承。
为什么重要
这是代理式 CI/CD 威胁模型的具体化。一个同时(1)摄入不受信任的 GitHub 内容、(2)持有密钥与令牌、(3)能通过工具执行操作的工作流,正是致命三要素与代理二则所警告的危险组合——而这里三者同处于一个 Action 之中。该绕过把「仅可信输入」的设计变成了「任何网民」的攻击面,影响半径不是一个仓库,而是某个广泛使用的 Action 之下的整个依赖图,连维护者自己的仓库也在其中。它与「Comment and Control」模式(PR 标题与工单正文在三家厂商处泄露 GitHub Actions 密钥)以及经由 Read 工具的环境泄露(以另一条路径到达同一个 /proc/self/environ 文件)一脉相承。教训反复出现:基于字符串模式的身份判断不等于授权,而只要一个持有真实令牌的代理去读取攻击者可控的文本,提示注入问题就仍未解决。
防御措施
- 升级到 claude-code-action v1.0.94 或更高版本。 该修复为 agent 模式加入了人类触发者校验,默认关闭运行摘要通道,对
gh进行封装以拦截可用于外泄的参数,并从子进程中清除环境变量。 - 审计所有允许无写权限用户——或机器人——触发代理的工作流。 若其处理不受信任的输入,除最小必要外不要暴露任何密钥,并移除可用于外泄的工具或权限(
WebFetch、任意Bash、git push,乃至带 URL 参数的gh issue view)。 - 落实「二则」。 绝不让同一工作流同时读取不受信任的输入、持有敏感凭据并对外执行操作。去掉其中一环——固定任务、剥离密钥,或将写操作置于人工确认之后。
- 将触发者身份视为数据,而非授权。
[bot]后缀、作者名或「已验证」徽章都是可伪造的上下文;应在服务端强制执行真实的权限与来源校验。 - 采用以隔离为先的 CI/CD 代理架构。 参见我们对 GitHub Agentic Workflows 安全架构的报道——无密钥代理、工作流防火墙、暂存并审核后的写入——将其作为结构性解法,而非提示层面的补丁。
状态
| 项目 | 详情 |
|---|---|
| 披露者 | RyotaK,GMO Flatt Security |
| 报告 / 首次修复 | 2026-01-12 / 2026-01-16(四天) |
| 发布 | 2026-06-01 |
| 受影响组件 | claude-code-action(agent 模式 + 示例工单分类工作流) |
| 修复版本 | claude-code-action v1.0.94 |
| 严重性 | CVSS v4.0 7.8(高),据 Anthropic |
| 已被利用的变体 | Cline 的分类工作流(窃取 npm 令牌,2026 年 2 月);无公开迹象表明毒害该 Action 的路径命中过真实目标 |
这是一处已披露并已修复的 CI/CD 集成漏洞类别。组件名称与数据均引自上述 GMO Flatt Security 文章、The Hacker News 及 Anthropic 的修复提交。