何が起きたか
Prefab UIのGenerative UIサンドボックスは、信頼されていない呼び出し元が提供するPython(LLMが生成したUIを含む)を隔離するためのもので、Denoサブプロセス内のPyodide(WebAssembly上のCPython)でPythonを実行すると文書化されています。prefab-ui 0.14.0から0.20.2まで、ランチャーはDenoを無制限の--allow-read/--allow-write/--allow-net付きで起動し、Deno APIをJavaScriptグローバルオブジェクトに残します。Pyodideのjsモジュールがそのグローバルをプロキシするため、PythonはDeno.readTextFileSync/writeTextFileSyncを呼び出し、ネットワーク呼び出しを行うことができます。コードを提供できる呼び出し元は、サーバーOSユーザーとしてファイルを読み書きでき、サーバーの仮想環境のsite-packagesに.pthファイルを書き込むことで実行を永続化できます。通常のリモートパスはFastMCPのGenerativeUIプロバイダーで、これがMCPツールgenerate_prefab_uiを登録し、ツールのコード引数をこのサンドボックスに転送します。0.21.0で修正され、コードを受け入れる前にDenoの読み取り/書き込み/ネットワーク権限を無効にし、--no-promptで起動し、ブートストラップのネットワークアクセスをcdn.jsdelivr.netに制限します。0.20.2で確認済みです。
なぜ重要か
Pyodide/Denoサンドボックスは、信頼されていないLLMが記述したUIコードの分離境界として文書化されています。これをエスケープすると、エージェント型UI生成ツールがリモートコード実行プリミティブに変わります:認証されていないFastMCPサーバーでは、サーバーに到達できるクライアントは誰でもgenerate_prefab_uiを呼び出し、サーバーユーザーとしてファイルを読み書きし、永続的なコード実行を確立できます。これは新しいエージェント実行攻撃クラス(LLM生成コードのサンドボックスエスケープ)であり、動作するエクスプロイトとCVSS 10.0評価があります。
攻撃経路
MCPクライアントがFastMCP GenerativeUIプロバイダーのgenerate_prefab_uiツールを攻撃者が制御するPythonで呼び出します。コードは、無制限のファイルシステム/ネットワーク権限とプロキシされたDenoグローバルで起動されたPyodide-in-Denoサブプロセス内で実行されるため、PythonはDenoのファイルおよびネットワークAPIにアクセスし、サーバーOSユーザーとしてファイルを書き込み、site-packages内の.pthファイルを介して実行を永続化できます。
影響を受けるシステム
prefab-ui 0.14.0から0.20.2まで (0.21.0で修正)
緩和策
prefab-ui 0.21.0にアップグレードしてください(修正コミット030f074 / PR 538)。これにより、コードを受け入れる前にDenoの読み取り/書き込み/ネットワーク権限が無効になり、--no-promptで起動し、ブートストラップのネットワークアクセスがcdn.jsdelivr.netに制限されます。アップグレードが遅れる場合は、FastMCPサーバー認証を設定し、GenerativeUIツールを呼び出せるクライアントを制限してください。