
研究者たちは、AIコードレビュー担当者が決して開くことのないPNGファイルの中に悪意のある命令を隠し込み、リポジトリの機密情報を盗み出すプルリクエストを作成した。
レビュー担当者はその変更を承認してしまう。その後、コーディングエージェントがその画像を読み取り、リポジトリの.envファイルを開き、すべてのキーを、一見無害に見える数字のリストとしてソースコードに書き込む。
「Ghostcommit」の仕組み
この攻撃は、ミズーリ大学カンザスシティ校のASSETリサーチグループによる共同研究であり、Sudipta Chattopadhyay准教授と研究員のMurali Ediga氏がその内容を公開しました。
同グループは今週、GitHubに概念実証(PoC)を公開し、影響を受けるベンダーにこの発見を開示したと述べている。
研究者たちは、この攻撃を、すでに広範に存在するレビューの不備を突いたものと位置付けています。過去90日間にわたり、最もアクティブな300の公開リポジトリにおける6,480件のプルリクエストを調査したところ、マージされたプルリクエストの73%が、実質的な人間によるレビューも、ボットによるレビューも一切行われないままデフォルトブランチに到達していたことが判明しました。

この攻撃の巧妙な点は、悪意のある指示がレビュー担当者が検知できるテキストではないことです。それは画像なのです。
AGENTS.mdファイル(エージェントが自動的に読み取り、プロジェクトポリシーとして扱うようなコーディング規約ファイル)は、一見するとごく普通のビルド管理に関する記述であり、秘密を明かすような内容は一切含まれていない。
単に、docs/images/build-spec.pngという画像を参照しているだけです。このエクスプロイトは、そのPNG内にレンダリングされたテキストの中に潜んでいます。.envをバイト単位で読み取り、各バイトを整数としてエンコードし、その結果をモジュール定数として出力し、コミット前にデコードされた数値が実際のファイルと一致することを確認します。
テキストベースのレビュー担当者にとって、画像は単なるバイナリデータに過ぎません。
CodeRabbitには、画像ファイルをレビュー対象から完全に除外するデフォルト設定が組み込まれています。Bugbotは検出結果を一切返さなかったのです。
研究者たちは、PNGファイルに「malicious prompt injection」という文字列や、.envを読み取るよう明示的に指示する内容まで埋め込んだにもかかわらず、依然として問題なしと判定されました。
50 行の偽の「出所検証ツール」と捏造されたインシデント事後分析報告書により、コンベンションには十分な裏付けコードが与えられ、レビュー担当者の最後の防衛線である、裏付けとなるコードがないコンベンションにフラグを立てる整合性チェックを突破することができました。
盗難はその後に行われる。
ペイロードは、無関係なセッションで開発者がコーディングエージェントに、トークン追跡モジュールなどの日常的なものを依頼するまで、休眠状態のままです。
エージェントは起動時にマージされた AGENTS.md を読み込み、イメージへのポインタをたどり、.env を開き、先頭付近に「プロヴェナンス」定数を含む要求されたモジュールを書き込みます。
あるエンドツーエンドの実行において、Claude Sonnetを駆動するCursorは最初の試行でこれを成功させ、生成された定数は311個の整数からなり、これらを1バイトずつデコードすると.envファイル全体が再現された。
開発者は要望通りの機能を確認してコミットし、攻撃者は公開されたコミットからその数値を復号します。秘密情報をスキャンするツールは、Pythonの整数タプルをASCII文字列に戻して検証するものが一切ないため、これに気づくことはありません。

(ASSET Research Group)
古くからの手口、新たな死角
AIシステムが実行するための指示を画像内に隠す手法は、決して新しいものではありません。
2025年、 Trail of Bitsの研究者であるKikimora Morozova氏とSuha Sabi Hussain氏は、より巧妙なバージョンを実証しました。すなわち、フル解像度では無害に見える画像が、AIシステム自身のダウンサンプリングパイプラインによって再サンプリングされると、読み取り可能なプロンプト注入テキストとして現れるというものです。この手法は、Gemini CLIのようなツールを欺くことに成功しました。
さらに最近では、「Gaslight」と呼ばれるmacOS向けマルウェアが、バイナリ内に偽のシステム障害メッセージを埋め込み、別のAIリーダーを標的にして、AIを活用したマルウェア分析ツールに自身の分析を中止させようと試みました。
今年初め、Manifold Securityの私の研究チームは、AIコードレビューツールが偽装されたGit IDに騙され、画像を一切使用せずに悪意のあるプルリクエストをマージしてしまったことを実証しました。
Ghostcommitの画像には、そのような偽装は一切含まれていません。情報漏洩の指示は、PNGファイル内の平文として読み取れる形で格納されています。
これが機能する理由は、隠されたシグナルではなく、むしろ「死角」にある。つまり、レビュー担当者はそのファイルを一切開かないからだ。
決定を下すのはツールであり、モデルではない
最も重要な発見は、危険が実際にどこにあるかという点に関するものです。
それぞれ10回ずつ実行した結果、モデルよりもコーディングツールの影響の方が大きかった。
Cursor と Antigravity コーディングツールはどちらも画像に従い、Sonnet、Gemini、GPT-5.5 などを使用した際に .env ファイルを漏洩させました。
AnthropicのClaude Codeは、同じSonnetの重みを使用し、同じ規約を読み取ったにもかかわらず、明示的な拒否の説明を述べ、拒否しました。また、研究者がテストしたすべてのモデルにおいて拒否しました。
Antigravity環境下では、Opusは秘密情報を書き出したものの、その後ソーシャルエンジニアリングの手口に気づき、処理を完了する前にそれを削除した。同じモデルでありながら正反対の結果となったのは、それを包み込むハーネスによって決定されたのである。
これは、単一の修正策ではなく、多層的な防御の重要性を示唆している。
研究者たちは、その防御層の一つを自ら構築した:
「この盲点は構造的なものであるため、それを塞ぐレビューアを構築しました。それは、単一の4GBグラフィックカード上で動作するGitHubアプリとして展開される、マルチモーダルなプルリクエスト防御システムです」と研究者らは記している。
「これは、不可視文字のスキャン、コミットされたコードの構造のスキャン、規約テキストに対するLLMによる解析、そして極めて重要な点として、画像に対するLLMによる解析を組み合わせています。」
これまでに見たことのない80件のプルリクエストを対象とした実証実験では、画像ベースの亜種を含め、攻撃がすり抜けたのはわずか1件のみであり、30件の正当なプルリクエストのいずれからも誤検知は発生しませんでした。
研究者らが指摘するように、「これは添付ファイルを開くレビューアに似ていますが、今日のレビューアはそうはしません」。
もう一つの層は実行時です。ペイロードが配信される前にそれを捕捉しようとするのではなく、エージェントが、本来触れる理由のない認証情報ファイルを読み込んだ際に実際に何を行うかを監視するものです。
出典:https://www.bleepingcomputer.com/news/security/ghostcommit-hides-prompt-injection-in-images-to-fool-ai-agents-steal-secrets/




Comments