Plugin4Shell、ゼロクリックのRCEがClaude Code・Codex・Copilot・Gemini CLIを直撃

主要なコーディングエージェントはいずれも、検証しないまま固定されたプラグインのバージョンを信じているとセキュリティ企業Airが指摘

|6分で読める0
Source code on a developer's screen — Plugin4Shell turns a routine git checkout inside AI coding agents into remote code execution.
Source code on a developer's screen — Plugin4Shell turns a routine git checkout inside AI coding agents into remote code execution.

セキュリティ企業のAirは木曜日、AIコーディングアシスタントを使う開発者のマシンで、利用者の操作を一切必要とせずにリモートコード実行を許す脆弱性を公開しました。同社の調査レポートでPlugin4Shellと名付けられたこの脆弱性は、AnthropicのClaude Code、OpenAIのCodex、GitHub Copilot、GoogleのGemini CLIに影響します。

4社のうち修正を出したのは2社です。AnthropicはClaude Code 2.1.179で、OpenAIはCodex 0.146.0で対処しました。一方でMicrosoftはCopilot向けに何も公開しておらず、Googleはサポートを終了したGemini CLIについて修正しない方針を示しています。

この攻撃はモデルにもエージェントの推論にも触れません。ひとつ下の層、つまりアドオンを実際のノートPCへ届けるマーケットプレイスの配管部分に潜みます。そしてプラグインは、エージェントを動かしているエンジニアと同じ権限で動きます。

要点

  • Airの研究者オル・ネボ氏、ドル・グラナト氏、ニブ・ホフマン氏は、Claude Code、Codex、GitHub Copilot、Gemini CLIに共通して同じ検証手順が抜け落ちていることを突き止めました。
  • AnthropicはClaude Code 2.1.179、OpenAIはCodex 0.146.0で修正しました。MicrosoftはCopilot向けに何も出しておらず、Googleはサポート終了済みのGemini CLIを修正しません。
  • Claude CodeとCodexで既定で有効になっているバックグラウンドのプラグイン自動更新が、攻撃からクリックという条件を取り除いています。

SHAピン留めで終わるはずだった問題

コミットのピン留めが導入されたのは、その代替手段がすでに公然と破られていたからです。根拠の多くはAir自身の先行研究が示しました。同社が信頼されたマーケットプレイスへ意図的に公開した悪意あるスキルは2万6000を超えるエージェントに届き、続く調査では実際に使われていたスキル925件を乗っ取り、13万4000のエージェントに到達しました。業界の答えは「名前を信用しない」ことでした。ブランチやバージョンタグは動かせますが、40文字のコミットハッシュは動かせないからです。

この理屈は妥当です。そして今回まさにその理屈が破られました。ピン留めが保証として機能するのは、誰かが結果を検証する場合だけです。ところがインストールを実行するクライアント側のコードは、結果ではなく要求のほうを確認していました。最も徹底していた企業ほど被害を丸ごと引き受けます。プラグインのソースを精査し、レビュー済みコミットをピン留めし、ハッシュを監査証跡として扱っていた組織ほど、統制のすべてが抜け落ちたその一手順に依存していたからです。

検証はどこで抜け落ちるのか

gitはブランチ名として何を許すかについて、かなり寛容です。参照形式の検証機能は16進数40文字だけの名前も受け付けます。ある文字列が有効な参照であると同時にオブジェクトIDらしくも見えるとき、gitは参照のほうを選び、その衝突を誰も読まない警告へ格下げします。したがってプラグインのリポジトリを握る攻撃者は、ピン留めされたハッシュと一字一句同じ名前のブランチを作り、それをリポジトリの既定ブランチに昇格させればよいことになりま���。エージェントが「期待したコミットで成功した」と報告する裏で、攻撃者が選んだ内容がインストールされます。Claude Code、Codex、GitHub Copilotはいずれもこの手口で破られます。

Gemini CLIは別の継ぎ目から崩れます。ピン留めされたオブジェクトは正しく取得してリポジトリのFETCH_HEADファイルへ書き込むのですが、その後にFETCH_HEADを名前として指定してチェックアウトします。敵対的なリポジトリはその名前を自分の既定ブランチとして自由に名乗れるため、正しく取得したはずのコミットはそのまま破棄されます。

どちらの変種も、たった一つの検証で塞がります。チェックアウト完了後にHEADを解決し、要求したハッシュと突き合わせ、一致しなければ中断することです。肝心なのは、要求した参照ではなく解決された結果を確認する点であり、Gemini版の変種はまさにそこをすり抜けます。

自動更新という増幅装置

インストール時のバグだけでも深刻です。今回がさらに厄介なのは、エージェントが同じチェックアウトを自らのスケジュールで繰り返し実行するからです。Claude CodeとCodexは既定の挙動として、インストール済みプラグインをバックグラウンドで更新します。上流でハッシュが差し替われば、インストール操作も確認画面も、目に見えるイベントも一切なしに伝播します。攻撃者は誰かに何かを追加させる必要すらありません。必要なプラグインはすでに標的のマシンに存在し、すでに信頼されています。

そこから2つの侵入経路が生まれますが、どちらもマーケットプレイスの侵害を必要としません。攻撃者は本当に役立つものを公開して審査を通し、後から中身を差し替えられます。あるいは他人が書いたプラグインの背後にあるリポジトリを乗っ取ることもできます。ピン留めがまさに封じ込めようとしたシナリオです。両方の要素はすでに別々に実証されており、だからこそこの連鎖は机上の話ではなく現実味を帯びます。

2社は修正し、2社はしなかった

