Prefab UIでサーバー乗っ取りの恐れ、0.21.0で修正
Prefab UIのGenerative UIで、隔離を抜けてサーバー上でコードを実行される脆弱性が公表されました。この機能を有効にしている環境は、修正版へ更新し、サーバーの公開範囲と認証も見直してください。
急ぎ度: 至急
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サーバーを動かしている仮想環境で
pip show prefab-uiを実行し、Versionが0.14.0から0.20.2に入っていないか確認する。 - 2FastMCPサーバーのコードや設定で、GenerativeUI providerを登録していないか調べる。登録していれば、MCPツールgenerate_prefab_uiが公開されている。
- 3ホストで
deno --versionを実行し、Denoが入っているか確認する。入っていなければ、この脆弱性の経路は成り立たない。 - 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
サーバーへ到達
FastMCPサーバーのツールを呼べるクライアントが、サーバーに接続する。
-
2
コードを送る
generate_prefab_uiのcode引数にPythonコードを渡し、サンドボックスで実行させる。
-
3
隔離を抜ける
PyodideのjsモジュールからDeno APIに届き、Denoの権限制限がないまま操作できる。
-
4
ファイルを操作
サーバーのOSユーザーの権限で、ファイルの読み取りと書き込みができる。
-
5
実行を居座らせる
仮想環境のsite-packagesに書き込み、あとからもコードが動く状態にできる。
どう悪用されるか
悪用には、generate_prefab_uiツールにコードを渡せる立場が要ります。FastMCPサーバーに認証を設定していなければ、サーバーに到達できるクライアントなら誰でも呼べます。認証がある場合も、ツールの呼び出しを許されたクライアントなら足ります。利用者の操作は要らず、ネットワーク越しに行えます。前提として、Generative UIを有効にしてあり、ホストにDenoが入っている必要があります。
成功すると、サーバーのOSユーザーが読めるファイルは、設定や認証情報を置いていれば含めて読まれ、書けるファイルは書き換えられます。仮想環境のsite-packagesに書き込まれると、サーバーを再起動したあともコード実行が残る恐れがあります。CVSSのスコープが変わる(S:C)と評価されているのは、サンドボックスの外のホストまで影響が及ぶためです。
今すぐやること
-
1
prefab-uiを0.21.0以上に更新する
更新後にサーバーを再起動する。0.21.0では、ランタイムとPrefabのソースを読み込んだあと、コードを受け付ける前にDenoの読み取り・書き込み・ネットワークの権限を取り消す。権限を再要求しても許可されないよう、プロセスは--no-promptで起動する。起動時の外部通信はcdn.jsdelivr.netだけに限られる。
pip show prefab-ui -
2
未認証や広く公開した構成だったかを確認する
更新前にFastMCPサーバーを認証なしで動かしていた、またはインターネットや広い社内ネットワークに公開していた場合は、侵害を疑って調べる。generate_prefab_uiの呼び出しログ、サーバーのOSユーザーによる想定外のファイル変更、仮想環境のsite-packagesに見覚えのない.pthファイルがないかを見る。
-
3
不審な点があれば、読まれた可能性のある情報を差し替える
ファイルの改ざんや不明な実行の跡が見つかったら、サーバーのOSユーザーが読めた認証情報やAPIキーを更新する。仮想環境は、書き換えを疑って作り直すほうが確実。
-
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.更新後、社内のプロキシやファイアウォールで何か確認することはありますか。
この記事は、取得元の公開情報をもとに、人が監修しながら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
- advisory github.com
- advisory github.com
- advisory pypi.org
- advisory nvd.nist.gov
- advisory github.com
- package github.com
- package pypi.org
- package github.com
- patch github.com
- patch github.com
- web github.com
- web github.com
- web pypi.org
- web pypi.org
- web github.com