すべての投稿に戻る
公開日 · 著者 Renaud Deraison

git status が相手のコードを実行した

2026 年 9 月 2 日、Manifold Security が GitSpawn を公開しました。コマンドラインのコーディングエージェント 7 種にまたがる 8 件の欠陥で、リポジトリ自身の .git/config が開発者のマシン上でコマンドを実行させるというものです。エージェントがブランチを確認するために git status を走らせ、git がインデックスを更新し、リポジトリが選んだコマンドがログイン中のユーザーの権限で、サンドボックスの外で、信頼の確認ダイアログより前に、そして一つのツールではログインよりも前に実行されます。プロンプトもツール呼び出しもモデルのターンもありません。Bromure Agentic Coding はこの経路にパッチを当てるのではなく、経路の先にあるマシンそのものを移します。

あなたは何も入力していないし、何も承認していません。エージェントは起動を終えても いなかったし、そのうち一つのツールではログインすらしていませんでした。誰かが送って きたフォルダがあなたとしてコマンドを実行し、それを実行したのは git です。

業務委託先が仕事を仕上げ、プロジェクトディレクトリの zip を共有フォルダで送ってきま す。解凍して cd で入り、全体を把握するためにコーディングエージェントを起動します。 エージェントはまず、これはどのブランチで何が変更されているかを git に尋ねます。攻撃は それで全部です。

2026 年 9 月 2 日、The Hacker News が Manifold Security の公開情報を報じました。 コマンドラインのコーディングエージェント 7 種にまたがる 8 件の欠陥で、GitSpawn という 名前で公表されています。影響を受けたツールを合わせると GitHub のスター数は 50 万近く、 Claude Code だけでも 月間 npm ダウンロード数は 7,700 万を超えています。 8 件のうち 4 件は、Manifold が 9 月 1 日に再テストした時点でもリポジトリ由来のコマンド を実行し続けていました。

値がコマンドそのものである性能設定

core.fsmonitor は、巨大なリポジトリを扱う人のための git のオプションです。何が変わっ たかを知るためにツリー全体を歩く代わりに、git は外部の補助プログラムを呼び出して尋ねる ことができます。この設定の値がそのままコマンドです。git はそれをリポジトリ自身の .git/config から読み、インデックスを更新するたびに実行します。つまり git status でも、git diff でも、あらゆるツールが依存する配管部分でも実行されます。

Manifold が調べたほぼすべてのエージェントは、起動時にこれらのコマンドを走らせてプロジェ クトのコンテキストを集めており、そのどれもが先に .git/config を見てはいませんでした。 つまりリポジトリがコマンドを指定し、git がそれを実行します。研究者の言葉によれば、それ は「ログイン中のユーザーの完全な権限で、サンドボックスの外で」実行されます。OpenAI も Codex 版に関する自社のアドバイザリで、この補助プログラムは「Codex のコマンドサンドボッ クスの外で、ユーザーの承認プロンプトなしに動作する」と述べています。

git clone はこれを一切運びません。クローンが転送するのはオブジェクトと ref であり、 コピー元リポジトリのローカル設定は手元に残ります。したがって汚染されたプロジェクトは .git ディレクトリを保ったままファイルとしてあなたに届く必要があります。zip アーカイブ、共有ドライブ、同期フォルダ、USB メモリです。Manifold が挙げた経路は、 コンサルタントや顧客や同僚が仕事を受け渡すやり方そのものであり、プルリクエストが一つも 介在しない唯一の配送経路です。敵対的なリポジトリに対する git 自身の防御である safe.directory は、そのリポジトリが他人の所有かどうかを調べます。解凍したのはあなた なので所有者もあなたであり、この防御は何も言うことがありません。

タイミングは、各エージェント自身の保護を一歩遅らせます。Claude Code と Hermes Agent で は、ペイロードはワークスペースの信頼確認ダイアログより前に発火します。まさに 「このディレクトリを信頼しますか」と尋ねるために存在するダイアログです。Qwen Code では ユーザーが認証を済ませる前に発火し、Grok Build では最初のキー入力で発火します。

