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

遮断こそが配達だった

今週の DEF CON 34 で Tenet Security は、あなたのファイアウォールが確実に拒否するリクエストから始まる攻撃を示した。403 こそが狙いだ。WAF は遮断したリクエストをそのまま逐語的にセキュリティログへ書き込み、数日後にコーディングエージェントがその 403 を調べるためにログを読み、中の指示に従う。この連鎖のどのステップも認可されていないものはない。Bromure Agentic Coding はテキストを到着時にスコアリングし、乗っ取られたエージェントが必要とする認証情報を、それが動くマシンの外に置いておく。

ファイアウォールは正しく働いた。ルールに一致し、403 を返し、拒否した リクエストをログに書き込んだ。設計どおりだ。そのログエントリこそが、 ペイロードがコーディングエージェントに届いた経路である。

DEF CON 34 は今朝ラスベガスで閉幕した。金曜日、Tenet Security の Barak Sternberg、Nevo Poran、Ron Bobrov の三名が、タイトルそのものが主張になっている 講演を行った。 Your WAF Blocked Us, That Was The Exploit である。プログラムの概要には「Remote Agent Takeover via Cloudflare, Sentry and Claude Zero-Day for data exfil」とある。まとめの報道は 8月8日 に出た。

同じチームは6月に Agentjacking と命名している。MCP 経由で取得された偽の Sentry エラーレポートが、百を超える 実運用インスタンスにわたって 85% の試行でコーディングエージェントに 攻撃者制御のコードを実行させることを示した後のことだ。金曜の講演はそれを Sentry 自身のエージェント Seer にまで広げる。汚染された推奨は、そこから下流の Cursor へ流れ込む。Cloudflare の連鎖のほうが新しい素材だ。

403 こそが狙いである

攻撃者の問題から始めよう。彼らはあなたのコーディングエージェントに手が届かない。 それは開発者のマシン上、あなたが所有するすべての背後で動いており、攻撃者は 認証情報もセッションも侵入経路も持たない。

そこで彼らは、拒否されるように作られたリクエストを送る。

WAF はマネージドルールに一致し、403 を返す。同時に仕事のもう半分も果たし、 遮断したリクエストをペイロードごとセキュリティイベントログに記録する。 ペイロードを省いたログエントリは、それが存在する目的である分析者にとって 役に立たない。

数日後、誰かがそのエンドポイントが 403 を返していることに気づき、エージェントに 調べてくれと頼む。エージェントは Cloudflare のオブザーバビリティ MCP サーバー、 すなわちこの用途のために Cloudflare が公開している公式サーバー の一つを呼び出し、遮断されたリクエストの行を取り出す。攻撃者のテキストは tool_result ブロックの中に、開発者自身が接続した純正ベンダーサービスから、 これは我々が拒否したリクエストである という意味のフィールドの下で届く。

エージェントはそれを指示として読む。そして自分に与えられた認可済みの Cloudflare ツールを使って DNS レコードを書き換え、顧客トラフィックを転送する。Tenet は その影響範囲を 15,000 を超える組織、うち Fortune 1000 の 27% としている。

以下のすべてのステップは職務を果たしている1. リクエスト拒否されるように作られ、公開エンドポイントを狙うアクセスは不要2. WAFが遮断するマネージドルール一致:403そしてリクエストをそのまま記録する3. 誰かが頼む「なぜチェックアウトが403を返す?見てくれ」ごく普通の月曜の仕事4. エージェントが読むオブザーバビリティMCPサーバー、純正意図的に接続済みtool_result: blocked_request.body攻撃者のテキストがそのまま、「これは我々が止めたリクエストです」という意味の名前のフィールドの中にエージェントが自らのツールでDNSを書き換える顧客トラフィックが転送され、すべての呼び出しは認可済み
遮断こそがペイロードを配達する。攻撃者はエージェントに直接届かないので、WAF が確実に拒否するリクエストを送る。すると WAF がペイロードを逐語的にログへ綴じ込む。エージェントは後から MCP 経由で、ベンダーのサービスから、リクエストは止められたという意味のフィールド名に包まれたそれを取得する。

認可されていないことは何も起きない

Tenet はこのパターンを Authorized Intent Chain と呼び、6月の記事はその帰結を こう述べている。

