PHP2Shell ヒーローカード:失敗したリクエストからリモートコード実行まで、CVE-2026-109618 および CVE-2026-109619
Engineering & Research

OrcaCyber Research - PHP2Shell:失敗したリクエストがいかにしてリモートコード実行になったか

著者

Rowan Sterling

公開日

最新モデル · 20すべてのモデルを見る →
ベンチマーク:Artificial Analysis · 毎日更新
すべての記事に戻る

本調査における概念実証は、OrcaCyber ZeroおよびOrcaCyber Ultraモデルを用いて作成されました。研究バンドルには、ソースレベルの分析、適応された公開エクスプロイトを用いた制御された再現、メモリ開示のアーティファクト、プロセスクラッシュ、およびコマンド実行の証拠が記録されています。提供されたファイルには、各モデルがどのステップを実行したかを独立に記録したものはありません。モデルの帰属は研究チームによって提供されています。

致命的なメモリ不足状態は、リクエストを安全に終了させるべきです。ここでは、ネイティブ状態が部分的にしか初期化されていない間にPHPを中断させる可能性があり、次のリクエストまで存続する参照を残しました。その結果、テスト環境では、情報漏えいからリモートコード実行に至るまでの影響を伴う、リクエスト間のメモリライフタイム違反が発生しました。

主要なエビデンスを一目で

• ターゲット — PHP 8.4.26、Apache/mod_php、単一ワーカー、隔離されたDockerラボ。

• クラッシュログ — 提供された抜粋には、1件のSIGABRTと3件のSIGSEGVによるワーカーの終了が含まれています。

• HTTPレスポンス — URLデコードされたPHPSESSID値で819,200バイト。

• 実行証明 — code>uid=33(www-data) gid=33(www-data) groups=33(www-data)/code>.

• リグレッション — このレポートは、パッチ適用済みの PHP 8.4.27 に対する4回の失敗した試行について説明しています。生の実行結果は同梱されていません。

出典:アップロードされた REPORT.md、crash_evidence.log、leak_attempt.resp、および rce_proof_8426.txt。以下に説明する展示物は、これらの成果物を組版された証拠パネルとして再現したものであり、写真やネイティブのターミナルスクリーンショットではありません。

1. 脆弱性:リクエスト境界における所有権の失敗

2つの関連する問題は、中断されたリクエスト初期化と、古くなったランタイムグローバルポインタに関するものです。関連するPHPアーキテクチャでは、multipart/form-dataの処理とセッションのアップロード進捗コールバックは、通常のユーザーアプリケーションコードより前に実行されることがあります。code>zend_bailout()/code>を含む例外的な制御フロー遷移により、想定されるクリーンアップがスキップされ、後で解放または再利用されるメモリを指す状態が残る可能性があります。

セキュリティ不変条件: リクエストBに公開されるワーカーグローバル参照は、所有権とライフタイムがリクエストAとともに終了したメモリを決して参照してはならない。報告された障害はこの不変条件に違反している。

実証されたエンドポイントは、単に OK を返すだけの最小限の PHP ページでした。このエクスプロイトの筋書きは、アプリケーション層の SQL インジェクション、ファイルインクルード、あるいはデシリアライズのエンドポイントには依存していませんでした。

2. 技術的な順序

• A1 — 中断。 マルチパートおよびアップロード進捗の処理がクリーンアップ中にOOMを引き起こし、古いセッション状態が残ります。

• B1 — リーク。後続のリクエストにより、セッションCookieのシリアル化が有効なセッションIDを超えて読み取られます。

• アドレス復元。 漏洩したポインタ値を使用して、そのビルドにおける関連するライブラリとヒープのレイアウトを推測します。

• A2/B2 — 破損。 さらに、2リクエストのシーケンスが、シャットダウン時に使用された古いデータを形成し、リダイレクトします。

• 結果。 改変された公開エクスプロイトは、コマンド実行を www-data として報告します。