Airは6月、協調的開示の枠組みで4社すべてに通知しましたが、反応は大きく分かれました。AnthropicとOpenAIは修正を出しました。Googleは応じず、Gemini CLIはサポート終了だとして研究者にAntigravity環境への移行を案内しています。同環境には、そもそも破るべきマーケットプレイスのピン留め機能がありません。研究者によれば、Microsoftからは最後まで返答がなかったとのことです。

GitHubは影響を否定しています。広報担当者は、同プラットフォームがコミットハッシュに似たブランチ名・タグ名を禁止しているため、この手法は成立しないとThe Registerに説明しました。これに対するAirの反論は、エージェントが利用するのはGitHub上のマーケットプレイスだけではない、というものです。Anthropicのドキュメントは対応バックエンドとしてBitbucketや自己ホスト型gitも挙げており、これらはハッシュ状のブランチ名を普通に受け入れます。MicrosoftがCopilotのフォーチュン500企業での採用率を約90%としていることを踏まえると、未修正のまま残る範囲は小さくありません。

プラグイン統制への含意

居心地の悪い構造的な結論は、どのマーケットプレイスもこの問題を利用者の代わり��直せない、という点です。ピンはクライアント側で評価されるため、マーケットプレイスが掲げる保証は、自社のコードが動いていない場所で執行されることになります。承認済みマーケットプレイスを統制の境界とみなす現在の企業調達の前提は、ここで覆ります。ベンダー中立の標準であるAgent Pluginsのような取り組みは、検証の挙動をベンダー任せではなく仕様として定められる点で助けになるかもしれません。当面の実務的な助言は限られます。Claude CodeとCodexは更新すること、CopilotとGemini CLIについては何がインストールされ、どこにホストされているかを棚卸しすることです。有効な署名を持ったままnpmパッケージ444件を汚染したChainDropワームを追っていた人なら、同じ構図に見覚えがあるはずです。完全性の仕組みは確かに存在し、存在することが執行されていることと取り違えられました。

よくある質問

自分のAIコーディングエージェントはPlugin4Shellの影響を受けますか。

Claude Code、OpenAI Codex、GitHub Copilot、Gemini CLIのいずれかで、マーケットプレイスから入れたプラグインを使っているなら影響を受けます。Claude Code 2.1.179とCodex 0.146.0には修正が入っているため、更新すればこの2つは塞がります。CopilotとGemini CLIには現時点で利用できる修正がありません。

GitHubでホストされたプラグインを使えば安全ですか。

部分的には安全です。GitHubはコミットハッシュの形をしたブランチ名・タグ名を拒否するため、同プラットフォーム上では主要な変種を防げます。ただしAirの研究者は、エージェントがBitbucketや自己ホスト型gitサーバー上のマーケットプレイスにも対応しており、そこでは手口が依然として通用すると指摘しています。GitHubの規則は、別系統のGemini CLI変種には何の効果もありません。

マーケットプレイス側だけで解決できますか。

できません。ピン留めされたコミットは、エージェントがチェックアウトを実行する時点でクライアント側のマシンで解決されます。したがってピンが守られたかを保証できるのはエージェント側の検証手順だけです。マーケットプレイスは許可するgitホストを制限できますが、それは対応構成を狭めるだけで、根本的な欠陥を塞ぐものではありません。

この記事への反応を残してください!

SJ

ディスカッション

ログインして投稿
読み込み中...

関連記事

AIエージェントがRubyGemsに2000超のパッケージを投下、新規登録は4日間停止
Developer Tools

AIエージェントがRubyGemsに2000超のパッケージを投下、新規登録は4日間停止

フォレンジック報告が5月のGemStufferキャンペーンを再構成した。AIエージェントが2000超のgemを投下し、RubyGemsは新規登録を4日間凍結した。

Seung Jung6 日前
GitHubのHydraFusionはモデルを選ばない。ワークフローを組み立てる
Developer Tools

GitHubのHydraFusionはモデルを選ばない。ワークフローを組み立てる

GitHubのProject HydraFusionは、Copilotのコーディング要求ごとに複数モデルの実行計画を組む。単一モデルの手軽さと引き換えに、コストを大幅に下げた。

Seung Jung5 日前
Meta、WhatsApp Businessの設定をMCP経由でClaudeとCodexに開放
Developer Tools

Meta、WhatsApp Businessの設定をMCP経由でClaudeとCodexに開放

MetaがWhatsApp Businessアカウントの初期設定をAIコーディングエージェントに開放しました。WhatsApp Business Tools MCPサーバーにより、Claude CodeやCodexが電話番号の登録からテンプレート、Webhook設定までを担います。

Seung Jung一昨日
企業が自社の非公開ソースコードをAI評価データとして販売し始めた
Developer Tools

企業が自社の非公開ソースコードをAI評価データとして販売し始めた

Specific Labsが消費者向けプロダクト企業とフィンテック基盤の非公開リポジトリをライセンスし、Real-SWEを構築した。独自コードが収集不可能なAI評価データに変わった。

Seung Jung3 日前
OpenAI「自社モデルがJalapeñoの設計を9か月に短縮した」
Tech & Business

OpenAI「自社モデルがJalapeñoの設計を9か月に短縮した」

AIが書いたカーネルがOpenAIの専門家による実装を最大1.8倍上回った。JalapeñoのInferenceXベンチマーク結果が初公開された。

Seung Jung23 日前
LLMのバグ修正は、直した数の10倍も動くコードを壊していた
Developer Tools

LLMのバグ修正は、直した数の10倍も動くコードを壊していた

arXivの研究で、LLM修復ループが正しいプログラムを壊す率は0.261、バグを直す率は0.023だった。著者らはその挙動を駆動する内部方向まで突き止めた。

Seung Jung5 日前