
PHP 8.4.26 - 重大 - リモート - OOM longjmp - CVE-2026-109618 PHP2Shell。認証不要のチャンク化マルチパートが、Apache mod_php 上でアプリケーションコードより先に memory_limit に到達する。ラボ環境で 8.4.27 と比較。アドバイザリでは RCE と推測。
インターネット上の誰かが、パスワードなしでブラウザと同じようにあなたの PHP サイトと通信できます。影響を受ける最後の PHP では、アプリケーションが起動する前のリクエスト読み取り中に、細工されたファイルアップロードリクエストを送信してエンジンをメモリ不足に陥らせることができます。すると PHP は、リクエストが半分しか構築されていない状態でその処理から抜け出します。PHP Group は、この半分構築された状態のクリーンアップが Web ワーカーとしてのリモートコード実行につながり得ることを示しました。このラボでは、Apache mod_php 8.4.26 におけるメモリ不足ジャンプを実証し、8.4.27 では同じリクエストがクリーンに完了することを示します。
クラス: OOM longjmp / リクエスト起動時アボート 到達性: リモート
PHP 8.4.26 (php:8.4.26-apache) 対 修正版 8.4.27 - php.net
Apache mod_php は、リクエスト起動が失敗した場合でも常にリクエストシャットダウンを実行します。CVE-2026-109618 は、HashTable のバケットがすでに破棄可能な状態にある中で、rfc1867 のパース中に memory_limit により longjmp() が発生する問題です。このラボは、使用可能な Content-Length を持たず、memory_limit=8M の下で約 3000 個の余分なパートヘッダーを持つ、チャンク化された multipart/form-data POST です。8.4.26 は Fatal error: Allowed memory size ... in Unknown on line 0 を返します。8.4.27 は alive マーカーを返し、index.php を実行します。トリガー後のワーカーへの GET は、両方で依然として 200 を返します。Apache ワーカーとしてのアドバイザリ上の RCE は GHSA から推測されます。
| ID | CVE-2026-109618 |
| アドバイザリ | GHSA-w8hw-w9fx-j79w |
| クラス | OOM longjmp / リクエスト起動時アボート (アドバイザリ上の RCE は推測) |
| 到達性 | リモート (未認証 HTTP) |
| CWE | CWE-416 / CWE-824 / CWE-755 |
| CVSS | Critical: 9.2 CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H (PHP Group) |
| 製品 | PHP |
| 影響を受けるバージョン | PHP 8.2.35 より前の 8.2、8.3.36 より前の 8.3、8.4.27 より前の 8.4、8.5.12 より前の 8.5 (ラボの固定バージョン 8.4.26) |
| 修正済み | 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12 (2026年10月21日) |
| 認証 | なし |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
関連: CVE-2026-109619 の古いワーカーグローバル UAF (PHP2Shell ペア)。
| 手法 | シンク | 権限 |
|---|---|---|
Transfer-Encoding: chunked、多数の余分なパートヘッダー、有限の memory_limit を伴う未認証の POST multipart/form-data | php_request_startup 中の rfc1867 パース / zend_bailout longjmp | 可用性 (ラボで実証): 8.4.26 で index.php の前にリクエスト起動をアボート (Unknown on line 0)。完全性 (推測): シャットダウンが半分初期化された $_POST/$_FILES を走査する。ベンダーは Apache ワーカーとしての RCE を示した (公式イメージでは www-data)。偵察 (推測): 残留リクエストヒープの漏洩。 |
| 8.4.27 での同じトリガー | 遅延ソフト OOM | クローズ (ラボで実証): HTTP 200 の alive マーカー、files=1、ワーカーは稼働継続。 |
| トリガー後の GET | ワーカーは依然として稼働 | ラボで実証: この固定バージョンでは SIGSEGV も zend_mm_heap corrupted のログ出力も発生しなかった。 |
ログイン、アプリケーションルート、カスタム .so、リバースシェル | 該当なし | クローズ。RIP 制御は試みていない。 |
ラボで実証済み vs 推測: 8.4.26 対 8.4.27 の OOM-longjmp 差分はラボで実証済みです。ワーカー停止 UAF と RCE は GHSA-w8hw-w9fx-j79w から推測されます。FPM は通常、起動失敗時に子プロセスを終了します。この CVE についてベンダーは完全な FPM エクスプロイトを示していません。
必要条件: Apache apache2handler。有限の memory_limit (-1 に設定しないこと。それが緩和策です)。マルチパートパースが有効であること。公式の php:8.4.26-apache 対 php:8.4.27-apache。
python3 php-oom-longjmp-Abraxas-Labs.py
または cd lab && ./run.sh。ループバック 127.0.0.1:18220 (8.4.26) 対 127.0.0.1:18221 (8.4.27)。Compose プロジェクト cve-2026-109618。ウィットネス CVE-2026-109618-OOM-WITNESS。最終行:
SUCCESS CVE-2026-109618 vuln-crash=yes patched-ok=yes sapi=apache2handler vuln-image=php:8.4.26-apache patched-image=php:8.4.27-apache how=oom-longjmp-startup-fatal trigger=header-bomb-chunked asan=no CVE-2026-109618-OOM-WITNESS
認可されたラボ専用。ループバックと通信します。
PHP 8.4.27(または 8.2.35 / 8.3.36 / 8.5.12)に更新してください。このパッチは、OOM 時の longjmp() を、次の VM セーフポイントでの遅延ソフト OOM に置き換え、より高いしきい値を超えた場合はハードな _exit() に置き換えます(31c0ea7)。それまでの間は、アプリケーションが上書きできない管理者用の memory_limit=-1 を設定し、post_max_size を低く保ち、マルチパートのパート数とヘッダーを制限してください。RLIMIT_AS や RLIMIT_DATA は使用しないでください。
Abraxas Labs [email protected]