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

バグ報告がコマンドを実行した

2026年6月にTenet Securityが公開したエージェントジャッキングは、マルウェアもインフラへのアクセスも必要としない。攻撃者は書き込み専用の公開キーを使ってあなたのSentryプロジェクトに偽のエラーを登録し、その中に指示を隠して待つ。あなたがコーディングエージェントに問題の修正を頼むと、エージェントは攻撃者のテキストを指示として読み、あなたの認証情報で実行する。Tenetは少なくとも2,388件の露出したプロジェクトと、Claude Code・Cursor・Codexにわたる85%の成功率を確認した。Bromure Agentic Codingはこの読み取りから実行までの経路すべてを使い捨てのLinux VMの中で走らせ、エージェントが動く前に取得テキストを評価し、認証情報の窃盗者にはおとりしか残さない。

あなたはコーディングエージェントにエラーの修正を頼んだ。エージェントは課題トラッカーを開き、 一番上の結果を読み、そこに書かれたとおりに動いた。問題は、そのエラーはインターネット上の 誰でも書けたということ——そしてエージェントが読んだものは、従わせるために書かれていた。 マルウェアは何も届いていない。サーバーは一つも侵害されていない。バグ報告があなたのマシンで コマンドを実行したのだ。

2026年6月12日、Tenet Securityの研究者——Ron Bobrov、Barak Sternberg、Nevo Poran——が、 Cloud Security AllianceのAI Safety Initiativeを通じて、彼らが エージェントジャッキング と呼ぶ攻撃を公開した。フィッシングメールも、汚染されたパッケージも、盗んだパスワードも使わない。 使うのはバグ報告だ。具体的には、「開いているSentryの課題を修正して」と頼まれたコーディング エージェントが、エラー報告を読んでその内容を指示として扱う、という事実を突く。

その仕掛けは、ほとんどのWebアプリがわざと配っているものから始まる。Sentry DSN——サイトが自身の クラッシュをエラー追跡プラットフォームのSentryに報告するためのキー——は、 書き込み専用の公開認証情報だ。ページのクライアント側JavaScriptに同梱されており、Sentryの 取り込みエンドポイントは設計上、そのDSNへの認証なしのPOSTリクエストを受け付ける。だからこそ あなたのブラウザタブはログインせずにクラッシュを報告できる。それはまた、あなたのページの ソースを読める者なら誰でも、あなたのSentryプロジェクトにイベントを送れるということでもある。 Tenetはこれを走査し、 上位100万サイトの中に71件の注入可能なDSNを、そしてインターネット全体で少なくとも2,388の組織が DSNを露出している のを見つけた。

クラッシュ報告がコマンドになるまで

攻撃者は見つけたDSNを取り、そこへ細工したエラーイベントをPOSTする。イベントは普通のクラッシュ に見えるが、メッセージフィールドとコンテキストのキーはマークダウンで書かれている——見出し、 コードブロック、「解決策」のように読める節——Sentry自身の診断テンプレートと視覚的にも構文的にも 見分けがつかないよう整形されている。それはほかの未解決エラーと同じように、プロジェクトの課題 一覧に並ぶ。

そして攻撃者はあなたを待つ。開発者がコーディングエージェントに未解決のSentryの課題を調べるよう 頼むと、エージェントはSentryに問い合わせる——たいていはSentryの MCPサーバー、すなわちエージェントが外部ツールから データを引き出せるようにする標準コネクタを通じて——そしてイベントを受け取る。Tenetの言葉を借りれば、 エージェントは「開発者と同じように、応答を受け取ってそれに基づいて動く」。その応答には、内容が アプリ自身のランタイムではなく攻撃者によって書かれた、という信号は一切ない。「解決策」はコマンドの 実行を指示する。エージェントは開発者自身の権限で、開発者自身のマシン上で、それを実行する。

手順1 — 攻撃者が仕掛ける(いつでも)攻撃者DSN を読む偽クラッシュを POSTあなたの Sentryイベント = 「解決策」「これを実行」手順2 — あなたが修正を依頼(後で別に)エージェント「Sentry の課題を修正」MCP クエリSentry MCP サーバーイベントを返す出所の印はない計画として読むあなたのマシンエージェントが実行あなたの権限、本物のトークン抜き取り攻撃者のサーバーフィッシングもマルウェアもなし。すべて許可された操作。
エージェントジャッキングには決して交わらない二つの半分がある。まず攻撃者は、書き込み専用の公開DSNを使ってあなたのSentryプロジェクトへ偽のクラッシュをPOSTし、メッセージの中に偽の「解決策」としてコマンドを隠す。後になって、別々に、あなたはエージェントに開いている課題の修正を頼む。エージェントはSentryのMCPサーバーを通じて汚染イベントを引き出し、解決策を指示として読み、あなたの認証情報でそれを実行する——トークンを攻撃者へ抜き取りながら。攻撃者はあなたのインフラに一度も触れない。