Five-step diagram of the PHP2Shell chain from OOM interruption to command execution as www-data, reconstructed from the research bundle

証拠資料:提供されたファイルが実際に示している内容

証拠A — Apacheログからのワーカー終了

• code>[core:notice] [pid 1:tid 1] AH00051: child pid 54 exit signal Abort (6), possible coredump in /etc/apache2/code>

• code>[core:notice] [pid 1:tid 1] AH00051: child pid 55 exit signal Segmentation fault (11), possible coredump in /etc/apache2/code>

• code>[core:notice] [pid 1:tid 1] AH00051: 子プロセス pid 58 がシグナル Segmentation fault (11) で終了しました。コアダンプが /etc/apache2 に生成された可能性があります/code>

• code>[core:notice] [pid 1:tid 1] AH00051: 子プロセス pid 61 がシグナル Segmentation fault (11) で終了しました。/etc/apache2 にコアダンプが存在する可能性があります/code>

crash_evidence.log からの組版抜粋(2026年10月23日)。複数のワーカー終了はメモリ安全性の障害を裏付けるが、クラッシュのみでは RCE を立証しない。

• code>HTTP/1.1 200 OK/code>、バイナリデータは省略。

• code>Server: Apache/2.4.69 (Debian)/code>

• code>X-Powered-By: PHP/8.4.26/code>

• code>Set-Cookie: PHPSESSID=[バイナリデータ省略]/code>

• エンコードされたCookieの長さ: 2,330,754バイト。

• URLデコード後の値: 819,200バイト

測定値は leak_attempt.resp から直接計算されています。漏洩したプロセスの内容を再現しないよう、バイナリ値は意図的に省略されています。

別紙C — 実行証明

code>uid=33(www-data) gid=33(www-data) groups=33(www-data)/code>

rce_proof_8426.txt の内容は、提供されたとおりの正確なものです。これは報告された実行結果を裏付けるものですが、完全なコマンド/セッションのトランスクリプトではありません。

Evidence summary card: four worker exits, an 819,200-byte URL-decoded session cookie, and uid=33 execution context

別紙D — セッションライフサイクルの修正

• code>static inline void php_rinit_session_globals(void)/code>

• code>@@ -121,6 +120,7 @@ static inline void php_rinit_session_globals(void)/code>

• code>* ユーザーがいないとき、RINIT より前のリクエスト起動時にセッションを再エンコードします/code>

• code>/* RINIT より前に実行される: ユーザーコードを呼び出してはならない。php_session_unserialize_init() を参照 *//code>

• code>/* これはRINITより前に実行されるため、これらを早めにクリアする必要があります *//code>

• code>php_rinit_session_globals();/code>

session.c.diff から選択されたソース差分の行です。この変更は、通常の RINIT よりも早い段階でセッション全体の状態を明示的にリセットします。

3. 証拠が重要な理由

メモリ開示は、プロセスクラッシュとエクスプロイトチェーンの間の橋渡しを提供する。バイナリデータが埋め込まれた異常なサイズのセッション値は、ランタイムが無効なメモリをZend文字列として解釈していることと整合する。調査レポートはさらに、漏えいしたウィンドウからコードアドレスとヒープアドレスを抽出することについて述べている。証拠バンドルには生のレスポンスは含まれているが、復元されたすべてのアドレスを証明するスタンドアロンのスクリプトは含まれていない。

RCE の成果物は www-data のセキュリティコンテキストを示している。これは root アクセスや本番環境の侵害、あるいは任意の PHP デプロイへの完全な移植性を立証するものではない。単一ワーカーのラボ構成が重要であるのは、リクエストの順序付けとワーカーへのアフィニティがこのメカニズムに影響するためだ。

4. 症状だけでなく、根本的なライフサイクルに対する修正

