プラグインの「コミットSHA固定」を過信しない(Plugin4Shell)
Claude Code・Codex・Copilot・Gemini CLI のプラグイン導入は、固定したSHAに本当にチェックアウトできたかを確かめていなかった。エージェントを修正版に上げ、未修正のツールではプラグインの入手元を絞る。
何が起きる?(AIR Security の公表、2026-09-17〜18)
- プラグインのリポジトリを乗っ取った攻撃者が、固定したSHAと同じ40桁の名前のブランチを作って既定ブランチにすると、
git checkout <SHA>がそのブランチを選び、別のコードが入る(Claude Code・Codex・Copilot) - Gemini CLI は
git checkout FETCH_HEADを使うため、既定ブランチ名をFETCH_HEADにされると同じことが起きる - Claude Code と Codex は自動更新が既定なので、利用者の操作なしに差し替わりうる(ゼロクリック)
- GitHub は40桁16進のブランチ名を拒否するので、GitHub 上のマーケットプレイスはこの手口に当たらない。Bitbucket や自前の git サーバーは通る
やること
- バージョンを確認して上げる: Claude Code 2.1.179 以降、Codex 0.146.0 以降
- GitHub Copilot(公表時点で未修正)と Gemini CLI(修正予定なし)は、GitHub 上か自分で管理するリポジトリのプラグインだけにする
- 入手元を検証できないプラグインは自動更新を切る
- 自作のインストーラーやスクリプトでSHAを固定するなら、チェックアウト後に確かめる
bash
test "$(git rev-parse HEAD)" = "$PINNED_SHA" || { echo "pin mismatch"; exit 1; }注意点
- 攻撃には「プラグインのリポジトリを握られること」が前提。信頼できない作者のプラグインを入れない、という基本は変わらない
- 公表は9月。10/19 に日本語で「速報」として再流通していたので、古いバージョンのまま使っている環境がないか確認する機会にする
- 関連: セキュリティ: clone したリポジトリの .claude/settings.json と .vscode/tasks.json を開く前に確認する、AIコーディング: skills を入れすぎない → 「skill-selector」だけ常駐させ、リポジトリごとに明示的に入れる
出典
- @kotteri_ai · 2026-10-19
- AIR Security: air.security
- CSA Research Note: labs.cloudsecurityalliance.org