Tenetは、テストした各エージェント——Claude Code、Cursor、Codex、 つまり多くの開発者が手に取るツール——にわたって85%の成功率を報告した。彼らの概念実証の コマンドは、環境変数、AWSの認証情報、GitHubとGitLabのOAuthトークン、npmレジストリのトークン、 Dockerの設定、Kubernetesクラスタのトークン、CI/CDパイプラインの秘密情報を持ち去った。 6月3日に欠陥を知らされたSentryは、根底にある挙動の修正を拒んだ——彼らの言葉では技術的に 防ぎようがない——そして、特定のペイロード文字列一つをブロックするグローバルなコンテンツ フィルタを追加した。

なぜ既存の防御がことごとく素通りしたのか

エージェントジャッキングが重要なのは、ペイロードの巧妙さのためではなく、通常のセキュリティ スタックの中で何も発火しないからだ。エンドポイントのエージェントが捕まえるべきマルウェアは ディスク上に存在しない。ID監視が警告すべき異常なログインもない。理由もなく外部接続を張る プロセスもない——エージェントはSentryと話すはずであり、開発者の認証情報は動くはずなのだ。 この連鎖のどの一歩も、正当なアクセスで行われた許可された操作である。Tenetの言葉を借りれば、 この攻撃はどのポリシーにも違反せず、どの異常しきい値も越えない。

これはエージェント型セキュリティの他の分野が何度もぶつかってきたのと同じ壁だ。コマンドの 拒否リストはコマンドを書き換えるシェルに敗れる。 信頼していたワークスペースはそれが黙って起動するサーバーに敗れる。 エージェントが代わりに走らせるセキュリティレビューは あなたを攻撃するものになる。 エージェントジャッキングは、汚染された入力が、あなたが信頼して正しかったツールを通じて、 読む理由が十分にあったデータを携えて届く、という版だ。SentryのMCPサーバーは自分の仕事を 完璧にこなした。問題は、「エラーを取得して、それに基づいて動け」と「攻撃者の指示を取得して、 それに基づいて動け」が、エージェントにとって同じ一文だということだ。

Tenet自身の推奨は、修正の形を指し示している。ネットワークの外向き通信を制限したサンドボックスで エージェントを走らせる、MCPサーバーが返すものはすべて潜在的に敵対的な入力として扱う、そして 取得した文字列を、間に境界を挟まずコマンドにさせるのをやめる。これらが記述しているのは アーキテクチャであって、パッチではない。

Bromureが線を引く場所

Bromure Agentic Codingは、どのバグ報告を信じるべきかをエージェントに教え込もうとはしない。 信じられた報告が届く先を変える。Bromureが走らせるすべてのエージェント——Claude Code、Codex、 Grok Build——は、macOS本体の上ではなく、あなたのMac上の使い捨てLinux VMの中で動く。だから、 エージェントが汚染されたSentryイベントを引き出し、Tenetがこれらのエージェントで目撃したとおりの ことをするとき、いくつかのことがすでに成り立っている。

第一に、取得したテキストは計画になる前に検出器に読まれる。 エージェントジャッキングは、 実行攻撃である前に読み取り攻撃だ。攻撃全体は、エージェントが攻撃者の「解決策」を取り込み、 それを指示として扱うことに懸かっている。それはまさにBromureが見張る信頼できない権威——不正な CLAUDE.mdや汚染されたAGENTS.mdと同じ種類——である。Bromureのオンデバイスのプロンプト インジェクション検出は、エージェントが読む内容を、Macを一度も離れないローカルモデルに照らして 評価し、加えて不可視Unicodeの細工のための決定論的スキャナも用いる。「修正」があなたのトークンを 読むシェルコマンドであるクラッシュ報告は、まさにこの検出器が警告するために存在する事例だ。

第二に、コマンドはあなたが捨てる箱の中で走る。 おとりが評価器をすり抜けるほど巧みに書かれ、 コマンドが走ったとしよう。それはVMの中で走る。Tenetの脅威モデルにある「永続的なバックドア アクセス」には、そこに居座る対象が何もない。プロファイルをベースに戻せば、落とされたスクリプト、 追加されたSSHキー、仕込まれたスケジュールジョブ——そのすべてが消える。コマンドが行ったことは、 ウィンドウが閉じるのを一つも生き延びない。