もう一度連鎖をたどり、アラートを上げるべきステップを探してみてほしい。開発者は エージェントを認可した。エージェントには MCP サーバーが設定されていた。MCP サーバーは、それが照会するために存在するログを照会した。使われたアカウントは、 あなたが意図的に与えた DNS 権限を持っている。そしてすべての発端となった リクエストは遮断された。経路上のどの制御も、買われた目的どおりのことをした。 そしてそれら正しい振る舞いの合成こそが攻撃なのだ。

これを誰がやっていて、その者に許可があるか を問うことで機能するものは すべて、どのホップでもイエスと答える。答えが実際にイエスだからだ。残る手は 二つ。入ってくる途中でテキストを読むこと、そして強制のしくみを、乗っ取られた エージェントの手が届かない場所に置くことである。

テキストを到着時にスコアリングする

Bromure Agentic Coding はエージェントを Apple Silicon 上の使い捨て Linux VM の 中で実行し、その通信のすべてのバイトを、 エージェントが動く箱の外にあるホスト上のプロキシへ 通す。そこにはモデルとの通信も含まれる。ログ行が指示へと変わるのは、まさに そこだ。

ツール出力は信頼できないものとして届く

Bromure はエージェントが読む内容を、ファイルの中身、ウェブページ、そして MCP サーバーやシェルコマンドから返ってくる tool_result ブロックまで含めて、ローカルのプロンプトインジェクションモデルで スコアリングする。この検出器が探すのはまさにこれだ。読む者へ向けられた 命令文を運ぶログ行である。スパンそのものを採点するので、あなたが設定した 接続を通じて Cloudflare が届けることは、ペイロードにとって何の得にも ならない。

検出時に何をするかはあなたが選ぶ

Log and continue は各ヒットを Security Log ウィンドウに記録し、リクエストを そのまま通す。Ask me what to do は送信リクエストを一時停止してフラグの 立ったテキストを見せるので、その文を目の前にして判断できる。Block は モデルが読む前に一方的に止め、エージェントには API 障害として報告される 強制的な 451 が返る。

権威ファイルには専用の分類器がある

設定汚染は DEF CON での開示のもう半分だった。ファインチューニングされた ModernBERT 分類器が、エージェントが常設の命令として扱うファイル、すなわち CLAUDE.mdAGENTS.mdGROK.md と、その入れ子・グローバルの 各種変種をスコアリングする。併せて、どのモデルにも読めないゼロ幅・ 双方向・Unicode タグのペイロード向けに決定的スキャナも動く。

すべてあなたの Mac の中で完結する

どちらの検出器も、bromure.io から一度ダウンロードしたモデルを使って デバイス上で動く。本番の WAF ログを注入された指示について採点することは、 本番の WAF ログをどこかへ送ることを意味しない。

書き込みには、そのマシンの中にない鍵が要る

それでもペイロードが通り抜けたとしよう。この連鎖の終端は DNS レコードを 変更する API 呼び出しであり、その呼び出しには認証情報が要る。

Bromure のプロファイルでは、それは奪われる場所に存在しない。Cloudflare の トークンは Other API keys のエントリとして入り、偽の brm_… 値が発行され、 あなたが選んだ環境変数名で VM に注入される。本物のトークンはホスト上に留まり、 プロキシがワイヤ上で差し替える。しかもあなたが紐付けた唯一の宛先ホストへの 送信リクエストに限ってだ。エージェントのプロセスは本物を決して保持しない。 dotfile もシェル履歴も同様である。

そのエントリで Require approval to use を有効にすれば、置換のたびに VM の 外、macOS 上でダイアログが上がり、Bromure が本物の値を転送する前に確認を求める。 乗っ取られたエージェントは整った形の DNS 更新を組み立てられるが、そのダイアログ には答えられない。

残る影響範囲には、より厳しい答えがある。Guardrails はホストのプロキシ内で 動くポリシーエンジンで、エージェントが話すプロトコルから破壊的操作を取り除く。 Kubernetes、AWS、DigitalOcean、コンテナレジストリ、GitHub、GitLab、Bitbucket、 そして HTTPS のデータベースエンドポイントが対象だ。リソースごとに Block destructive か Read-only を選べば、遮断された呼び出しは強制的な 403 として 返る。その判断を下すのはホストなので、VM の中で他人の指示に従っている エージェントには、切るものが何もない。

