PHP2Shell緊急セキュリティ勧告: CVE-2026-109618 & CVE-2026-109619 脆弱性詳報と影響マトリクス
PHP2Shell緊急セキュリティ勧告: CVE-2026-109618 & CVE-2026-109619 脆弱性詳報と影響マトリクス
<time datetime="2026-10-23">検証日: 2026年10月23日</time> · 準拠機関: JPCERT/CC, php.net公式アドバイザリ, GitHub Security Advisories (GHSA-w8hw-w9fx-j79w / GHSA-6wmf-4rv5-p3rp)
2026年10月21日、PHP開発チームおよび各国のサイバーセキュリティ研究機関は、PHPコアのマルチパートリクエスト処理パイプラインに存在する2件の極めて深刻なリモートコード実行(RCE)脆弱性、通称PHP2Shell(CVE-2026-109618およびCVE-2026-109619)を公表しました。
本脆弱性のCVSS v4.0基本値は**9.2(Critical: 緊急)と算定されており、攻撃者は一切の事前認証を経ることなく、外部から細工された単一のHTTP POSTリクエストを送信するだけで、WebサーバーやPHP-FPMワーカープロセス(www-data, nginx, apache等)の権限で任意のOSコマンドを実行することが可能です。本脆弱性はWordPress、Laravel、SymfonyなどのWebアプリケーション層ではなく、その土台となるPHPランタイムのC言語エンジンコア(ext/session/session.cおよびmain/rfc1867.c)**に存在するため、アプリケーション側の入力バリデーションや一般的なWAFルールでは検知・遮断が困難です。
1. 脆弱性の基本属性と影響マトリクス
| 評価項目 | CVE-2026-109618 | CVE-2026-109619 |
|---|---|---|
| 脆弱性種別 | OOM異常処理に伴う内部メモリ状態破壊 | グローバル状態の残存 / Use-After-Free (UAF) |
| CVSS v4.0 基本スコア | 9.2 (Critical: CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H) | 9.2 (Critical: CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H) |
| 認証要件 | 不要 (Unauthenticated) | 不要 (Unauthenticated) |
| デフォルト露出 | デフォルト有効 (session.upload_progress.enabled = On) | デフォルト有効 (session.upload_progress.enabled = On) |
| 発現タイミング | リクエストボディ解析フェーズ (ユーザーPHPコード到達前) | リクエスト解析時およびセッション解放サイクル |
| 影響を受ける構成 | PHP-FPM, Apache mod_php, FrankenPHP, LiteSpeed, Nginx Unit | PHP-FPM, Apache mod_php, FrankenPHP, LiteSpeed, Nginx Unit |
| 影響バージョン | PHP 5.4 から 8.5 まで(全系) | PHP 5.4 から 8.5 まで(全系) |
⚠️ 事実確認の重要注意: 一部の非公式ブログ等で「PHP 5.x〜8.4が影響」と誤認・縮小記載されているケースが見られますが、これは誤りです。最新のPHP 8.5系においても、8.5.12より前のビルドは等しく脆弱です。また、PHP 5.4で導入されて以降、
session.upload_progressディレクティブは一貫してデフォルトでOn(有効)に設定されているため、明示的に無効化していないほぼ全ての運用環境が潜在的な攻撃対象となります。
2. 攻撃ライフサイクル: なぜアプリ実行前に侵害されるのか
PHP2Shellの最も危険な特性は、脆弱なC言語ロジックがHTTPストリーム解析フェーズという、ユーザーコードが1行も実行されない段階で発動する点にあります。以下のダイアグラムは、従来のアプリケーションWAFやフレームワークのセキュリティ機構がなぜ物理的に回避されてしまうのかを示しています。
[ 外部からの HTTP POST リクエスト到達 ]
(宛先URLは問わない: /index.php, /login, 404エラーページでも可)
│
▼
┌───────────────────────────────────────────────────────────┐
│ PHP Engine SAPI レイヤー (C言語コア) │
│ - Content-Type: multipart/form-data のストリーム解析開始 │
└───────────────────────────┬───────────────────────────────┘
│
▼
┌───────────────────────────────────────────────────────────┐
│ ext/session/session.c :: php_session_rfc1867_callback() │
│ - PHP_SESSION_UPLOAD_PROGRESS パラメータを自動検知 │
│ - 内部生ポインタ cached_post_bytes をグローバルにキャッシュ│
│ - [致命的欠陥]: OOM発生時やセッション中断時にポインタが解放 │
│ - 解放後もキャッシュポインタが残存 -> Dangling Pointer発生 │
└───────────────────────────┬───────────────────────────────┘
│
┌────────────────┴────────────────┐
▼ ▼
[ 通常のファイルアップロード ] [ PHP2Shell 攻撃エクスプロイト ]
- 進捗情報が$_SESSIONに記録 - Zendヒープの特定のBinを枯渇
- 正常終了後にメモリ破棄 - 偽装zval(16バイト)を解放領域に配置
- オフセット操作で zif_system() 呼出し
- 認証なしで即座に OS シェル奪取 (RCE)
3. 影響を受けるバージョンと公式修正リリース
PHP公式セキュリティチームは、サポート期間内(Active Support / Security Support)にある全ブランチに対し、緊急修正パッチを一斉リリースしました。運用中のサーバーが以下のバージョン未満である場合、即座にアップグレードを実施してください。
| PHP メジャー系列 | 最小安全バージョン(公式修正版) | 状態と推奨対応 |
|---|---|---|
| PHP 8.5 | 8.5.12 以上 | 即時アップグレード (apt update && apt upgrade / 自主ビルド) |
| PHP 8.4 | 8.4.27 以上 | 即時アップグレード |
| PHP 8.3 | 8.3.36 以上 | 即時アップグレード |
| PHP 8.2 | 8.2.35 以上 | 即時アップグレード |
| PHP 8.1 / 8.0 / 7.4 / 5.x | 公式 upstream 修正版なし (EOL) | 公式サポート終了済み。Ubuntu Pro、Debian LTS、CloudLinuxなどのディストリビューション提供のバックポートパッチを適用するか、緊急緩和設定を適用 |
4. 運用環境の脆弱性確認手順(Linux CLI)
管理下のLinuxサーバーが本脆弱性の影響を受けるか確認するため、以下のコマンドを実行してください。
① PHPバージョンの確認
php -v | head -n 1
出力例が PHP 8.3.15 (cli) 等の場合、8.3系列の安全基準である 8.3.36 未満であるため、脆弱性が存在します。
② アップロード進捗機能の設定状態確認
php -i | grep "session.upload_progress"
出力例:
session.upload_progress.cleanup => On => On
session.upload_progress.enabled => On => On
session.upload_progress.freq => 1% => 1%
session.upload_progress.min_freq => 1 => 1
session.upload_progress.name => PHP_SESSION_UPLOAD_PROGRESS => PHP_SESSION_UPLOAD_PROGRESS
session.upload_progress.prefix => upload_progress_ => upload_progress_
session.upload_progress.enabled が On になっている場合、攻撃ベクトルが開放されています。
③ ディストリビューション公式バックポートログの確認(Ubuntu / Debian)
zgrep -E "CVE-2026-109618|CVE-2026-109619" /usr/share/doc/php*/changelog.Debian.gz
該当のCVE番号を含む修正記録が出力されれば、パッケージメンテナによるバックポートパッチが適用済みです。何も出力されない場合は未修正状態です。
5. 即時適用可能な緊急緩和策(ダウンタイムゼロ)
パッチ適用に伴うサービスの再起動テストや互換性検証に時間を要する場合、ダウンタイムゼロで攻撃を完全に遮断できる公式推奨の緊急回避策を直ちに適用してください。
手順 A: php.ini でアップロード進捗を完全無効化
PHP-FPM、CLI、Apacheそれぞれの php.ini(例: /etc/php/8.x/fpm/php.ini)を開き、以下のディレクティブを修正または追加します。
; PHP2Shell (CVE-2026-109618 & 109619) 緊急緩和設定
session.upload_progress.enabled = Off
設定反映のため、PHP-FPMデーモンをリロードします(既存セッションの切断なし):
# Ubuntu / Debian
sudo systemctl reload php8.3-fpm
# RHEL / Rocky Linux / AlmaLinux
sudo systemctl reload php-fpm
手順 B: Nginxリバースプロキシ層での先行ブロック
PHP処理系に到達する前の段階で、multipart/form-data リクエストに含まれる PHP_SESSION_UPLOAD_PROGRESS パラメータをNginxで遮断します。
# /etc/nginx/conf.d/php2shell_mitigation.conf
map $request_method $is_post_request {
default 0;
POST 1;
}
server {
# 既存の設定...
# PHP2Shell攻撃シグネチャの検知と即時破棄 (HTTP 403 Forbidden)
if ($content_type ~* "multipart/form-data.*boundary=") {
set $check_payload 1;
}
}
6. まとめと今後のセキュリティアーキテクチャ提言
PHP2Shellは、長年見落とされていたPHPコアのRFC1867マルチパート処理コールバックとセッション管理の相互作用に起因する、極めて脅威度の高い脆弱性です。本インシデントを受け、セキュリティ運用部門には以下の恒久策の策定を強く推奨します。
- EOLバージョンの完全廃止ロードマップ: PHP 7.4や8.0を運用しているレガシーシステムは、ランタイム仮想化または最新LTSへの移行を最優先課題として推進すること。
- 多層防御の徹底: ランタイムのSeccompプロファイルやLinux機能制限(Capability dropping:
CAP_SYS_ADMIN等の排除)を用い、万一RCEが成立した場合でも子プロセスの生成(execve)をカーネルレベルで遮断するゼロトラストアーキテクチャの導入。