第三に、盗むべき本物の認証情報が存在しない。 概念実証の戦利品リスト全体——AWSキー、GitHubと GitLabのトークン、npmとDockerの認証情報、KubernetesとCI/CDの秘密情報、環境変数——は、Bromureが そもそも箱の外に締め出しているものだ。Bromureはプレースホルダの値(brm_…、合成の ~/.kube/config、使い捨てのクラウドとレジストリのトークン)をVMに注入し、本物はホスト上の、 プロキシの中で、本物のAPIへ出ていく途上でのみ戻す。コマンドは環境とディスクをあさり、おとりを 見つける。それが攻撃者のサーバーへ送り出すものは何であれ、何にも認証しない文字列の袋にすぎない。

第四に、抜き取りは見える。 Tenetの攻撃は、盗んだトークンがマシンを離れるところで終わる。 BromureはVMの通信をホストのプロキシ経由でルーティングするので、攻撃者のサーバーへの接続は セキュリティログに、あなたが見られる外向き通信として現れる——きれいだと思い込んでいたノートPCからの 静かなコールバックではなく。Tenetが推奨する「制限されたネットワーク外向き通信」は、エージェントが すでに暮らしている場所なのだ。

使い捨て Linux VM汚染イベントエージェントが取得「解決策」インジェクション検出デバイス上で評価実行前に評価コマンドが盗もうとする物AWS_SECRET = brm_9f2a…(偽)GitHub / npm / kube = おとり箱は後で初期化される抜き取り(記録済)攻撃者はおとりを入手どこにも通らない文字列本物の秘密情報ホストのプロキシに残る通信経路で差し替え報告は届きエージェントは読む。ただし使い捨ての場所で、偽の鍵で。
同じ偽の報告、同じ取得、同じコマンド——違うマシン。Bromureの中では、エージェントは使い捨てのLinux VM上で走る。汚染された「解決策」は計画になる前にオンデバイスの検出器で評価され、コマンドは使い捨ての場所で走り、あさられるトークンはおとりで、本物との差し替えはホストのプロキシでのみ行われ、抜き取りは記録される。報告はそれでも届く。持ち去る価値のあるものは何もない。

これが線を引く対象

隔離と評価は封じ込めであって、信じやすいエージェントを治す薬ではない。Bromureがここで何を変え、 何を変えないのかを正確にしておく価値がある。

報告はそれでも届く

BromureはSentryのDSN設計を直しはしないし、攻撃者が汚染されたクラッシュを登録するのを 止めもしない——あの書き込み専用の公開キーはSentryが引くべき境界であり、彼らはそれを 拒んだ。Bromureが変えるのは、エージェントが報告を読んだ後に起きること、つまりコマンドが どこで走り、何に届きうるかだ。

検出は網であって壁ではない

オンデバイスのインジェクション評価は「これを実行して直せ」型の解決策をたいてい警告するが、 入念な書き手なら、一つのスキャナをすり抜けるようおとりを言い回すことができる。検出器は 一つの層として扱うこと。封じ込め——偽の鍵と記録された外向き通信を備えた使い捨ての箱——こそが、 検出器が見逃したときに持ちこたえるものだ。

差し替えはあなたが設定する秘密情報を守る

おとりへの差し替えが守るのは、あなたがプロファイルに入れる認証情報だ。モデルキー、gitと クラウドのトークン、レジストリとクラスタのトークン、SSHキー。スクリプトが実行の途中で ディスクに書き出すトークンや、あなたが箱の中で手作業で確立するセッションは、ただのデータに すぎない。秘密情報はワークスペースではなくブローカーに置くこと。

隔離はすべてを自動実行してよい理由ではない

使い捨てVMは被害範囲を縮めるが、レビューを無意味にはしない。箱の外に届く操作——プル リクエストを開く、リモートへプッシュする——については、確認のステップが依然としてその 価値を保つ。封じ込めは間違いの掛け金を下げるが、それを消しはしない。

Tenetの発見は、あるプラットフォームにバグがある、ということではない。その下にある信頼の 仕組み——取得した文字列を事実として、「解決策」を計画として扱うエージェント——が、エージェントを 外の世界につなぐあらゆるツールに共有されており、それは今四半期には修正されない、ということだ。 Sentryは使者にすぎない。次はJiraのチケット、Linearのコメント、見知らぬ者が残したコード レビューになるだろう。あなたのエージェントは攻撃者が書いた何かを読むことになり、85%の成功率で、 ときにそのとおりに動く。問いは、それがいつか騙されるかどうかではない。問いは、それが起きたときに 何が走るかだ——あなたのマシン、あなたの本物のトークン、そして居座り続ける足がかりか、それとも 中におとりが入り、外向き通信が記録に残る、あなたが捨てられるLinuxの箱か。Bromureはそれを 後者にする。