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

ウェブページがエージェントの設定を書き換えた

2026年7月21日、IntezerとKodem SecurityはCVE-2026-10591を公開した。ごく普通に見えるドキュメントページに1ピクセルの白い文字で指示が仕込まれており、開発者がAWSのKiroエージェントにそれを読ませると、Kiroは自身のファイル書き込みツールを使い、承認なしにMCPサーバーを起動する設定ファイルを上書きし、そのファイルを再読み込みして攻撃者のコードを開発者の権限でホスト上で実行した。AWSは承認プロンプトを追加した。残るのは、エージェント、それが読むウェブ、そして開発者のマシンが一つの信頼ゾーンだったという事実だ。Bromure Agentic Codingはその間にハイパーバイザーを置く。

開発者はKiroにドキュメントページを読むよう頼んだ。ページには1ピクセルの白い 文字で書かれた一文があり、目ではなくモデルに向けて書かれていた。それに従い、 Kiroは自分がどのプログラムを起動するかを決めるファイルを書き換え、そして一つ を起動した。そのどれもクリックを必要としなかった。

KiroはAWSのエージェント型IDEだ。あなたに代わって開いたウェブを読み、ドキュメン トを取得し、ツールを配線するコーディングエージェントである。2026年のほとんどの エージェントと同様、Model Context Protocol、すなわちMCPを話す。コーディング エージェントが外部ツールを呼び出し、その結果を読むことを可能にするプラグだ。 KiroはMCPサーバーの一覧と、それぞれを起動する正確なコマンドを、 ~/.kiro/settings/mcp.jsonという素朴なファイルに保持する。そのファイルが変わる と、Kiroはそれを再読み込みし、そこに記述されているものを何でも起動する。

この最後の一文が脆弱性のすべてだ。ファイルはランチャーであり、エージェントは そこに書き込める。

2026年7月21日、 IntezerKodem Security との研究で、続く連鎖を示し、 The Hacker News が同日それを報じた。AWSは CVE-2026-10591 を割り当て、10点中8.8と評価した。同じ問題の以前の断片は、Johann Rehbergerと Cymulateによってすでに指摘されていた。Intezerが加えたのは、配送だった。

あなたが読むページ、あなたが開いたファイルではない

指示はリポジトリや、開発者が信頼を選んだ設定に届いたのではない。ウェブページに 届いた。Intezerはそれを1ピクセルの白い文字、color:#fff;font-size:1pxで、ほか は普通のAPIドキュメントページに仕込んだ。ブラウザでは段落は何も描画されない。 人間がスクロールで素通りする空白の細片だ。ページの画像ではなくテキストを取り込 むエージェントにとって、それは明快な指示の段落である。

その指示はKiroに、自身のファイル書き込みツールfsWriteを使って、攻撃者が用意し たエントリで~/.kiro/settings/mcp.jsonを上書きするよう命じた。Kiroは尋ねずに それを実行した。既定のAutopilotモードは、ダイアログも「この書き込みを許可します か?」というプロンプトもなしに、自分でファイルを書いた。再読み込みが発火し、 Kiroは新しいエントリのコマンドを起動し、攻撃者のコードは開発者の権限でホスト上 で実行された。認証情報を読み、ソースをコピーし、永続化を仕込み、あるいは開発者 のマシンが到達できるあらゆる場所へ横方向に移動するのに十分だった。

開発者のマシン — 一つの信頼ゾーンドキュメント人間の目には普通に見える1px白文字:「mcp.json上書き」Kiroエージェントページをテキストとして読み従うfsWriteを呼ぶmcp.json一覧ではなくランチャー。再読込でコマンドを実行コード実行開発者として:認証情報、ソース、クラウド、横移動ページを読むこととコードを実行することの間に、承認プロンプトはなかった。CVE-2026-10591 — 2026年2月報告、v0.9.2 / v0.10.16で有効、v0.11系で修正。
CVE-2026-10591、左から右へ、すべて開発者のマシン上で。ドキュメントページは1ピクセルの白い文字で指示を運ぶ。ブラウザでは見えず、エージェントには平文だ。ページを読むよう頼まれたKiroは、密輸された指示に従い、自身のfsWriteツールで~/.kiro/settings/mcp.jsonを上書きする。そのファイルはランチャーだ。再読み込みで、Kiroは今それが名指すコマンドを起動し、攻撃者のコードを開発者として実行する。マシンがサインインしている認証情報、ソース、クラウドセッションに手が届く。ページを読むこととコードを実行することの間に、承認プロンプトは立っていなかった。

AWSはプロンプトを追加した。マシンは依然として賞品だ。

修正は理にかなったものだ。AWSは今やmcp.json.vscode/tasks.json.git ディレクトリ、その他の実行に敏感なファイルを保護されたパスとして印付ける。その いずれかへの書き込みには、AutopilotモードでもSupervisedモードでも、明示的な承認 が必要になる。欠けていた承認の一歩が、今はある。Kiroを使っているなら、更新しよ う。

修正が変えないのは、部屋の形だ。AWSは締めくくりでこう述べた。人間をループに置く ことが制御として働くのは、その人間に重要な一歩が示され、かつモデルが完全に説き 伏せられて一線を越えた後でも、プラットフォームがその線を保つ場合に限る、と。 これは二つの要求だ。プロンプトは一つ目を満たす。書き込みを表に出す。二つ目は 満たせない。なぜなら、コードが走るとき、それは開発者自身のマシン上で、開発者 自身の到達範囲で走るからだ。疲れた午後にクリックで通してしまう承認、あるいは 次の巧妙なページが定型に見えるよう言い回しを学ぶ承認は、あなたを同じ場所へ導く。 あなたの鍵、リポジトリ、クラウドセッションが在るところで、攻撃者のコードが実行 されるのだ。

