
php2shell(CVE-2026-109618 / CVE-2026-109619)の概念実証(PoC)エクスプロイトであり、脆弱なPHP環境におけるリモートコード実行を実証します。セキュリティ研究および教育目的に限ります。
緊急勧告 (CVSS v4.0: 9.2 - Critical): 10月20日、PHPコアにおける2件の認証前リモートコード実行 (RCE) 脆弱性の詳細が、協調的開示に先立ってオンラインに流出した。悪用されると、Webサーバーから直接任意のコマンドを実行できる。
php2shell は、PHPコアの機能に影響する2件の重大な脆弱性 (CVE-2026-109618 および CVE-2026-109619) を指す。主に実証されている攻撃ベクトルは、PHPコアのセッションアップロード進捗メカニズムにおけるヒープのuse-after-free (UAF) であり、これが任意コード実行 (zend_call_function / system()) につながる。
PHPのアップロード進捗ハンドラ (ext/session/session.c 内の php_session_rfc1867_callback) は、2つの生の zval * バケットポインタ (post_bytes_processed と current_file_bytes_processed) を、稼働中の HashTable 構造体内に直接保存する。
リクエスト処理中に以下が発生する:
POST リクエストが、デフォルト設定値 (session.upload_progress.enabled = 1) で進捗追跡を有効化する。zend_hash_update() はデストラクタ zval_ptr_dtor を用いて以前のデータツリーを破棄し、メモリブロックを解放する。zend_fcall_info および zend_internal_function 構造体を指すようにリダイレクトされる。zend_call_function() を呼び出し、その結果として任意のシステムコマンドが実行される。php-src ビルド (バージョン8.4.4および8.2.34を含む) で確認済み。zval_ptr_dtor と zend_call_function 間のシンボルオフセット (--syms) を使用し、ディストリビューション固有のバイナリレイアウト (例: Debian Bookworm、Ubuntu Noble、Ubuntu Jammy) に適応する。以下の表は、CVE-2026-109618 および CVE-2026-109619 の影響を受けるPHPバージョンと、そのサポートおよびパッチの状況をまとめたものである:
| PHP ブランチ | ステータス | 影響を受けるバージョン | 修正済み / 安全なバージョン | 備考 |
|---|---|---|---|---|
| PHP 8.5 | サポート中 (アクティブ) | < 8.5.12 | 8.5.12 | 緊急セキュリティリリースが公開済み |
| PHP 8.4 | サポート中 (アクティブ) | < 8.4.27 | 8.4.27 | 緊急セキュリティリリースが公開済み |
| PHP 8.3 | サポート中 (アクティブ) | < 8.3.36 | 8.3.36 | 緊急セキュリティリリースが公開済み |
| PHP 8.2 | サポート中 (セキュリティのみ) | < 8.2.35 | 8.2.35 | 緊急セキュリティリリースが公開済み |
| PHP 8.1 | サポート終了 (EOL) | すべての 8.1.x バージョン | 公式パッチなし (EOL) | session.upload_progress.enabled = Off を設定するか、ELS/ディストリビューションのバックポートを使用 |
| PHP 8.0 | サポート終了 (EOL) | すべての 8.0.x バージョン | 公式パッチなし (EOL) | 公式サポート終了。設定による緩和が必須 |
| PHP 7.x | サポート終了 (EOL) | すべての 7.0 - 7.4 バージョン | 公式パッチなし (EOL) | コアの ext/session ロジックが脆弱。緊急の緩和またはアップグレードが必要 |
| PHP 5.x | サポート終了 (EOL) | 5.4.0+ (RFC1867 進捗追跡あり) | 公式パッチなし (EOL) | 公式サポート終了。ホストを分離するかアップロード進捗を無効化 |
[!WARNING] PHP 8.1 およびそれ以前のサポート終了 (EOL) バージョンは、PHP Foundation から公式のセキュリティパッチを受け取りません。これらの環境では、直ちに
session.upload_progress.enabled = Offを適用するか、提供されている C ソースパッチを使用して PHP をソースから再ビルドしてください。
php2shell の悪用は、通常、PHP ワーカープロセス (php-fpm、php-cgi、php-cgi.exe、httpd、apache2) によって直接生成される異常な子プロセスとして現れます。
PHP ワーカープロセスが以下を実行していないか監視し、アラートを発してください:
/bin/sh、/bin/bash、cmd.exe、powershell.exepython、perlcurl、wget、nc、certutil.exe/dev/tcp/、fsockopen、mkfifowhoami、id、uname -a、ipconfigエンドポイント検出エージェントを持たない Linux ベースの Web 環境では、Florian Roth 氏の無料ツール process-watcher を監視モードで実行し、異常な子プロセスの生成をリアルタイムで検出できます。
php.exe、php-cgi.exe)。/tmp、/var/tmp) を検査し、ドロップされたウェブシェルや一時的な実行痕跡を確認してください。CVE-2026-109618 を標的とした、完全自動化されたワンクリックリモートエクスプロイトが poc_109618.py で利用可能です。このエクスプロイトは、平文の HTTP リクエストを使用して ASLR をリモートでバイパスし、信頼性の高い任意コマンド実行を実現します。
攻撃チェーンは、HTTP を介した 4 つの連続するステージで構成されています:
--huge-mb、デフォルト 12MB)によってメモリ不足(OOM)状態を誘発し、Set-Cookie: PHPSESSID を介して未初期化メモリのリークを引き起こし、Zend MM の 2MB アラインメントされたチャンクベースを抽出します。Set-Cookie を介して ZVAL_PTR_DTOR 関数ポインタをリークし、libphp.so のベースアドレスを計算します。zend_string 内に埋め込まれた偽の HashTable 構造体を偽造し、pDestructor を libphp.so 内の zif_system に直接向けます。細工されたリファレンスは PS(http_session_vars) を上書きします。PHP がセッションデータを解放するとき、zif_system が指定されたコマンドを実行します。[!NOTE] コマンドは 167 バイトのライブな
zend_stringキャリア(0x98 ヘッダー + NUL バイト制限)内に直接埋め込まれるため、インラインコマンド文字列は最大 14 バイト(MAX_CMD = 14)に制限されます。より長いコマンドの場合は、sh</tmp/c(8 バイト)やsh</out/cのような短いトリガーを経由してチェーンしてください。
デフォルトのエクスプロイトプロファイルは、以下の設定で Apache prefork 下の mod_php をターゲットにします:
display_errors = 1memory_limit = 8M(または --huge-mb より十分に低い値)max_input_vars = 1000session.use_cookies = 1、session.use_strict_mode = 0session.upload_progress.enabled = 1# Default command execution against target URL
python3 poc_109618.py -u http://127.0.0.1:8088/index.php
# Execute a custom command (max 14 bytes) and verify via local proof file
python3 poc_109618.py -u http://127.0.0.1:8088/index.php -c 'id>/out/p1' --proof-file out/p1
# Execute command writing to webroot and verify via HTTP GET fetch
python3 poc_109618.py -u http://127.0.0.1:8088/index.php -c 'id>p1.txt' --fetch /p1.txt