CVE-2026-45034
PhpSpreadsheet: File::prohibitWrappers バイパス
- 公開済み
- 2026/06/22
- 更新済み
- 2026/06/23
- CNA の割り当て
- GitHub_M
- 観察された証拠
- 2026/08/14
プライマリ CVSS
nvd · CVSS 4.0
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X低 · 今後 30 日間
- パーセンタイル
- 39.2%
- モデルの日付
- 2026/09/21
EPSS は統計的な推定値であり、確実性や影響の尺度ではありません。 CVSS、KEV ステータス、暴露、環境と組み合わせます。
概要
PhpSpreadsheetは、スプレッドシートファイルの読み書きを行うための純粋なPHPライブラリです。1.30.5より前のバージョンでは、CVE-2026-34084はヘルパー関数 `File::prohibitWrappers` によって修正されました。このヘルパーは `parse_url($filename, PHP_URL_SCHEME)` を呼び出し、その後 `is_string($scheme) && strlen($scheme) > 1` をチェックして、`phar://`、`php://`、`data://`、`expect://` などのストリームラッパーを拒否します。このチェックは「パスにラッパーが含まれているかどうか」と同等ではありません。入力が `phar:///path/file.phar/inner` のように、スキームの後にスラッシュが3つ以上続く形式の場合、`parse_url` はスキーム文字列を返す代わりに boolean の `false` を返します。そのため `is_string($scheme)` の分岐はスキップされ、ヘルパーは例外をスローせずに戻り、呼び出し元の処理が続行されます。しかし、PHPのストリーム層は `phar:///...` を依然として有効なpharラッパーとして扱い、基盤となるpharファイルを開きます。その結果、`IOFactory::load($attackerPath)` はパッチをすり抜けて、依然としてpharラッパーに到達します。PHP 7.xでは、`is_file` を介してpharラッパーに到達するだけで、PHPがpharメタデータを自動的に逆シリアライズし、それによって攻撃者が制御するオブジェクトのマジックメソッド `__wakeup` と `__destruct` が呼び出され、完全なRCE(リモートコード実行)が可能になります。PHP 8.xでは、通常のファイル操作に対する自動メタデータ逆シリアライズが削除されたため、PhpSpreadsheet層での攻撃チェーンはpharラッパーのファイル読み取りプリミティブに縮小され、RCEは下流のコンシューマーが `Phar::getMetadata` を呼び出した場合にのみ再び発生します。この脆弱性は1.30.5で修正されています。
ソース
1PHPSpreadsheet の phar:// デシリアライゼーション脆弱性に対する PoC エクスプロイトで、prohibitWrappers をバイパスして、脆弱な PHP アプリケーション上でリモートコード実行を達成します。
責任ある使用
脆弱性情報は、自分が所有しているシステム、またはテストを許可されているシステムでのみ使用してください。 Kitploit は公開研究メタデータにリンクしており、エクスプロイト コードや悪意のあるペイロードは保存しません。