レジストリがサンドボックスの間で紙片を回していた
Check Point が 9 月 8 日に公開した調査によれば、ChatGPT のコード実行コンテナ二つが、別々のアカウントで動き、互いにネットワーク経路を持たないまま、パッケージを供給していた内部の JFrog Artifactory インスタンスを通じてデータを渡し合えました。正面の扉は何も壊れていません。それらのコンテナが持つ読み取り用の資格情報は書き込みもできたので、保存済みパッケージのメタデータ欄が私書箱として働いたのです。Bromure Agentic Coding はゲストにミラー上のアカウントを一切与えず、ワイヤーが強制するルールに read-only と書かせてくれます。
隔離は保たれ、コネクターは文書どおりに振る舞い、真ん中のサービス はそもそもセキュリティのために入れられたものでした。それでも被害者のメールは、 保存済みパッケージのメタデータ欄を通って、見知らぬ他人のアカウントへ届きました。
6 月、Check Point の研究者たちがパッケージリポジトリ内のファイルにプロパティを一つ
書き込みました。プロパティの名前は chatgpt_test_ts、値はタイムスタンプです。書き
込んだ場所は、ChatGPT の会話のためにコードを実行するサンドボックスの内側でした。そ
の後、別のアカウントで、別のコンテナを持つ会話を開き、同じプロパティを読み戻しまし
た。値は無傷で届きました。
このタイムスタンプが、発見のすべてです。 Check Point は 9 月 8 日にこれを公開しました。 どんな要約よりも優れた題が付いています。The Shared Clipboard Inside the Sandbox。 その時点で OpenAI はすでにこのサービスを退役させていました。研究者は 6 月下旬に報 告し、内部の Artifactory インスタンスは廃止済みだと伝えられました。適用すべきパッチ はなく、利用者側にできることもありません。それでも、形は残ります。
真ん中のサービス
コードを実行する ChatGPT の会話は、自分専用のコンテナを受け取り、他の会話のコンテナ
から隔離されます。その部分は機能していました。Python を動かすコンテナは pip install も必要としますが、慎重なプラットフォームチームはサンドボックスに自力で
pypi.org へ出させはしません。そこでサンドボックスには統制された仲介役が与えられま
す。公開レジストリの手前に立ち、検証済みのパッケージを内側へ配る、内部の
JFrog Artifactory インスタンスです。
これは良い設計です。銀行は同じものを npm の手前に置き、規制下の医療事業者は PyPI の 手前に置きます。ミラーはサンドボックスの露出を減らすために存在し、実際にそうしていま す。
同時にミラーは、各コンテナにアカウントを一つ与えます。
Artifactory の REST API には Item Management というグループがあり、
/api/storage/{repoKey}/{itemPath} で到達できます。クライアントは保存済みアイテム
に任意の名前付き文字列プロパティを付け、読み戻せます。Set Item Properties と
Get Storage Item Information です。プロパティの設定には Annotate 権限が要りま
す。読み取りには要りません。Check Point は、サンドボックスのコンテナへ発行された資格
情報が、読み取り用のつもりで両方を備えていたことを見つけました。
Cybersecurity News の要約
では、「コンテナに渡された読み取り用の資格情報には、これらのプロパティを書くことも読
むこともできるだけの権限があった」、そして「それらのプロパティはアカウントごとに隔離
されていなかった」とされています。
プロパティの値はテキストを取り、バイナリなら Base64 を取ります。一つのプロパティに収 まらないペイロードは複数に分割され、向こう側で再結合されます。無関係な顧客に属する二 つのコンテナが、互いにネットワーク経路を持たないまま、帯域の上限をわざわざ気にする必 要のない双方向チャネルを手にしたわけです。
同じターンの中の二つの会話
攻撃者の指示は、ごく普通の経路で被害者に届きます。貼り付けられたプロンプト、 共有された会話リンク、あるいはビルダー側の指示を利用者が見られないカスタム GPT です。あとは被害者が普通のメッセージを送る。それが引き金のすべてです。
Thinking モードで、モデルは一つのターンの中で独立した二つの作業の流れを処理しまし た。Check Point の実証では、被害者は料理の質問をして正しい答えを受け取り、その答えの 横で、モデルは被害者の連携済み Gmail アカウントを読み、見つけたものを Artifactory の プロパティへ書き込み、攻撃者のコンテナが回収できるようにしました。 Check Point でマルウェア解析チームを率いる Pedro Drimel Neto は The Register にこう語っています。 「巧妙に作られた指示は、目に見える会話の横で ChatGPT に第二のタスクの流れを処理させ ることができた」。Gmail は実演でした。Google Drive、Microsoft Teams、GitHub も同じ手 の届く範囲にありました。
被害者が見た信号は一つだけ、「Talked to Gmail」 という小さなラベルで、しかも事後 に現れました。コネクターの既定は Important actions 設定で、低リスクの読み取りを 尋ねずに承認します。より厳しい Always ask なら確認が出たはずです。この設定は、誰 が要求したのかを問わずに、メールの読み取りを低リスクとして分類します。
Check Point によるモデルの描写はこうです。モデルは「したがって、強いられた内部者とし て振る舞える。悪意はないが、攻撃者のために動くよう説得されているのだ」。
一般化できる部分
ChatGPT を抜いてしまえば、この話はコーディングエージェントの話になります。構造が同じ だからです。
エージェントのサンドボックスはパッケージを入れなければなりません。仲介なしで公開レジ
ストリへ出させることこそ避けたかったので、手前にミラーを置きます。Artifactory、
Nexus、プライベートな npm プロキシ、組織が標準化したものは何でも。サンドボックスはそ
のミラーへ認証するようになり、つまり資格情報を持ちます。そしてその資格情報に何ができ
るかは、このエージェントが存在するよりずっと前に誰かが決めています。パッケージレジス
トリはアップロード、タグ、注釈、保持ルールを受け付けます。だから Annotate は、広い
面の上に載った小さな権限になるのです。
ですから、サンドボックスが隔離されているかを問うのではなく、自分の環境に二つのことを 問いましょう。それが何の上にアカウントを持っているかを名指すこと。次に、そのアカウン トでどの動詞が通るかを名指すこと。
Bromure のワークスペースの中では
Bromure Agentic Coding は各コーディングエージェントを、あなたの Mac 上のハードウェア 仮想化された Linux VM で動かし、本物の秘密をその線のホスト側に留めます。Check Point の三つの材料をワークスペースに通してみましょう。
共有されたサービス。 存在しません。各ワークスペースは一つの VM に対応し、独自の システムディスク、独自のホームイメージ、独自の IP、そしてホスト上の独自の MITM プロ キシリスナーを持ちます。二つのワークスペースは VM を共有せず、マニュアルはその一対を 「1 バイトも共有しない」と描いています。ワークスペースの下に、両方が書き込めるメタデ ータ面を持った全体共通のミラーは座っていません。ワークスペースの下に座っているのは、 あなた自身の Mac 上のプロセスで、ワークスペースごとに一つです。
ミラー上の資格情報。 エージェントは何も持ちません。Bromure のワークスペースでの
パッケージ導入は virtio ソケットを通ってホストのプロキシへ出て、レジストリと話すのは
プロキシです。Bromure はレピュテーションサービスの API キーをホスト側に留め、どの VM
へもエクスポートしません。Depi の経路が最も鋭い例です。プロキシはホスト側であなたの
レジストリキーを Authorization: Bearer ヘッダーとして付け、ゲストが送ってきた
Authorization ヘッダーは通過時に何であれ剥がします。ゲストの中に読み取り用の資格情
報は存在しないので、動詞を一つ多く抱えるものも存在しません。
理由より長生きした書き込みの動詞。 ここは、あなたが制約を書き下せる場所です。ワ
ークスペースの Guardrails ペインは順序付きの外向きファイアウォールを持ち、web プロ
トコルのルールは Methods 列を取ります。allow の下では、メソッドは許可リストに
なり、read-only は GET、HEAD、OPTIONS の略記です。マニュアルはこの列がなぜあるのか
を述べています。メソッドの次元は「ワークスペースが 書く ことを許されていない API
を 読む ことを可能にするもの」であり、しかもワイヤー上で、VM の中のどのツールが要求
を出したかに関わらず効きます。これを二層が強制します。仮想ネットワークスイッチは各フ
ローを宛先 IP と DNS から盗み取ったホスト名で照合し、プロキシは TLS のサーバー名と個
々の HTTP メソッドで再び照合するので、侵害されたエージェントにはどちらを迂回する経路
もありません。編集は再起動なしで実行中のセッションに届き、判定はどれも Security
Timeline の Firewall 行として残ります。
第二の流れ、そして外へ戻る道
攻撃者の第二のタスクの流れは、モデルが読む内容として届きました。Bromure のワークスペ
ースでは、エージェントが取り込んでモデルへ流し返すもの(ファイルの内容、ウェブページ、
コマンドの出力、ツールが返すものすべて)は、同じホストプロキシを tool_result スパン
として通ります。ソースコード検出器は、モデルがそれに基づいて動く前に、ローカルの
PromptGuard 分類器でそれらのスパンを採点し、そのうえで検出を記録し、あなたの判断を待
って一時停止し、あるいは要求を遮断します。この検出器は既定で切られた状態で出荷され、
最初に有効化したときに 298 MB のモデルを取ってくるので、必要になるセッションの前に有
効化しておいてください。
承認されなかったコネクターの読み取りには、ここに逆向きの対応物があります。Bromure の
ワークスペースの MCP ベアラートークンは、VM の中では brm-mcp_ のプレースホルダーと
して現れます。本物のトークンはゲストの外に留まり、プロキシがそのトークンのために発行
された唯一のホストへ向けてワイヤー上で差し替えます。ある資格情報に Ask before use
を入れておけば、セッション内での最初の使用でホスト側のダイアログが出て一時停止し、5
分、1 時間、あるいはセッションの残りという許可を選べます。それが、「Important
actions」が出すのを断った確認であり、資格情報ごとに、あなたが座っているマシンの上で出
ます。
VM の中の何かがプレースホルダーを本来の宛先でない場所へ運ぼうとしたなら、プロキシは 1
バイトも転送せずに要求を拒み、VM を一時停止し、トークンのプレビュー、資格情報、それが
発行されたホスト、そして向かおうとしていたホストを名指すアラートを上げます。この仕掛
け線の下で、Activity only のトレースは要求ごとにメタデータ 1 行を書きます。ホス
ト、メソッド、パス、ステータス、バイト数、プロキシが差し替えた資格情報、そして Bromure
が発行していないベアラー形式のトークンについての漏洩警告です。セッションのあとで
bromure-cli trace hostnames を走らせれば、エージェントが接触した個々のホストが件数
付きで並びます。
エージェントのためにミラーを運用しているなら
サンドボックス同士のネットワーク経路より先に、サンドボックスが認証に使っている素性
を確かめてください。Artifactory では、読み取り用だと思っているトークンに
Annotate が付いていないか、そしてサンドボックスが導入元にしているリポジトリより
広い permission target がないかを見ます。プロパティ API は書き込めるメタデータ面の
一つに過ぎません。保持ルール、タグ、ビルド情報も同じです。注釈できる読み手は、投稿
できます。
それに一行で答えるルール
ワークスペースの Guardrails ペインで、レジストリ向けの外向きルールを web プ
ロトコルと Methods 列の read-only で追加し、Unmatched traffic を Deny に
してから、作業に必要なものを並べます。ペイン下部の pf 形式の表示が、組み上げたもの
をそのまま印字します。allow web registry.npmjs.org read-only、
allow web api.github.com、default deny。実行中のセッションにも再起動なしで効き
ます。
共有サービスはテナントを隣人にする
こういう話のあとの本能は、壁を確かめることです。壁は問題ありませんでした。二つのアカ ウントの下の二つのコンテナは互いへの経路を持たず、Check Point も見つけていません。彼 らが見つけたのは、どちらのコンテナも話す権利を持っていた第三者で、人々が三十年にわた って共有ドライブや DNS の TXT レコードを使ってきたのと同じやり方でそれを使ったのです。
Check Point は論文で教訓をこう述べています。「純粋にインフラとして意図された共有の内 部サービスが、隔離されたままであるはずだった環境をまたぐ、意図しない通信層になりうる」。 セキュリティのために入れたインフラも、やはりインフラであり、その借り手たちは 1 ホップ の距離に座っています。サンドボックスがアカウントを持つ対象の集合を縮め、そのアカウン トに何ができるかという決定を、二年前に誰かが閉じた払い出しチケットの中から、一つ一つの 要求の上へ移してください。
運用する価値のあるエージェントのサンドボックスは、必要なパッケージへの統制された経路 を持つでしょう。そうしない方が悪いからです。その経路を、権限が付いた関係として扱い、 その権限をあなたの境界として扱ってください。まだ自分の目で見える場所で決めることです。 Bromure Agentic Coding を導入して、エージェントにサインインする手 立てを何も渡さないでください。