vLLM: 信頼できないEPS形式の入力により、サービス拒否やGhostscriptのリモートコード実行の脆弱性が引き起こされる可能性がある

### 概要

vLLM 0.30.0において、`ImageMediaIO`は、許可される形式を制限せずに、攻撃者が制御する画像データをPillowの形式自動検出機能に渡します。また、リクエストのMIMEラベルがデコーダの選択を制限していません。`image/png`とラベル付けされたEPS形式のデータが、ホストのGhostscript実行ファイルに到達しました。CVE-2024-29510の影響を受けるGhostscriptがインストールされたホストでは、この状況により、vLLMの画像読み込みパスを通じて、既知のGhostscriptのサンドボックスからの脱出が可能になり、vLLMプロセスの権限でコマンドを実行される可能性があります。特定のマーカーコマンドを含むペイロードが、PyPIのホイールに含まれる`ImageMediaIO.load_base64()`の実装を通じて実行されました。ローダーレベルでの実行が再現されました。HTTPリクエストのパスはトレースされましたが、エンドツーエンドでの検証は行われていません。このレポートは、vLLMの信頼できない形式の処理に関するものであり、新しいGhostscriptの脆弱性を主張するものではありません。脆弱性の悪用には、画像処理が可能なリクエストパス、デプロイメントの認証ポリシー下でそのパスにアクセスできる呼び出し元、および脆弱なバージョンのGhostscriptがインストールされたホストが必要です。

### 詳細