GitSpawn — 受け渡しからシェルまでフォルダが届くzip、共有ドライブ、同期フォルダ、USB —.git/config はそのままエージェントが起動コンテキストを収集:git status · git diffgit がインデックス更新リポジトリ自身の設定を読むcore.fsmonitor = …<相手のコマンド>あなたのユーザー、環境、あなたのホームまだ起きていなかったこと信頼の確認ダイアログClaude Code,Hermes AgentサインインQwen Code は認証より前に発火する何かを入力することGrok Build は最初のキー入力で発火モデルツール呼び出しもターンもなく、残す記録もない上段のゲートはすべてエージェント起動シーケンスの一段階です。コマンドは、シーケンスがそこへ届く前に走りました。
連鎖の全体と、それが完了した時点でまだ起きていなかった四つのこと。リポジトリの .git/config が core.fsmonitor にコマンドを指定し、エージェントがブランチを知るために git status を走らせ、git がインデックスを更新して補助プログラムを呼び出します。それはログイン中のユーザーとして、Claude Code と Hermes Agent では信頼確認ダイアログより前に、Qwen Code では認証より前に、Grok Build では最初のキー入力で実行され、この一連の流れのどこにもツール呼び出しもモデルのターンもありません。

8 件の指摘、7 つのエージェント、うち 4 件は未修正

半分は修正済みです。goose 1.44.0 には CVE-2026-72718(CVSS 7.0)の修正が 入っています。OpenAI は CVE-2026-19592 に対して Codex CLI 0.131.0 と 26.519.x のデスク トップビルドを出しました。Cursor も自社の亜種にパッチを当てました。Manifold は Claude Code の core.fsmonitor 経路を 2.1.193 で確認し、Anthropic は 2.1.196 でそれを塞ぎまし たが、アドバイザリは公表していません。Manifold は、Claude Code に関する 2 件の指摘の どちらも npm のアドバイザリ記録に現れていないと述べています。

残り半分は動いていません。Hermes Agent には CVE(CVE-2026-71963)と、6 回の連絡試行の のちも未トリアージのままの非公開アドバイザリがあります。Qwen Code のメンテナは 7 月 7 日に報告を受理しましたが、0.22.3 は今もコマンドを実行します。Grok Build も実行し続けて います。そして Claude Code には二つ目の経路があります。ultrareview コマンドを通じ たもので、別の git 設定キーを悪用し、2.1.252 の時点でもまだ生きていました。Manifold は 再利用可能な攻撃テンプレートを配ることを避け、そのキー名を伏せました。

Anthropic は最初の経路を 3 日で修正しました。この欠陥の類型は、同じ製品の同じファイルの 中の別のキーを通って、その修正を迂回しました。

これは git の実行面であり、git にシェルアウトするあらゆるツールが受け継ぐものです。しか も git には、値がコマンドであってそれを代わりに実行してくれる設定が一つならずあります。 ページャ、エディタ、SSH コマンド、フックのパス、diff とフィルタのドライバ、そしてシェル エスケープで始まるエイリアスは、いずれもコマンド値を取ります。いま各ベンダーは、時間と ともにキーが増えていく設定スキーマを相手に、そのうちどれが起動経路からリポジトリの手に 届くのかを、キーごとに洗い出さねばなりません。Manifold が推奨する修正、すなわちバック グラウンドのコンテキスト処理中に git 設定をサニタイズし core.fsmonitor を無効化すると いう対策は、名前空間を相手にした拒否リストの維持です。研究者たちは、報告書が名前を挙げ た数より多くのエージェントで同じパターンを見つけています。

これを捕まえられたはずの制御は、実行地点より下流にある

慎重なチームが今日コーディングエージェントに載せているものを並べてみます。ツール利用時 の権限確認、ワークスペースの信頼、コマンドを実行前に検査するフック、セッションをコンプ ライアンスのバックエンドへ送るトランスクリプト用エンドポイント、そして権限判断とバイパス のための OpenTelemetry。

そのすべてがエージェント自身のループに、つまりエージェントが行うと決めたツール呼び出し か、モデルが取ったターンに紐づいています。GitSpawn はそのどちらも生みません。ペイロード を実行するプロセスは git であり、エージェントが自分の身支度のために呼び出したもので、 コマンドはエージェントが一度も読んでいないファイルから来ます。承認すべきツール呼び出しは なく、発火すべきフックもありません。エージェントのトランスクリプトが SIEM に届くのを見て いるチームには、ふつうに始まって何も映さないセッションが見えるだけです。これは Anthropic が Compliance API を出したときに書い たのと同じ死角です。モデルに届いたものに紐づいたログは、モデルが相談される前に走ったもの を見ることができません。

