エージェントには住所があった
DEF CON 34 で Team Cymru の Eli Woodward は、AI ハニーポットの 48 時間分のキャプチャを示した。3,993 件のリクエスト、327 の送信元 IP、344 件の認証情報探索。しかも誰も公開していないポートに対してである。コーディングエージェントへの他の攻撃は、その目の前にテキストを置く手段を必要とする。この攻撃が必要とするのは、そこへ至る経路だけだ。Bromure Agentic Coding は既定でエージェントを NAT の内側で動かすので、見つけるべき経路そのものが存在しない。
コーディングエージェントへの他の攻撃は、その目の前にテキストを届ける手段を 必要とする。この攻撃が必要とするのはそこへ至る経路であり、スキャナーは すでにそれを持っている。
DEF CON 34 の土曜朝、 Creator Stage 3 で、Team Cymru の Eli Woodward が MCPwned: How Exposed AI Agents Became the Internet's New Recon Toy と題した 30 分の講演を行った。彼が作ったのは AI ハニーポットだ。LLM と AI インフラの 16 のペルソナを 16 のポートに配置し、 それぞれがフレームワークどおりの応答、ヘッダー、エラー、プロトコル挙動を 返すので、触れたスキャナーは本物を見つけたと信じ込む。
48 時間の窓の中で、このハニーポットは 327 の一意な送信元 IP から 3,993 件のリクエスト を受け取った。うち 155 件は MCP の探索、344 件は AI の API キーの探索である。
それらのポートを誰も公開してはいなかったし、327 のアドレスのどれも Woodward を名指しで狙ってはいなかった。彼がキャプチャから取り出した手口は、退屈で 産業的な部類のものだ。LiteLLM のモデル登録の悪用、MCP のリソース列挙、 フレームワークを踏まえた認証情報の総当たり、そして露出したローカル推論 サービスを探す協調的なスキャン。開いた RDP や認証なしの Redis を求めて 10 年にわたりアドレス空間を掃いてきた集団が、同じ機械を AI 開発ツールに 向けたのである。脅威モデルよりも先に。
誰もあなたに何かを送る必要はない
この 1 年のコーディングエージェントへの攻撃を読み返すと、どれも同じ形をして いる。エージェントが読む何かに指示が入っているのだ。 バグ報告、 見えない PR コメント、 エージェントが取得したウェブページ、 README、 WAF のログ行。そのいずれにおいても、 配達こそが攻撃者にとっての難題だった。あなたが意図してつないだ経路を見つけ、 そこに自分のテキストを流し込まねばならない。
矢印の向きを反転させれば、その難題は消える。スキャナーがポート 11434 に SYN を送ると、あなたのマシン上の何かが応答する。
スキャナーが見つけているもの
Woodward のキャプチャの背後にある母集団は、万の単位にのぼる。
Censys は インターネットから到達可能な MCP サービスを地図化し、 2026 年 4 月 28 日時点で、56 か国・425 の自律システムにまたがる 8,758 の 一意な IP アドレス上に 12,520 件を見つけた。1 週間後の 5 月 6 日には、その 数は 21,000 を超えていた。おおよそ 10 件に 4 件は、認証情報の確認なしに誰の リクエストでも受け付ける。プロトコルが既定でそれを要求していなかったからだ。
Wiz は実際にノックしてみた。 7 月 28 日に公開された調査 で、クラウド環境の 80% に MCP が存在し、そのうち約 6 分の 1 が少なくとも 1 台のサーバーを露出させていた。露出していたもののうち、約 70% は認証なしの 呼び出し元に完全なツールカタログを引き渡し、約 42% は研究者がツールを呼び 出すと実データを返し、およそ 10% は機微なバックエンドの前面に立っていた。 Wiz は確認済みの一部をクラウドのメタデータエンドポイントに向け、一時的な 認証情報を取り戻した。
Knostic は同じ試みを Shodan から行い、
1,862 台の露出サーバー
の指紋を採った。手作業で検証した 119 台は、すべてが認証なしで tools/list
に応答した。それらのサーバーはいずれも、自分が存在する唯一の理由である仕事を、
見知らぬ相手のために果たしていた。
ローカル推論も、数字が丸いだけで同じ絵になる。LeakIX は 2026 年 2 月 23 日に
認証なしの Ollama インスタンス 12,269 台
を数えた。どれもが /api/tags によるモデル列挙、/api/generate と
/api/chat による無料の計算資源、/api/pull と /api/push によるモデルの
窃取を差し出しており、約 1,000 件では Probllama のパストラバーサル連鎖まで
そろっていた。
あなたのマシンが応答してしまうまで
あなたはサービスをインターネットに置こうと決めたわけではない。ソファの上の
ノート PC からデスクトップのモデルを使いたくて OLLAMA_HOST=0.0.0.0 を
設定し、同じ理由で MCP サーバーを全インターフェースに束縛した。README が
そう書いていたので docker run -p 8080:8080 を実行した。スマートフォンで
何かをデバッグするためにトンネルを開き、そのままにした。
そしてノート PC を別の場所へ運んだ。会議場の Wi-Fi、コワーキングのフロア、 ホテル、UPnP があなたに代わって気を利かせた家庭用ルーター、あるいは誰かが 急いでセキュリティグループを広げたクラウドの開発マシン。束縛はフラグ 1 つ だが、露出は、あなたがたまたま座っている場所の背後にあるルーティング表を 書いた者のものだ。あなたはその一点として同意していない。
Bromure Agentic Coding は、あなたが何も設定しなくても、この隙間を既定で 閉じる。
VM には住所がない
Bromure はコーディングエージェントを Apple Silicon 上の使い捨て Linux VM で 動かし、その通信の 1 バイトずつをホスト上のプロキシ、すなわち エージェントが動く箱の外側を通らせる。この攻撃の 分類では、その仕組みのネットワーク側が重みを担う。
リソース → ネットワーク の下でモードは NAT であり、何も選ばなければ
NAT になる。VM は Virtualization.framework 内蔵の NAT を通じて Mac の
ネットワーク接続を共有する。外向きは通り、LAN 上のどれも VM には届かない。
その VM の中でサービスを 0.0.0.0 に束縛しても、束縛先は NAT の内側にある
VM 内部のインターフェースだ。ポート転送表を書き間違える余地はない。この
モードはそもそもポートを転送しないからである。
スキャナーの SYN は、フィルタ済みのポートにも閉じたポートにも届かない。 そこへ至る経路が存在しないからだ。Woodward のハニーポットは、何かを集める のに 16 の待受プロセスを必要とした。Bromure のプロファイルはその 1 つも 差し出さず、344 件の認証情報探索には着地する先がない。
ブリッジ は望んだときのために用意されており、あなたが名指しした物理 インターフェース上で DHCP により LAN 経路のあるアドレスを VM に与える。 これはプロファイル単位の設定で、インターフェースの選択も明示的なので、 LAN に出るつもりだった実行のときにだけ LAN に出ることになる。
あなたの MCP サーバーは待ち受けない
MCP パネルのサーバーはプロファイル設定である。Bromure はそれらを
Claude Code の JSON か Codex の TOML に翻訳し、起動時に注入する。
stdio サーバーは VM 内でパイプ越しに話す子プロセスなので、ソケットを
持たず、tools/list による列挙には届く先がない。HTTP サーバーは
あなたが指し示す URL であり、任意でベアラートークンを添えられる。つまり
リクエストを送るのはあなたの側だ。見知らぬ相手に応答している 40% の MCP
サービスは、誰かが自分で立てて手で束縛したサーバーである。
ローカル推論は Mac 側で動く
「露出したローカル推論サービスを探す協調的なスキャン」はハニーポット自身 の言い回しで、その結果が無防備な Ollama 12,269 台だ。Claude Code の ローカルモデル 認証は、ローカルモデル パネルで選んだ端末内の MLX モデルへ推論を回す。それは macOS 上、つまりプロキシのホスト側で動く。 露出させるべきポート 11434 は VM の中に存在しない。Fusion の端末側の 足も同じ経路をたどる。
入り込んだ探索が拾うのは飾りだけ
フレームワークを踏まえて認証情報を総当たりする者は、どこを見ればよいかを
知っている。環境変数の OPENAI_API_KEY、~/.aws/credentials、
~/.docker/config.json、kubeconfig、~/.ssh。Bromure はそのすべてを VM
に置き、そのすべてを偽物にする。手に入るのは brm_… と xai-brm-… の
トークン、使い捨てのクライアント証明書を持つ合成 kubeconfig、偽の base64
レジストリ認証、そしてプロキシを迂回した瞬間に
InvalidSignatureException を返す AWS の資格材料だ。Bromure は本物の値
をホストに留め、それが属する宛先に対してだけ通信上で差し替える。
破壊的な動詞はホスト側で裁定される
Wiz は露出サーバーの約 42% が実データを返すのを確認し、その隣に書き込み と削除の分類も見つけた。Guardrails はホストのプロキシにある ポリシーエンジンで、Kubernetes、AWS、DigitalOcean、コンテナレジストリ、 GitHub、GitLab、Bitbucket、そして HTTPS のデータベースエンドポイントを 対象にする。リソースごとに破壊的操作の遮断か読み取り専用を設定すれば、 遮断された呼び出しは硬い 403 として返り、エージェントはそれをありふれた API の失敗として報告する。Bromure はその裁定を macOS 内で下すので、VM の 中に切れるスイッチは存在しない。
見知らぬ相手からの依頼も、やはりテキストである
誰かが露出させたリモートの MCP サーバーにあなたがつなぎ、それがデータ以上の ものを返してきたとしよう。スキャナーがこれらのサービスを列挙できるように なった以上、それを見つけた者は、正面の入口から、内容としてあなたの エージェントに届くこともできる。
Bromure はその内容を入ってくる時点で採点する。ローカルのプロンプト
インジェクション検出モデルが、エージェントが取り込むファイルの中身、
ウェブページ、tool_result ブロックを読み、読み手に向けられた命令形を探す。
記録して続行 は各検出をセキュリティログに残す。どうするか尋ねる は
外向きのリクエストを止め、印を付けた箇所をあなたの前に置く。一方的に遮断
はモデルが見る前に止め、エージェントには硬い 451 を渡す。もう 1 つの検出器、
微調整した ModernBERT 分類器とゼロ幅・双方向・Unicode タグのペイロードを
探す決定的スキャナーの組み合わせが、CLAUDE.md、AGENTS.md、GROK.md と
その入れ子および全体の変種を対象にする。
どちらのモデルもあなたの Mac 上で動き、bromure.io から一度だけ ダウンロードされる。第三者の MCP サーバーの出力を採点することは、その出力を どこかへ送ることを意味しない。
ノックはログの 1 行になる
VM が出すすべてのリクエストはホストのプロキシを通り、トレース水準 アクティビティ では、Bromure がその 1 件ごとにホスト、ステータス、 遅延、差し替え結果、漏えい警告を記録する。インジェクションの検出は、印を 付けたテキストを添えてセキュリティログに残る。水準を上げれば、Bromure は AI リクエストの本文も保持する。プロファイルの秘密情報と同じキーチェーンの 鍵で暗号化される。
外からの指示を受け取り始めたエージェントは、誰かの役に立つためにはどこかへ 到達しなければならない。そしてどこかへ到達したことは、そのセッションが動いた マシンの上で読める 1 行である。
そしてマシンを消したくなれば、消える。ホームを消去 は /home/ubuntu、
つまりドットファイル、.ssh、npm-global、.cargo、シェル履歴を、
クローン直後の状態まで拭き取る。ベースへリセット はシステム水準の変更を
すべて捨て、作業ディスクをベースイメージから再クローンする。
MCP はやがて既定値を改め、Ollama も認証の物語を手に入れるだろうし、 Woodward のハニーポットのポートは来年の 8 月には別のポートになっている だろう。だが形は変わらない。いまエージェントをまともに動かすということは、 その隣でゲートウェイと数個のツールサーバーを動かすということであり、 その 1 つ 1 つが、旅をするノート PC の上でソケットを束縛するプログラムだ。
ここにある他の記事は、エージェントが読むものを疑えと求める。この記事が問う のはもっと短い。見知らぬ相手がノックしたとき何が応答するのか、そして何も 応答しないほうがよいのではないか。
Bromure Agentic Coding を導入する。スキャナーには見えない マシンを、あなたのエージェントに与えよう。