`ImageMediaIO`は、攻撃者が制御するデータがPillowのフォーマット自動検出機能に侵入する境界線です。宣言されたMIMEタイプはデコーダの選択を制限せず、ローダーは`Image.open(BytesIO(data))`をPillowの許可リストなしで呼び出します。Pillowは、ファイルシグネチャに基づいてEPSファイルを認識し、vLLMのその後の`image.load()`呼び出しは、PillowのEPS処理パスに入ります。OpenAIのチャットマルチモーダルパーサーは、[`parse_image()`と`fetch_image()`](https://github.com/vllm-project/vllm/blob/bc21cba9673cfc2256a2726b4bc32f062237cd35/vllm/entrypoints/chat_utils.py#L1077-L1081)と[メディアコネクタ](https://github.com/vllm-project/vllm/blob/bc21cba9673cfc2256a2726b4bc32f062237cd35/vllm/multimodal/media/connector.py#L367-L402)を通じて、このパスに到達します。データURLパスはMIMEラベルを抽出し、そのデータをローダーに転送します([ソース](https://github.com/vllm-project/vllm/blob/bc21cba9673cfc2256a2726b4bc32f062237cd35/vllm/multimodal/media/connector.py#L319-L332))。これがvLLM特有の問題点です。信頼できない画像データによって、Pillowがサポートするフォーマットパーサーが選択される可能性があります。その後の影響は、関連するパーサー、コンポーネントのバージョン、およびホストの構成によって異なります。

Pillowは、ファイル形式からEPSファイルを認識し、Ghostscriptを`-dSAFER`、`-sDEVICE=pnmraw`、および信頼できないEPS入力と共に呼び出します([Pillow EPSプラグイン](https://github.com/python-pillow/Pillow/blob/12.3.0/src/PIL/EpsImagePlugin.py#L132-L159)、[ロードパス](https://github.com/python-pillow/Pillow/blob/12.3.0/src/PIL/EpsImagePlugin.py#L405-L415))。このレポートでのコマンド実行は、既知のGhostscriptの脆弱性CVE-2024-29510を利用しており、これにより、巧妙に作成されたPostScriptコードが`-dSAFER`を回避できます。Ghostscriptは、修正されたバージョンとして10.03.1を公開しています([GhostscriptのCVE詳細](https://www.ghostscript.com/releases/cve/index.html))。これは、N日間の依存関係の連鎖であり、CVE-2024-29510がコマンド実行の基盤を提供し、vLLM固有の問題は、信頼できない、リモートから提供された画像データが影響を受けるインタープリタに到達する可能性があることです。ここでは、新しいGhostscriptの脆弱性が報告されているわけではありません。

vLLMのPythonの依存関係には、Pillowは記載されていますが、Ghostscriptは記載されていません。したがって、この実行チェーンは、ホストまたはデプロイメントイメージによって提供されるGhostscript実行ファイルに依存しています。私は、PyPIの`vllm==0.30.0`のパッケージ、Pillow 12.3.0、およびDebian amd64のGhostscript `10.03.0~dfsg-1`を使用して、コマンド実行を再現しました。Codean LabsのCVE-2024-29510のテストキットは、このGhostscriptのビルドが脆弱であると特定しました。変更されたEPSペイロードは、一時的なマーカーに対して`touch`コマンドのみを実行しました。ローダーの呼び出し後もマーカーは存在していましたが、その後、Pillowが`ValueError`を発生させました。これは、エクスプロイトがGhostscriptの出力デバイスを変更するためです。APIのルートはソースコードで追跡されましたが、モデルによってバックされたHTTPリクエストは実行されませんでした。チェックされたのはPyPIの`vllm==0.30.0`のみであり、影響を受ける他のバージョン範囲や、他のGhostscriptのベンダービルドについては言及されていません。

同じ入力範囲は、インストールされているPillowのバージョンが12.0.0~12.2.0の場合、Pillowに特有のサービス拒否(DoS)の状態を引き起こす可能性があります。CVE-2026-59203は、負の`%%BeginBinary`バイト数によってトリガーされ、`Image.open()`中にPillowのEPSパーサーが無限ループに陥ります。ただし、Ghostscriptは呼び出されず、コード実行も行われません([Pillowのセキュリティに関する注意](https://github.com/python-pillow/Pillow/security/advisories/GHSA-pg7v-jwj7-p798))。公開されている[`vllm==0.30.0`の依存関係](https://github.com/vllm-project/vllm/blob/v0.30.0/requirements/common.txt#L21)では、Pillowのバージョンが固定されていないため、既存の環境では影響を受けるPillowのバージョンが残る可能性があります。コミット`bc21cba9673cfc2256a2726b4bc32f062237cd35`では、[`pillow>=12.3.0`](https://github.com/vllm-project/vllm/blob/bc21cba9673cfc2256a2726b4bc32f062237cd35/requirements/common.txt#L22)が要求されています。Pillow 12.2.0を使用した隔離されたローカルテストでは、公式のサンプルが`ImageMediaIO.load_bytes()`と`MediaConnector.fetch_image_async()`で停止しました。8つの同時画像読み込みが、コネクタの8つのメディア読み込みスレッドを占有し、別の正常な画像読み込みがキューに残っていました。Pillow 12.3.0では、サンプルがすぐに拒否されました。これにより、Ghostscriptに関連するリモートコード実行(RCE)の脆弱性とは別の、条件付きのメディア処理によるDoSの経路が存在することが確認されました。ただし、HTTPサーバー全体の可用性は測定されていません。

### 影響

vLLMの画像処理エンドポイントが、攻撃者によって提供されたコンテンツを受け入れ、かつホストがCVE-2024-29510の影響を受けるGhostscriptを搭載している場合、そのエンドポイントにアクセスできるユーザーは、vLLMプロセスユーザーとしてコマンドを実行できる可能性があります。APIキー認証とネットワークアクセス制御によって、どのユーザーがリクエストパスにアクセスできるかが決定されます。Ghostscriptがインストールされていない環境、またはCVE-2024-29510に対する修正が適用された環境では、この脆弱性は影響を受けません。また、vLLM 0.30.0をPillow 12.0.0~12.2.0と共に実行している環境では、同じ画像フォーマット処理の境界を介してCVE-2026-59203の影響を受ける可能性があります。この脆弱性によって引き起こされる影響は、メディア読み込み処理の停止であり、このPillowの脆弱性はリモートコード実行(RCE)を引き起こしません。この報告書では、vLLMに対して、信頼できない画像データの安全な処理と、影響を受ける依存関係の組み合わせについて評価と対策を講じるよう求められています。

この脆弱性は、[MR60022](https://github.com/vllm-project/vllm/pull/60022)で修正されました。

影響を受けるパッケージ:
- pip (Python) vllm: 影響を受けるバージョンは0.32.0未満、修正されたバージョンは0.32.0。