コマンドは実行されます。答える価値のある問いは、それが何を見つけるかです。

ホームディレクトリに展開した場合git status → core.fsmonitor ヘルパーフォルダが選び、あなたとして実行されるディレクトリ一つ分の距離にあるもの~/.ssh/id_ed25519ANTHROPIC_API_KEY, AWS_SECRET_ACCESS_KEY~/.git-credentials, ~/.aws, ~/.kube/config~/.zshrc — 次回ログインへの永続化外向き: ふつうの開発ツールからのふつうのポートへのふつうの接続エージェント自身のログには 1 行もないフォルダは未信頼。着地したアカウントは信頼済みだった。Bromure ワークスペースで開いた場合git status → core.fsmonitor ヘルパーやはり走る — ubuntu として、ゲスト内で使い捨て Linux VM · フォルダより前に起動秘密鍵のバイトはない — ホストの ssh-agent が署名env と設定の資格情報はすべておとり (brm_…):80 と :443 はホストプロキシへ転送、無効化不可外向きファイアウォール: 既定で拒否 → 第二段なしおとりがスコープ外へ → 451、VM 一時停止、ワークスペースに印、再起動には消去が必要どのプロセスの要求にも 1 行が残るコマンドはやはり走る。ただ、そのために作られた場所で。
同じフォルダ、同じ git status、しかし別のマシン。あなたのノート PC では補助プログラムはあなたとして走り、SSH 鍵とクラウド資格情報からディレクトリ一つ分の距離にあり、その外向き接続はごく普通の開発ツールのごく普通の接続に見えます。Bromure のワークスペースでは、フォルダが存在するより前に起動した VM の中で ubuntu として走ります。盗むべき秘密鍵のバイトはなく、資格情報があるはずの場所にはおとりがあり、外に出るすべてのバイトはホストが所有し記録する線の上を通ります。

走らせて、何を見つけるか見てみる

Bromure Agentic Coding は、ワークスペースごとに Apple のハイパーバイ ザ上で動く専用の Ubuntu VM を与えます。エージェントも、その git も、そのパッケージマネー ジャも、そしてその三つが起動するものすべてもゲストの中に住みます。委託先の zip をワーク スペースに落とし、補助プログラムを発火させ、攻撃者にすべてを与えてください。信頼確認の 前でも、認証の前でも、望むならゲスト内での root 権限でもかまいません。

SSH 鍵を読む。 読むべき鍵がありません。ワークスペースの秘密鍵はあなたの Mac に留ま り、VM には vsock 経由でホスト側のエージェントへ橋渡しされた SSH_AUTH_SOCK が渡されま す。このプロトコルには「このチャレンジに署名せよ」という要求はありますが、「鍵を渡せ」と いう要求はありません。

環境から資格情報をさらう。 すべて揃っており、検証ツールが期待する形をしていて、その すべてがおとりです。ANTHROPIC_API_KEY には偽の sk-ant-api03-brm-… が入っており、 ~/.git-credentials~/.aws/config~/.kube/config~/.docker/config.json も同様 です。本物の値は暗号化されてあなたの Mac にあり、プロキシはリクエストが VM を出たあとで、 しかもその資格情報が発行された先のホスト宛てのときにだけ、それを線の上で差し替えます。 これを切るスイッチはありません。アプリにおける資格情報の仕組みそのものです。

第二段をダウンロードする。 補助プログラムはローダーで、本物のペイロードを取ってくる だけの数百バイトです。その取得はワークスペースの外向きファイアウォールにぶつかります。 一致しないトラフィックを Deny にすれば、VM は列挙したホストにだけ到達し、それ以外に は届きません。これは二か所で強制されます。仮想スイッチが宛先 IP と DNS から拾ったホスト 名で、すべてのプロトコルにわたって照合し、プロキシが TLS のサーバー名で、そして web ルールでは HTTP メソッドでも再度照合します。代わりにパッケージレジストリへ手を伸ばした ローダーは、サプライチェーンのパイプラインに出会います。そこでは公開日ゲートが、期限より 新しいバージョンを拒みます。昨日公開されたペイロードは、その条件を越えられません。

