新たなサプライチェーン攻撃により、レビューツールを一切作動させることなくAIコーディングエージェントを騙し、開発者のシークレット情報を盗み出すことが可能になっています。
ASSET Research Groupの研究者らは、GhostCommitと名付けられたこの手法を公表しました。この手法はプロンプトインジェクション命令をPNG画像に密輸することで、コーディングエージェントに.envファイルのシークレットを抜き取らせ、人間によるレビューとLLMによるプルリクエストレビューの両方を完全に回避します。
この攻撃は、現代の開発ワークフローに存在する構造的な盲点を突いています。ASSETが最もアクティブな公開リポジトリ上位300件から6,480件のプルリクエストを調査したところ、マージされたPRの73%が実質的な人間またはボットによるレビューを一切受けていないことが判明しました。
このギャップを埋めているのが、Cursor BugbotやCodeRabbitといったAIレビューツールで、差分を読み取り人間のレビュアーのようにコメントを付けます。GhostCommitは、こうしたツールを打ち負かすことを狙って設計されています。
この攻撃の初期バージョンでは、悪意ある命令をAGENTS.mdという規約ファイルに直接埋め込み、コーディングエージェントに対しリポジトリの.envファイルをASCIIコードポイントとしてエンコードするよう指示していました。
この命令はプレーンテキストだったため、Cursor BugbotとCodeRabbitの両方がマージ前に重大度の高い問題としてフラグを立てていました。
進化版では、ペイロードが分割されています。規約ファイル自体は無害な内容となり、「ビルドの来歴(provenance)」に関する指示のためとして画像ファイルbuild-spec.pngを参照するだけになっています。
実際のエクスプロイト、すなわち.envを1バイトずつ読み取り整数のタプルとしてエンコードせよという命令は、その画像内にレンダリングされたテキストの中に完全に隠されています。テキストベースのレビューツールはPNGを単なるバイナリの塊として扱うため、フラグを立てるべき対象を何も見出せません。
CodeRabbitのデフォルト設定に至っては、そもそも画像ファイルをレビュー対象から除外しています。さらに偽造された事後検証(postmortem)文書が用意されており、規約に根拠がないことを検出するはずの整合性チェックも突破してしまいます。
この罠は、開発者が後日、無関係な機能追加をコーディングエージェントに依頼した際に作動します。エージェントはマージ済みの規約ファイルを読み込み、そこに記されたポインタをたどって画像ファイルにアクセスし、手順を抽出したうえで.envを読み取り、311個の整数からなる「来歴定数」を新しいコードに埋め込みます。
開発者は依頼した機能だけを目にしてコミットしてしまいます。攻撃者は後にこの公開コミット内の整数列を復号し、ファイル内のあらゆるシークレットを復元しますが、整数タプルを認証情報の形式として認識できないシークレットスキャナーはこれを検出できません。
各種コーディングツールでのテストの結果、成否を分ける決定要因は基盤となるモデルそのものではなく、それを包むハーネス(harness)であることが明らかになりました。Cursorは、Sonnet 4.6、Composer-2、GPT-5.5のいずれを使った場合でもシークレットを流出させました。
ASSETが確認したところによると、Antigravityはテストしたほとんどのモデルでシークレットを流出させましたが、Opusを使用した場合だけは例外で、いったんシークレットを書き込んだ後に自ら誤りに気づいて削除する自己修正を行いました。
Claude Codeは、Sonnet、Haiku、Opusのいずれのモデルを使った場合でも一貫してこの攻撃を拒否しており、この結果を左右していたのは生のモデル性能ではなく、安全性を担保する足場(scaffolding)の設計であることを示唆しています。
ASSETは概念実証(PoC)として、4GBのGPUで動作する軽量なGitHubアプリの形でマルチモーダルレビューツールを構築しました。これはテキストやコードと並んで画像もスキャン対象とします。
小型のオープンモデルGemma 4を用いたところ、実際の攻撃50件中49件を検出し、良性のPRに対する誤検知はゼロでした。これは、対策自体は技術的には難しくないものの、まだ実際には導入されていないことを示しています。
翻訳元: https://cyberpress.org/ghostcommit-attack-hides-prompt-injection/