
Claude Code GitHub Action 缺陷可劫持仓库
研究人员发现,Anthropic 的 Claude Code GitHub Action 存在缺陷,攻击者只需打开一个 GitHub issue,就可能接管运行该 action 的公开仓库。该问题已在 claude-code-action v1.0.94 修复;建议立即升级,并审计所有允许无写权限用户或 bot 触发 Claude 的工作流,避免暴露秘密和可用于外泄的工具。
一名安全研究人员在 Anthropic 的 Claude Code GitHub Action 中发现一个缺陷,攻击者只需打开一个 GitHub issue,就能接管运行该 action 的脆弱公开仓库。由于 Anthropic 自己的 action 仓库也使用相同的工作流,实际攻击本可能把恶意代码推送进 action 本身,并进一步影响那些拉取它的下游项目。
GMO Flatt Security 的 RyotaK 在 1 月向 Anthropic 报告了这个核心绕过问题,Anthropic 在四天内修复,并在春季继续加固;修复已包含在 claude-code-action v1.0.94 中。Anthropic 将这些问题按 CVSS v4.0 评为 7.8,并支付了 bug bounty。
Claude Code GitHub Actions 会把 Claude 放入 CI/CD 流水线中,用于整理 issue、添加标签、审查 pull request,或运行 slash commands。默认情况下,该工作流会获得对仓库代码、issues、pull requests、discussions 和 workflow files 的读写权限。由于权限范围很大,该 action 原本应当严格限制谁可以触发它:只有具有写权限的用户。
但触发检查存在漏洞。它会放行任何名字以 [bot] 结尾的 actor,前提是假设 GitHub Apps 是管理员安装的可信对象。问题在于,任何人都可以注册一个 GitHub App,将其安装到自己拥有的仓库上,并使用其 token 在任何公开仓库中打开 issue 或 pull request。action 看见“这是一个 bot”,就让攻击者的内容通过。tag 模式还有额外检查来确认 actor 是真实人类;agent 模式没有这个检查,因此处于暴露状态。
从这里开始,攻击者利用间接 prompt injection,也就是把指令埋在 AI 会读取的内容中,让模型跟随这些指令而不是它的实际任务。RyotaK 写了一个 issue,其正文看起来像一条错误信息,然后不断调整提示词,直到 Claude 会通过运行埋在其中的命令来“恢复”。攻击目标是 /proc/self/environ,这是 Linux 中保存进程环境变量的文件,其中也包含 secret。Claude Code 会阻止直接读取,但 RyotaK 还是绕过了防护,让 Claude 把这些值写回 issue 中,供攻击者获取。
这些变量里真正有价值的是 GitHub Actions 用来请求 OIDC token 的凭据对;OIDC token 是一种签名令牌,用来证明“我是这个仓库中运行的这个工作流”。Claude Code 会把该 token 与 Anthropic 的后端交换,换取一个具有写权限的 Claude GitHub App installation token。窃取这些凭据并重放交换流程,就能获得对目标仓库代码、issues 和 workflows 的写权限。如果把它对准 claude-code-action 仓库本身,就可能污染下游项目拉取的 action。
RyotaK 还指出了一条更温和的路径,甚至不需要 bot 伪装。Anthropic 自己的 issue triage 示例工作流随附 allowed_non_write_users: "*",这允许任何人触发它,而 Anthropic 的文档本身已经把这种设置标为高风险。更糟的是,Claude 会把任务摘要发布到工作流运行的公开 summary 面板,这本身就是一个现成的数据外泄渠道。许多仓库复制了这个示例,也继承了这个缺口。
还有一种路径适用于攻击者能够编辑 issue、但不能自己触发 Claude 的情况:在受信任用户的 issue 已经触发工作流之后、但在 Claude 读取之前,修改该 issue,payload 就会以“受信任”输入的身份进入流程。
应当怎么做?更新到 claude-code-action v1.0.94 或更高版本。然后审计任何允许无写权限用户或 bot 触发 Claude 的工作流:如果它在处理不受信任的输入,不要向其提供 Anthropic API key 和 GITHUB_TOKEN 之外的任何 secret,并移除可用于外泄的工具和权限。
这并非理论问题。相同的组合——AI issue triager、广泛权限以及 prompt injection——此前已经造成过一次真实的供应链事件:
2 月,一条带有 prompt injection 的 issue 标题针对 Cline 的 claude-code-action triage 工作流,导致攻击者窃取了一个 npm publish token,并推送了未经授权的 [email protected]。该恶意版本只强制安装了一个单独的、非恶意的 AI agent,大约八小时后被撤下,但同样的攻击链完全可能向所有更新者分发真正的恶意软件。
随后,名为 “HackerBot-Claw” 的自主 bot 在 2 月下旬持续探测 Microsoft、Datadog、CNCF 项目及其他目标中的 GitHub Actions 配置错误;不过当它试图通过一个被污染的配置文件对基于 Claude 的审查器实施 prompt injection 时,Claude 识别并拒绝了该尝试。
目前没有公开迹象表明,污染 Anthropic 自己 action 的这条具体路径曾在真实目标中被使用;RyotaK 只在自己的测试仓库中证明了它的可行性,并且他谨慎地区分了上面那些确实被利用过的变体。
RyotaK 表示,他现在已经报告了大约 50 种绕过 Claude Code 权限系统并运行命令的方法,这是 AI 编程代理中持续出现的 prompt injection 缺陷的一部分。prompt injection 仍然没有被解决;而拥有真实工具和真实 token 的 agent,最终能被推动到的范围,取决于它所拥有的权限。