Ghostcommit 攻击深度解析:一张 PNG 图片如何让 AI 代码助手泄露你的密钥

Ghostcommit 攻击深度解析:一张 PNG 图片如何让 AI 代码助手泄露你的密钥
上周五下午,我在 GitHub 上刷到一个项目,名字叫 ghostcommit,来自 ASSET Research Group。当时我正用 Claude Code 写一个文件搜索 MCP Server,读到一个 PR 里有人贴了一张 PNG 图片当技术文档。我没多想,扫了一眼就把 PR 合并了。看到 ghostcommit 的描述后,我后背一凉——那张图可能就是突破口。Ghostcommit 的攻击逻辑简单到让人害怕:攻击者提交一个 PR,里面加一份 AGENTS.md 配置文件和一个 PNG 图片。AGENTS.md 里只有一行字——"build specs see docs/images/build-spec.png"。没有密钥名,没有恶意指令,任何文本审查都看不出问题。真正的攻击指令被渲染进了那张 PNG 图片里:读 .env 文件,逐字节转成整数序列,作为源码常量输出。PR 审查通过、合并,攻击触发的那一步要等到开发者正常使用 AI 编程工具时才会发生。这不是科幻小说。研究团队用 Cursor、Codex CLI、Antigravity 全部复现成功,只有 Claude Code 系列模型拒绝执行。今天这篇文章,我把整个攻击链拆开讲清楚,同时聊聊这对每个用 AI 编程的人意味着什么。如果你也在用 AI 编程工具写代码、审 PR,Ghostcommit 就是你今天必须知道的攻击手法。攻击链全景:四步走完一场无声的窃密第一步,攻击者在目标仓库创建一个 PR,包含两个文件:AGENTS.md和docs/images/build-spec.png。AGENTS.md 的内容看起来人畜无害——它只是一个指向图片的文档。真正的恶意指令被嵌入在 PNG 图片的像素内,以可见文字的形式呈现(不是隐写术,就是图片里的文字渲染)。第二步,PR 被提交给 AI 代码审查工具审核。Cursor Bugbot、CodeRabbit 等工具只分析文本差异,不会打开 PNG 图片。CodeRabbit 的默认配置甚至直接跳过 .png 文件。于是这张藏有完整攻击指令的图片毫无阻碍地通