localhost という名のウェブページ
8月17日、CISA は Ray の CVE-2025-62593 を「既知の悪用された脆弱性」カタログに追加した。これは開発者自身のマシン上でのリモートコード実行であり、開発者が訪れたウェブページによって届けられ、127.0.0.1 でしか待ち受けていないサービスに到達する。コーディングエージェントはこの一年、そのインターフェースを認証なしのサーバで埋め続けてきた。Bromure Agentic Coding は、それらをブラウザのタブがダイヤルできない場所に置く。
あなたの開発サーバ、ノートブック、ローカルのダッシュボードは、どれも認証のない
ポートを 127.0.0.1 にバインドしている。キーボードの前にいる本人しか到達できな
い、という理屈で。ウェブページもまた到達できる。そこに立ちはだかるブラウザのポ
リシーは、六十秒ほどで崩れる。
8月17日、CISA は 脆弱性を1件追加し、 「既知の悪用された脆弱性」カタログに載せたうえで、連邦機関に8月20日までの対処を 求めた。The Hacker News は 翌朝これを報じた。 その項目が CVE-2025-62593、業界の多くがモデルの学習と提供に使う分散計算フレーム ワーク Ray のコードインジェクションの欠陥である。
コードは開発者自身のノートPCで動く。誰かが仕事のために Ray をローカルで動かして いて、ウェブページを開き、そのページが本人の代わりにコマンドを実行した。
ありふれた三つの事実、まずい並べ方
アドバイザリはこれを 9.4 と 評価し、風変わりな手順が一つもない連鎖を記している。
Ray の Jobs API はシェルコマンドを受け取る。それが製品そのものだ。エントリポイン
トを添えて /api/jobs/ に POST すれば、クラスタがそのコマンドを走らせる。ダッ
シュボードはポート 8265 で待ち受け、ダッシュボードもジョブのエンドポイントも認証
を要求しない。それはメンテナの意図的な判断であり、彼らの立場は
セキュリティと分離は Ray クラスタの外側で強制されなければならない
というものだ。信頼できる呼び出し元しか届かない場所に置く、というわけで、ノートPC
のループバックインターフェースはそういう場所に聞こえる。
Ray にはブラウザ対策の見張りが一つだけあった。User-Agent ヘッダが Mozilla で
始まるかを調べ、そうしたリクエストを拒む。ブラウザは自分の User-Agent について
嘘をつけない、という前提である。Firefox と Safari では、Fetch API がページに好き
な値をそのヘッダへ設定させる。
残るのは同一オリジンポリシー、インターネット上のページとあなたのマシン上のサービ
スの間に立つ唯一の制御だ。DNS リバインディングはこれを分解する。攻撃者は自分が
DNS レコードを握るドメインから、きわめて短い TTL でページを配る。ページが読み込ま
れたあと、同じドメインを 127.0.0.1 へ再解決する。ブラウザは同じホスト名、同じ
ポート、同じオリジンとして扱い続けるのに、リクエストはすべてあなたのマシンへ向か
う。公開された実証コードは
singularity を使う。何年も前から公開さ
れているリバインディング用のフレームワークだ。
これらをつなげば、悪意あるページ、あるいは信頼していたページ上の不正広告が、シェ
ルコマンドを含んだジョブをあなたの Ray インスタンスに投げる。Chrome は無関係なバ
グのおかげで守られている。Firefox と Safari は守られていない。Oligo の Avi
Lumelsky が User-Agent バイパスを理論づけ、当時 Socket にいた Jonathan Leitschuh
がリバインディングの連鎖と開示を組み立てた。Ray 2.52.0 が修正し、既定では無効の
トークン認証を任意で追加した。
攻撃者はアドバイザリより先に着いていた。RondoDox ボットネットは公開開示の二日前に この欠陥を拾い、Oligo の ShadowRay 2.0 研究は、Ray のデプロイを自己増殖する ボットネットに変えるキャンペーンを追っている。侵害されたクラスタが別の Ray インス タンスを探して感染させ、cron ジョブが十五分ごとに攻撃者管理のリポジトリから新しい ペイロードを取ってきて、そのペイロードが Monero を採掘し、リバースシェルを開き、 見つけたものを持ち去る。Oligo は露出した Ray サーバを 23万台以上数えた。2024年の 最初の報告から十倍である。侵害されたクラスタ一つが、240 GB のソースコード、モデ ル、データセットを差し出した。
あなたのマシンで何が待ち受けているか
Ray は脇に置いて、別のものを数えてほしい。いまこの瞬間あなたのループバックインタ ーフェースにバインドされている、認証のない HTTP サーバの数と、そのうち何個を見ず に言えるかを。
一週間働いたあとに lsof -iTCP -sTCP:LISTEN -P を走らせると、想像より長い一覧が
出る。5173 の Vite。8000 の uvicorn --reload 下の FastAPI サービス。8888 の
Jupyter、5000 の mlflow ui、Postgres コンテナの公開ポート、3000 の MCP サーバ、
落ちたテスト実行が開けっぱなしにしたデバッグポート。どれもあなたが誰かを尋ねない。
その作者たちは Ray のメンテナと同じ前提を置いたのであり、その前提は別ウィンドウの
タブがリクエストを出し始めるまでは持ちこたえる。
エージェントが量を変えた。チケットを処理するエージェントは、当たり前のようにサー ビスを起動する。自分の変更を確かめるために開発サーバを動かし、マイグレーションを 流すためにデータベースを立ち上げ、データを眺めるためにノートブックを起動し、エン ドポイントを叩くために API を上げる。それを午後のうちに何度も、複数のワークスペー スにまたがってやり、片づけはしない。片づけろと言うものがどこにもないからだ。プロ セスはタスクより長く生きる。木曜になるころには、インターフェースはあなたが自分で 起動していない、記憶だけでは列挙できない十数個のサービスを抱えている。どれも認証 なしでバインドしている。フレームワークのクイックスタートが、localhost なら大丈夫 と書いているからだ。
Ray の立場は、コーディングエージェントが動くマシンでは違って読める。セキュリティ と分離は、あなたが起動したものの外側で強制されなければならない。エージェントとブ ラウザが一つのカーネルを共有するノートPCでは、「外側」に座る場所がない。
Bromure のワークスペースでは 8265 はあなたの Mac にない
Bromure Agentic Coding は、ワークスペースごとに Apple の Virtualization フレーム ワーク上の専用 Ubuntu VM で動かす。それがこの攻撃に対する答えのすべてであり、誰が 何にパッチを当てなくても成り立つ。
エージェントが ray start --head を走らせると、ダッシュボードは VM の内側の
127.0.0.1:8265 にバインドする。あなたの Mac のループバックインターフェースは別
のインターフェースだ。ホスト側の Safari からリバインドされた fetch() は
evil.example を 127.0.0.1 に解決し、macOS のループバックへ接続し、何も得られな
い。ページが探しに来たサービスは、カーネル一つ向こうにあるからだ。公開された連鎖
が狙うのは 127.0.0.1 であり、singularity がリバインドする先であり、アドバイザ
リが名指しするアドレスでもある。そして Bromure のワークスペースでは、そのアドレス
の上には何もない。
アドバイザリの後半、つまり誰もインターネットに出していない社内ネットワークの Ray インスタンスへブラウザを踏み台にして届く、という話についても同じである。ワークス ペースは既定で NAT モードで動き、マニュアル はそれが何をもたらすかを明確に述べている。VM はあなたの Mac からは到達できるが物 理 LAN には露出せず、意図してサービスを公開しないかぎり、ほかの場所からの着信接続 は成立しない。公開とは、ボタンを押して開始するサービスごとの Cloudflare クイックト ンネルのことだ。
そして棚卸しが手に入る。ワークスペースのダッシュボードにある リッスン中のポート
カードは、ゲスト内で ss -tulnpH を定期的に実行し、外から到達できるソケットを、
あなたが接続することになる VM の IP:ポート の形で、そのソケットを握るプロセス名
とともに並べる。カードはループバック限定のソケットを隠す。VM の外側からは何も届か
ないからだ。同じ一覧は bromure-cli vm <id> -L からも出る。この一覧がエージェント
の残していったものの国勢調査であり、macOS はそんな一覧をあなたのために保っていな
い。
最初の一歩のあとの跳躍
ShadowRay 2.0 は、侵害されたノードが次に何をするかという点で読む価値がある。分離 が答えを出さなければならないのはそこだからだ。ほかの Ray インスタンスを探して感染 させる。十五分ごとに新しい指示を取ってくる cron ジョブを仕込む。マシン上にある認 証情報とデータセットに手を伸ばす。
どれも外向きの接続であり、Bromure のワークスペースは外向きの接続をあなたが書いた ルールに照らす。ガードレールペインの 外向き接続 エディタは pf 風のルールセット を保持する。許可か拒否か、ホスト・IP・CIDR 別、プロトコルとポート別、上から下へ評 価して最初に一致したものが勝ち、加えて何にも一致しなかったトラフィック用の設定が 一つ。
allow web api.github.com:443
allow tcp registry.npmjs.org:443
deny any 10.0.0.0/8
deny any 192.168.0.0/16
default deny
その一つのルールセットを二つの層が強制する。仮想スイッチは、宛先 IP と、ゲスト自
身の DNS 応答を盗み見て学んだホスト名とで、あらゆるフローを評価する。だから名前に
対して書いたルールは、その下でアドレスが動いても一致し続ける。MITM プロキシは同じ
ルールを TLS SNI で評価し、web ルールについては HTTP メソッドでも評価する。だか
ら allow web api.example.com GET,HEAD と書ける。拒否された TCP 接続には Bromure
がリセットを注入するので、接続はぶら下がらずに失敗する。
この強制はすべて、VM の外側、あなたの Mac の上で動く。透過的インターセプトは既定
で有効で、中で何かが HTTP_PROXY と HTTPS_PROXY を消しても、ゲストの HTTP と
HTTPS を Bromure へ迂回させる。まちがったウェブページを読んでしまったエージェント
や、パッケージに相乗りして入ってきたペイロードは、自分が書き換えたいルールの反対
側に座ることになる。Bromure はすべての判断を ウィンドウ → セキュリティタイムラ
イン にファイアウォールの行として書き出す。ホスト、ポート、許可か遮断か。それが
認証情報、サプライチェーン、プロンプトインジェクションの判断と並んで、一つの時系
列テーブルに収まる。
十五分ごとの cron は、逆向きに同じ問題を抱える。ワークスペースは三つのストレージ
層でできていて、そのうち二つはあなたが捨ててよい。ホームを消去… は
/home/ubuntu をクローン直後の状態に戻し、ベースにリセット… はワークスペース
のシステムディスクをベースイメージから再クローンし、ベースイメージは実行時には読
み取り専用のままだ。ホームディレクトリの crontab はそのどちらも生き延びない。
localhost は慣習だった
Ray のメンテナが不注意だったわけではない。彼らはコマンドを実行する計算フレームワ ークを書き、そうだとドキュメントに書き、そのまわりに境界を置けと伝えた。それをノ ートPCで動かす人たちは、ループバックインターフェースをその境界と受け取った。開発 サーバもノートブックもローカルのダッシュボードも、二十年にわたってその結論へ誘っ てきたのだから無理もない。あれは制御ではなく慣習だった。あなたのマシンにあるもの が自分で起動したものだけだったあいだは持ちこたえ、ブラウザがスクリプトエンジンを 手にした時点で持ちこたえなくなった。
エージェントは午後ごとに、npm run dev 一つずつ、その隙間を広げていく。注意深さ
では閉じない。注意深さは何が待ち受けているかを知っていることを要求するのに、その
一覧はエージェントがコマンドを走らせるたびに変わるからだ。
二つに一つのインターフェースを共有させるのをやめてほしい。エージェントの仕事を専
用のマシンに入れる。そこで開かれるポートはあなたの Mac にだけ応え、到達できるソケ
ットは受け継いだ思い込みではなくあなたが読む一覧であり、出ていく接続はワークスペ
ース自身には編集できないルールに照らされる。127.0.0.1 へリバインドしたページは、
そこで空のインターフェースを見つけ、拒否を受け取る。
出典: CISA「CISA Adds One Known Exploited Vulnerability to Catalog」(2026年8月17日) · The Hacker News「CISA Flags Actively Exploited Ray Flaw That Can Trigger Browser-Based RCE」(2026年8月18日) · GitHub アドバイザリ GHSA-q279-jhrf-cc6v (CVE-2025-62593) · Oligo Security「ShadowRay 2.0」