見つけたものを持ち出す。 ここで初めて、何かがあなたの Mac が所有する線を越えなければ なりません。プロキシは外向きの各リクエストを、ヘッダも本文も含めて、そのワークスペースの ために発行されたおとりと Aho-Corasick オートマトンで突き合わせます。発行時のスコープの外 にあるホスト宛てのおとりは、知らないはずのものを送り出しているマシンの署名です。プロキシ は 1 バイトも宛先に届く前に HTTP 451 でブロックし、VM を一時停止し、その資格情報と両方の ホストを名指しするアラートを上げます。Bromure はそのあとワークスペースを侵害済みとして マークし、ディスクとホームを消去するまでは二度と起動しません。

永続化を残す。 ゲスト内の書き換えられた .bashrc は、あなたが VM を存続させるあいだ だけ残ります。ホームを消去すると /home/ubuntu がリセットされ、ディスクをリセット すると署名済みのベースイメージからシステムディスクが再クローンされ、 bromure-cli vm run --rm は VM の停止時に自分自身を削除するワークスペースを与えます。

この傍受には、解除できる環境変数が存在しない

ゲストが自ら参加するプロキシは、ゲストが断れるプロキシです。Bromure の仮想スイッチは、 VM のポート 80 とポート 443 のフローそのものをホストのプロキシへ迂回させます。解除 すべき HTTPS_PROXY はなく、ゲスト側にそれを止める仕掛けもなく、平文の HTTP も HTTPS と同じように検査されます。ここでリクエストを出しているプロセスは、エージェント の設定を一度も読んでおらず、エージェントでもありません。git が起動した補助バイナリで あり、それも他のすべてと同じ線に乗ります。

ツール呼び出しがなくても、その 1 行は存在する

ホストのプロキシは、どのプロセスが出したものであれ、VM から出る各リクエストについて メタデータの記録を書きます。時刻、ホスト、ポート、メソッド、パス、ステータス、レイテ ンシ、そして資格情報の差し替え前に測ったバイト数です。ファイアウォールの判定、サプライ チェーンの判断、資格情報の仲介はセキュリティタイムライン(ウインドウ → セキュリ ティタイムライン…)に届き、登録済みの Mac では egress.firewallsupply_chain.fetchcredential.exfiltration として組織のイベントストリームへ送ら れます。この攻撃のエージェント側トランスクリプトは空白のままで、その間に線の側の記録が リクエストを載せています。

ゲストがあなたの Mac に届く先は一つだけです。共有フォルダは、あなたの本物のファイル システムへの生きた読み書き可能な窓であり、侵害時の消去は設計上そこには手を触れません。 ホームディレクトリではなくプロジェクトディレクトリを共有すれば、補助プログラムが *.pem を探す find は、キーチェーンに支えられたあなたのログイン情報ではなく、 チェックアウトとパッケージキャッシュだらけの Linux のホームを歩くことになります。

シーケンスの一段階ではない境界

GitSpawn の四つのタイミングの詳細を並べて読んでください。信頼確認より前、認証より前、 最初のキー入力より前、どのモデルのターンよりも前。これらが言っていることは一つです。 どの保護も起動シーケンスの一段階であり、新機能が増えるたびにその前へ段が足されます。 Cursor は 2025 年にリポジトリ由来の mcp.json でそれを学び、この 7 月にも 自社の信頼確認より前に実行される worktree の セットアップコマンドで再び学びました。今度は git の番で、しかも 7 製品同時に、git に 何年も前からある設定キーを通じてです。

ハイパーバイザはそのシーケンスの一段階ではありません。.git/config を読みません。 どんなリファクタリングもその順序を入れ替えられず、どのコードパスもそこから自らを免除 できません。プロンプトと同じプログラムの中で動いていないからです。zip のダウンロードが 終わるより前から VM は動いていて、その二つの保証、すなわち中に本物の秘密はないことと、 外へ出る仲介なしの経路はないことは、2.1.193 でも 2.1.196 でも同じように成り立ちます。

誰かが送ってきたフォルダを開く前に .git/config を確認してください。Manifold がそう 言うのは正しいことです。そしてあなたも 2 週間はそうするでしょうが、忙しい午後の 3 つ目の zip では飛ばすでしょう。それが「開く前に」で終わる指示のたいていの賞味期限です。 Bromure Agentic Coding をインストールし、見知らぬフォルダに専用の マシンを与え、走ること以外に何もできない部屋の中で、設定が好きなものを走らせておけば いいのです。