本文へ移動
English version →
重大 10.0 急ぎ度: 至急

Prefab UIでサーバー乗っ取りの恐れ、0.21.0で修正

Prefab UIのGenerative UIで、隔離を抜けてサーバー上でコードを実行される脆弱性が公表されました。この機能を有効にしている環境は、修正版へ更新し、サーバーの公開範囲と認証も見直してください。

CVE-2026-120338 公開 更新 執筆・監修: 佐々木 航 人が監修しながらAIを活用して執筆
記事のイメージ(生成 AI による画像)
画像は生成 AI で作成したイメージです

急ぎ度: 至急

CVSS v3が10で、認証なしの構成では到達できる相手にそのままコードを実行されるうえ、修正版0.21.0がすでに出ているためです。

関係があるか

Prefab UIのGenerative UIを有効にし、ホストにDenoを入れているサーバーが対象です。FastMCPのGenerativeUI provider経由でMCPツールを公開している構成が典型で、機能を有効にしていなければこの経路は使われないため、急ぐ必要は低いとみられます。

製品影響を受ける版修正版
prefab-ui(Pythonパッケージ) 0.14.0以上0.21.0未満(0.14.0から0.20.2) 0.21.0

確かめ方

  1. 1サーバーを動かしている仮想環境で pip show prefab-ui を実行し、Versionが0.14.0から0.20.2に入っていないか確認する。
  2. 2FastMCPサーバーのコードや設定で、GenerativeUI providerを登録していないか調べる。登録していれば、MCPツールgenerate_prefab_uiが公開されている。
  3. 3ホストで deno --version を実行し、Denoが入っているか確認する。入っていなければ、この脆弱性の経路は成り立たない。
  4. 4requirementsファイルやロックファイルに、prefab-uiの版が固定されていないかも見る。コンテナイメージに入っている版も対象。

何が起きたか

Prefab UIのGenerative UIは、呼び出し側が渡したPythonコードを隔離して動かす機能です。その隔離が実際には働かず、コードを渡せる相手が、サーバーのOSユーザーの権限でファイルを読み書きし、コード実行を居座らせることができます。

機能の仕組みはこうです。PythonをWebAssemblyにしたPyodideを、Denoのサブプロセスの中で動かします。ところがランチャーはDenoを、読み取り・書き込み・ネットワークをすべて無制限に許可して起動していました。加えてランナーがJavaScriptのグローバルオブジェクトにDeno APIを残していたため、PyodideのPythonからDenoのファイル読み書き関数に届きます。壁を二重にしたつもりが、外側の壁が開いたままでした。

遠隔から届く典型的な経路は、FastMCPのGenerativeUI providerです。providerはMCPツールgenerate_prefab_uiを登録し、そのcode引数をこのサンドボックスへそのまま渡します。

攻撃の流れ

  1. 1

    サーバーへ到達

    FastMCPサーバーのツールを呼べるクライアントが、サーバーに接続する。

  2. 2

    コードを送る

    generate_prefab_uiのcode引数にPythonコードを渡し、サンドボックスで実行させる。

  3. 3

    隔離を抜ける

    PyodideのjsモジュールからDeno APIに届き、Denoの権限制限がないまま操作できる。

  4. 4

    ファイルを操作

    サーバーのOSユーザーの権限で、ファイルの読み取りと書き込みができる。

  5. 5

    実行を居座らせる

    仮想環境のsite-packagesに書き込み、あとからもコードが動く状態にできる。

公開されている情報をもとにした流れの例です。

どう悪用されるか

悪用には、generate_prefab_uiツールにコードを渡せる立場が要ります。FastMCPサーバーに認証を設定していなければ、サーバーに到達できるクライアントなら誰でも呼べます。認証がある場合も、ツールの呼び出しを許されたクライアントなら足ります。利用者の操作は要らず、ネットワーク越しに行えます。前提として、Generative UIを有効にしてあり、ホストにDenoが入っている必要があります。

成功すると、サーバーのOSユーザーが読めるファイルは、設定や認証情報を置いていれば含めて読まれ、書けるファイルは書き換えられます。仮想環境のsite-packagesに書き込まれると、サーバーを再起動したあともコード実行が残る恐れがあります。CVSSのスコープが変わる(S:C)と評価されているのは、サンドボックスの外のホストまで影響が及ぶためです。