開発者のノートPCではログ行が届く純正の MCP サーバーだから信頼されるテキスト自体は誰も読まないトークンはすぐそこにあるCLOUDFLARE_API_TOKEN、有効で使えるDNS の書き込みは送信され成功するそしてアラートは鳴らない認可されたユーザー、認可されたエージェント、認可されたトークン、認可された呼び出しBromure のプロファイルの中では行は到着時にスコアされるローカルモデルが送信者ではなく本文を読む尋ねる、または強制的な 451 で遮断トークンは VM の中にないenv には brm_…、本物はホスト上に置換は macOS で同意ダイアログを出すそして連鎖は行のリストになるホスト、ステータス、レイテンシ、置換レポートリクエストごとに、Trace Inspector で
同じ乗っ取られたエージェントを、二台のマシンで比べる。開発者のノートPCではトークンが環境の中にあり、呼び出しはそのまま出ていく。Bromure のプロファイルではログ行が到着時にスコアリングされ、環境にはプレースホルダーしか入っておらず、本物のトークンは同意ダイアログの後ろでホスト上から差し替えられ、やり取り全体が Security Log の一行になる。

サンドボックスのバグはハイパーバイザーを動かさない

講演ではさらに、エージェントのネットワークサンドボックスを迂回して完全な データ持ち出しを可能にする Claude のゼロデイと、メモリ注入と設定汚染から 組み立てられ、どの EDR も拾えないエージェント型ルートキットが開示された。 どちらの発見も同じ弱点を指している。エージェントに同梱された封じ込めは、 内側から手が届くということだ。

Bromure は境界を別の場所に置く。 境界は仮想マシンである。Apple の ハイパーバイザー上で自前のカーネルを持ち、NAT の内側で動き、すべてのパケットが macOS 上で動くプロキシを横切る。エージェントのインプロセスサンドボックスの 欠陥は、VM の中の欠陥だ。それは VM を動かさないし、VM の中のコードにホストの プロキシを飛ばすネットワーク経路を与えもしない。

そして何かが実際にそこへ着地したとき、それは捨てるために作られたマシンの上に 着地する。Erase home/home/ubuntu を消し去り、つまり dotfile、.sshnpm-global.cargo、シェル履歴を消し、クローン直後の状態に戻す。Reset to base はシステムレベルの変更をすべて破棄し、ベースイメージから作業ディスクを 再クローンする。どのスキャナにも見つけられないルートキットは、あなたが削除 できるディスクレイヤーの中に座っているだけだ。

見えない連鎖を、書き留めておく

Tenet の最も鋭い指摘は、連鎖の各ステップが正当であるがゆえに、それが白日の下で 隠れているということだ。相関させるべきシグネチャも異常もない。

Bromure はそれを相関させようとしない。VM が出すすべてのリクエストはホストの プロキシを横切り、Bromure はホスト、ステータス、レイテンシ、そしてどの認証情報を 差し替えたかを記録する。インジェクションの検出は、フラグの立ったテキストを 添えて Security Log に入る。トレースレベルを上げれば、Bromure は AI リクエストのボディも、プロファイルのシークレットと同じキーチェーンの鍵で 暗号化して保持する。

そうすればあなたは別の問いを立てられる。このセッションは何に触れたのか、だ。 午後じゅう Cloudflare のログを読んでいたエージェントが、その後で初めて DNS API を呼んだ。それは、セッションが動いたそのマシンの上で読める二行であり、 配備すべきエージェントも、転送先の SIEM も要らない。

Cloudflare は自分の面を調整し、Sentry も自分の面を調整し、金曜の講演にあった 二つの連鎖は塞がるだろう。だが、敵対的な入力を記録するあらゆるシステムと、 仕事のために記録を読むあらゆるエージェントを組み合わせれば、どちらも職務を 果たしている二つの部品から、この攻撃はまた組み上がる。誰かに読ませるために ログを取っているのに、その読み手はいまや、見つけたものに従って行動する プログラムなのだ。

覚えておくべき勘は一つで足りる。エージェントが読むものはすべて、見知らぬ他人が 書いたかもしれないものとして扱うこと。あなた自身の防御が書き留めた部分も 含めて、である。

Bromure Agentic Coding をインストールし、ログとエージェントの あいだにテキストを検査するものを置いてほしい。