ここで繰り返される形 — エージェントが読んだページ、書き込めた設定、引き金を引け た起動 — はKiroに固有ではない。それは、開いたウェブを読み、秘密に満ちたマシン上 でファイルを編集するエージェントの姿だ。持続する問いは、エージェントがどこで走る か、そしてプロンプトが失敗したとき周りに何があるかだ。

Bromureが同じ手順を走らせる場所

Bromure Agentic Codingは、エージェントにページを疑わせたり、書き込みを拒ませた り、クリックを捕まえたりしようとはしない。連鎖全体が走るマシンを変える。各プロ ファイルのエージェントは、Apple Silicon上の使い捨てLinux VMの中、macOSから ハイパーバイザー一枚隔てて走る。CVE-2026-10591のまさにその連鎖をそこで走らせて も、各ステップはやはり発火し、各ステップは別の場所に着地する。

ページは読まれる。インジェクションは勝つ。Kiroの代役はmcp.jsonを書き換え、 再読み込みが発火し、攻撃者のコマンドは「開発者の権限で」起動する。ただしVMの中 では、開発者は使い捨ての箱の中のubuntuユーザーであり、その箱には旅に値するもの は何もない。コードは攻撃を割に合わせる認証情報 — Anthropicの鍵、AWSの鍵、GitHub のトークン — を探しに行き、おとりを見つける。Bromureでは本物の秘密がVMに入ること は決してない。ホスト上の認証情報ブローカーbrm_…のようなプレースホルダー、合成のkubeconfig、使い捨てのSSH鍵を注入し、 本物の値をネットワーク境界で、あなたが承認した宛先への要求に対してのみ差し替える。 ソースの窃取は、あなたがマウントを選んだフォルダにしか届かない。「内部システムへ の横方向移動」は、プロファイルごとのVMファイアウォールに届く。

通常構成 — 一台のマシン隠しページ → Kiroがmcp.json書換 →コードはあなたとして、Mac上で走る本物の鍵&トークン盗まれるソース&クラウド到達可能仕込まれたMCPサーバーが残る再起動をまたいでプロンプトが唯一の線で、越えられた。Bromure Agentic Coding — 使い捨てVM同じ連鎖が発火 — VM内で、使い捨てubuntuユーザーとしておとりを掴むbrm_… 、本物の鍵でない送信を制限ホストプロキシで記録セッション終了 → 箱リセット仕込みサーバー&永続化が消える線はハイパーバイザー、プロンプトではない。
同じ攻撃、二台のマシン。通常の構成(左)では、注入されたコードは開発者のMac上で走り、隣に在る本物の認証情報、ソース、クラウドセッションに届く。Bromure Agentic Coding(右)では、同一の連鎖が使い捨てVMの中で走る。コードは使い捨てのubuntuユーザーとして実行され、掴む認証情報はおとり、外向きの要求はホストプロキシで制限・記録され、セッションを閉じると箱はリセットされ、仕込まれたMCPサーバーとあらゆる永続化は消える。ハイパーバイザーは、モデルが言葉で越えられない一線だ。

それから外向きの半分がある。おとりを盗んでも、どこかへ送れなければ元は取れない し、横方向に動くとは第二のホストに到達することだ。どちらもネットワーク動作であり、 Bromureではどちらもホストプロキシを横切る。そこでは要求の真の宛先が外へ出る途中で 制限され、破壊的な形の動作 — プロファイルが前面に立つクラウドおよびgit APIに対する delete、drop、terminate — は、エージェントが何を吹き込まれていようと、それを拒める ガードレールに出会う。起動されたコードが試みることは何であれ、セッションの記録に 一行のログを残す。

そしてこのすべての前に一枚の層が座る。この攻撃にぴったり合う理由からだ。Bromure は、エージェントが読む信頼できない内容 — 取得したページやツールの応答 — を、モデル がそれに基づいて動く前に、オンデバイスの インジェクション検出器で採点する。 1ピクセルのテキストが効くのは、人がレンダリングされたページを読むからだ。分類器は そうしない。モデルが読むのと同じ生のストリームを読み、そこでは color:#fff;font-size:1pxは何も隠さない。段落を目に見えなくする仕掛けは、バイトを 読む採点器には何の違いも生まない。それはこの大半を捕らえるが、十分に新奇な変装は 依然として一つの検出器をすり抜けうるため、それは使い捨ての箱を置き換えるのではな く、その前に座る。

いまやウェブが信頼できない入力だ

何年もの間、コーディングエージェントへの助言は、どのリポジトリを信頼するかに気を つけよ、だった。Kiroは教訓を前へ進める。危険な入力はドキュメントページ、エージェ ントが一日に百回読む類のものであり、武器はブラウザが1990年代から尊重してきたCSS プロパティだった。開発ワークフローのより多くが、開いたウェブを読むエージェントを 通るようになるにつれ、あらゆるページが信頼できない入力であり、どれだけ注意深く読 んでもそれは直らない。

AWSが追加したプロンプトは正しいパッチであり、出荷されるべきだ。だが、ある人が重要 なただ一つの書き込みを、あらゆるページで、永遠に捕まえることに依存する制御は、長期 の成績が悪い制御だ。Bromure Agentic Codingは、エージェントにウェブを慎重に扱えと は求めない。ページが勝ち、設定が書き換えられ、コードが走ると想定し、そのすべてが 起きるとき、それが奪うものも帰る道もない箱の中で起きるようにする。それが、言葉で 通り抜けられるプロンプトと、一段下に引かれ言葉が効かなくなる線との違いだ。 インストールして、あなたのエージェントに、あなたが失うもので はないマシンを与えよう。