今すぐやること

  1. 1

    prefab-uiを0.21.0以上に更新する

    更新後にサーバーを再起動する。0.21.0では、ランタイムとPrefabのソースを読み込んだあと、コードを受け付ける前にDenoの読み取り・書き込み・ネットワークの権限を取り消す。権限を再要求しても許可されないよう、プロセスは--no-promptで起動する。起動時の外部通信はcdn.jsdelivr.netだけに限られる。

    pip show prefab-ui
  2. 2

    未認証や広く公開した構成だったかを確認する

    更新前にFastMCPサーバーを認証なしで動かしていた、またはインターネットや広い社内ネットワークに公開していた場合は、侵害を疑って調べる。generate_prefab_uiの呼び出しログ、サーバーのOSユーザーによる想定外のファイル変更、仮想環境のsite-packagesに見覚えのない.pthファイルがないかを見る。

  3. 3

    不審な点があれば、読まれた可能性のある情報を差し替える

    ファイルの改ざんや不明な実行の跡が見つかったら、サーバーのOSユーザーが読めた認証情報やAPIキーを更新する。仮想環境は、書き換えを疑って作り直すほうが確実。

  4. 4

    認証とネットワーク公開範囲を見直す

    FastMCPサーバーに認証を付け、ツールを呼べるクライアントを必要な相手に絞る。到達できるネットワークも絞っておく。ベンダーの告知に追加の案内がないかも確認する。

すぐ更新できないとき

すぐに更新できないときは、GenerativeUI providerの登録を外してgenerate_prefab_uiを公開しないか、ホストからDenoを取り除いて、この経路を止めます。認証の追加やネットワークの制限は到達できる相手を減らしますが、ツールの呼び出しを許されたクライアントには効かないため、つなぎとして考えてください。

背景

Prefab UIのGenerative UIは、LLMが書いたUIコードのように、信頼できないPythonを動かすための機能です。ドキュメントでも、信頼できないコードの隔離として説明されています。壁は二重で、PythonをWebAssemblyにしたPyodideの外側を、Denoのサブプロセスが囲みます。Denoは本来、ファイルやネットワークの権限を明示して与える仕組みなので、外側の壁として頼れるのはこの権限の絞り込みです。

今回の問題は、その絞り込みがありませんでした。起動時にすべて許可され、Deno APIもPythonから見える状態だったため、WebAssemblyの内側にいるはずのコードがホストに届きます。CWEでは保護機構の不備(CWE-693)にあたります。隔離を売りにする機能は、最も外側の権限が開いていると、内側の仕組みがいくら堅くても守りになりません。0.21.0がコードの受け付け前に権限を取り消すのは、この点を直すためです。

よくある質問

Q.更新後、社内のプロキシやファイアウォールで何か確認することはありますか。
A.0.21.0では、起動時のネットワークアクセスがcdn.jsdelivr.netだけに限られます。外部への通信を制限している環境では、更新後にサンドボックスが正常に起動するかをテスト環境で確かめ、必要な通信が通るかを見ておくと安心です。

この記事は、取得元の公開情報をもとに、人が監修しながらAIを活用して執筆しています。執筆と監修は佐々木 航が担い、公開したあとも人が内容を確認しています。誤りに気づいたときは直し、記事の末尾に訂正の行を残します。対応を決める前に、下の原文と参照先も確認してください。

影響パッケージ

種類パッケージ影響を受ける版修正版
PrefectHQ prefab-ui
0.14.0 以上 0.21.0 未満
0.21.0
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。

Prefab UI's Generative UI sandbox runs caller-supplied Python inside Pyodide, Python compiled to WebAssembly, in a Deno subprocess. The feature is documented as isolation for untrusted code, including LLM-written UI. From prefab-ui 0.14.0 through 0.20.2 the launcher starts Deno with unrestricted --allow-read, --allow-write, and --allow-net, and the runner leaves the Deno API on the JavaScript global object. Pyodide's js module proxies that global, so the Python can call Deno.readTextFileSync and Deno.writeTextFileSync. A caller who can supply the code can read and write files as the server OS user, and can persist code execution by writing a .pth file into the server virtualenv's site-packages. The usual remote path is FastMCP's GenerativeUI provider, which registers the MCP tool generate_prefab_ui and forwards that tool's code argument into this sandbox. On a FastMCP server with no authentication configured, any client who can reach the server can call the tool. With authentication, any client allowed to call tools can. Generative UI is opt-in, and the host must have Deno installed. Confirmed on prefab-ui 0.20.2. Fixed in 0.21.0: after the runtime and Prefab sources load, the runner revokes Deno read, write, and network permission before it accepts code, the process is started with --no-prompt so a permission request cannot grant them again, and bootstrap network access is limited to cdn.jsdelivr.net. The fix is commit 030f074 (pull request 538).

出典: CVE.org (CVE Program・cvelistV5) NVD GitHub Advisory

参照URL

当サイトでは、アクセス解析と広告の効果測定のために Cookie を使います。株式会社Game のサイト共通の設定です。 詳しく