提供された PHP パッチコミット 01a40e89fbfc(「bailout による状態破損を回避」)のソース差分は、セッショングローバルの早期初期化、アロケータの OOM 処理の変更、およびより広範なリセット/クリーンアップロジックを示しています。これらの変更は、中断されたリクエストを経てもネイティブ状態が無効な状態のまま存続することを防ぐことを目的としています。Cookie エンコード経路のみを修正しても、それ自体ではこのメモリ所有権の保証を復元することにはなりません。

調査報告書は、PHP 8.4.27 に対する試行では、4回の試行において異常なCookie、クラッシュ、またはRCEの証明は得られなかったと述べている。実際の修正版のトランスクリプトは本バンドルに含まれていないため、その比較は独立に検証可能な証拠資料ではなく、研究者の観察として報告されている。

5. 防御的行動

• 直ちに対応してください。影響を受けるサポート対象のPHP系をセキュリティ修正済みリリースへアップグレードし、ベンダーのアドバイザリで正確なパッケージの状況を確認してください。

• 露出の低減。マルチパート入力の制限や、未使用時のcode>session.upload_progress/code> の無効化を検討してください。ただし、これらはパッチの代替にはなりません。

• 検出。リクエスト初期化中のクラッシュ、予期しない500エラー、およびサイズ超過のcode>Set-Cookie/code>レスポンスヘッダーを確認します。

• 保証. 本番環境を代表するワーカープールで再テストし、古いセッション状態がリクエストをまたいで保持されないことを検証します。

6. OrcaCyberの調査方法論

価値ある研究課題は、個々の安全でない操作を見つけることだけではなく、リクエスト解析、アロケータの挙動、永続的なネイティブグローバル、シリアライゼーション、シャットダウンにまたがる完全な不変条件違反を追跡することである。本調査では、研究チームが帰属を明示したとおり、PoCの作成にOrcaCyber ZeroとOrcaCyber Ultraが使用された。公開された成果物群は技術的再現を支えるが、モデルごとの実行トレースを提供するものではなく、自律的な脆弱性発見を証明するものでもない。

エビデンスの階層:ソース仮説 → 到達可能なトリガー → 実行時障害 → 情報漏えい → 実行証明 → 修正版での回帰確認。この順序により、脆弱性の説明やクラッシュのみの結果よりも強い確信が得られる。また、ソースファイルや生の実行ログが存在しない場合には、不確実性を明確に報告することを促す。

7. 適用範囲と制限事項

本出版物は、認可された隔離されたDockerラボについて説明するものです。このエクスプロイトは、以前に公開されたPHP2Shellの研究に基づいており、提供されたレポートにローカルでの適応内容が記載されています。このバンドルには、スクリプト、差分、レスポンスバイト、ログ、および証明出力が含まれていますが、上流のエクスプロイトの完全なチェックアウト、ネイティブのスクリーンショット、および完全な生のパッチ回帰トランスクリプトは含まれていません。実世界の被害者や顧客の侵害は主張していません。

ソースと成果物

主要: 提供された php2shell-report-bundle.tar.gz(REPORT.md、report-CVE-2026-109618.md、report-CVE-2026-109619.md、crash_evidence.log、leak_attempt.resp、rce_proof_8426.txt、PHP ソース差分)。公開コンテキスト: PHP セキュリティアドバイザリ GHSA-w8hw-w9fx-j79w および GHSA-6wmf-4rv5-p3rp、PHP セキュリティリリースのお知らせ。公開エクスプロイトの出典: 9bie/php2shell-bypass-aslr-exp。研究リポジトリ: orcacyber-php2shell-research。

The public orcacyber-php2shell-research GitHub repository README on the OrcaCyber PHP2Shell defender research artifacts and its defensive scripts

要点:1つのリクエストが失敗し、ポインタが残存し、次のリクエストがそれを信頼した。この脆弱性を理解する上で難しいのは、そのつながりを観測可能な証拠によって立証することだ。

この記事で比較したモデル1

この記事から検出