【緊急】PHPの重大な脆弱性「PHP2Shell」とは?影響・原因・対策を解説

PHP

PHPとは何かを解説したページはこちらです


スポンサーリンク
  1. 1. 脆弱性の概要と、開発者が知るべき理由
  2. 2. 脆弱性の基本情報
  3. 3. 脆弱性の技術的な仕組み:原因、発生条件、問題が起きる原理
    1. 1. CVE-2026-109618:RCE via OOM corruption
    2. 2. CVE-2026-109619:RCE via Stale Global State
    3. なぜアプリケーションコード(PHPスクリプト)側で防げないのか?
  4. 4. 想定されるセキュリティリスクと実際の影響
    1. セキュリティリスク
    2. 業界・社会への実際の影響
  5. 5. 影響を受ける環境・受けない環境と、その判断条件
    1. 影響を受ける条件
    2. 影響を受けない(対象外)条件
  6. 6. 対策方法:修正版、アップデート手順、暫定対策、注意事項
    1. 1. 根本対策:修正プログラムの適用(アップグレード)
      1. EOLバージョン(PHP 8.1以前)を利用中の場合
    2. 2. 暫定対策(即時アップグレードが不可能な場合の緩和策)
    3. 3. 注意事項・互換性確認
  7. 7. PHPエンジニア向け確認手順:バージョン確認、設定確認、修正後のテスト
    1. ステップ1:稼働中バージョンの正確な確認
    2. ステップ2:設定情報の確認
    3. ステップ3:修正後のテストと侵害調査(IoC確認)
  8. 8. よくある質問(FAQ)
    1. Q1. WordPress本体やプラグインを最新にアップデートすれば、この脆弱性は防げますか?
    2. Q2. うちのサイトはファイルアップロード機能やログイン機能を備えていませんが、安全ですか?
    3. Q3. レンタルサーバーを利用している場合、自分でPHPを更新する必要がありますか?
    4. Q4. サポート終了(EOL)している PHP 7.4 や 8.0 を使っています。どうすればいいですか?
    5. Q5. WAF(Web Application Firewall)を導入していれば、PHPのアップデートは不要ですか?
  9. 9. まとめ:優先すべき対応と重要事項
  10. 10. 参考資料・一次情報リンク
    1. 公開前の確認事項

1. 脆弱性の概要と、開発者が知るべき理由

2026年10月20日にThe PHP Groupより事前告知が行われ、日本時間の10月21日深夜(22:40〜23:00頃)に、PHPコアに潜む重大なセキュリティ脆弱性を修正する緊急アップデートが配信されました。

対象となった脆弱性は「CVE-2026-109618」および「CVE-2026-109619」の2件で、共通脆弱性評価システム(CVSS v4.0)の基本値は最高レベルに近い「9.2(Critical / 緊急)」と評価されています。セキュリティコミュニティでは、この2件を組み合わせた攻撃チェーンを「PHP2Shell」と呼称しています。

本脆弱性は、最先端AI(OpenAIの「GPT-5.6 Sol」やAnthropicの「Claude Mythos」を活用したスキャン)およびセキュリティ企業(Wiz、Calif等)の調査によって発見され、PHPコア内に10年以上潜在していたことが明らかになりました。

最大の問題点は、本脆弱性がWordPressやLaravelなどのフレームワーク・アプリケーション側のバグではなく、C言語で記述されたPHP言語の処理系本体(PHPコア)の不備である点です。そのため、ユーザーが記述したPHPスクリプト側で入力検証やサニタイズを完璧に行っていても攻撃を防ぐことができず、脆弱なPHPバージョン上で稼働しているだけで攻撃対象となり得ます。

本記事では、シニアエンジニアおよびセキュリティ担当者の視点から、本脆弱性の技術的構造、影響を受ける環境の判定、修正パッチの適用手順、および後検証(IoC確認)までを詳しく解説します。


2. 脆弱性の基本情報

項目内容
脆弱性名 / 通称PHPコアにおけるリモートコード実行脆弱性 / PHP2Shell
CVE番号CVE-2026-109618 (GHSA-w8hw-w9fx-j79w)CVE-2026-109619 (GHSA-6wmf-4rv5-p3rp)
深刻度(CVSS)CVSS v4.0 基本値 9.2 (Critical / 緊急)
公式公開日2026年10月21日 22:40〜23:00(日本時間)
影響を受ける製品PHPコア、およびWebリクエストを処理するPHP実行環境全般(PHP-FPM、Apache mod_php、php-cgi、FrankenPHP、LiteSpeed等)
影響を受けるバージョン・PHP 8.5系:8.5.12 未満・PHP 8.4系:8.4.27 未満・PHP 8.3系:8.3.36 未満・PHP 8.2系:8.2.35 未満・PHP 8.1以前:すべてのEOLバージョン(8.1, 8.0, 7.4, 7.x, 5.x等)
修正済みバージョンPHP 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35

※ 公式サポートが終了しているEOLバージョン(PHP 8.1以前)に対しては、本脆弱性の深刻さを考慮し、ソースコードレベルの最小限のバックポートパッチが提供されていますが、バイナリパッケージの更新は提供されません。サポート対象系列(8.2以上)への移行が強く推奨されます。


3. 脆弱性の技術的な仕組み:原因、発生条件、問題が起きる原理

本脆弱性は、特定ライブラリのロジックエラーではなく、PHPコアにおける不適切なメモリ管理・エラー処理(Use After Free)に起因します。

1. CVE-2026-109618:RCE via OOM corruption

  • 原因: 送信された巨大なリクエスト(POSTデータ等)の処理中に、メモリ上限(Out Of Memory: OOM)に達した際のエラー処理(longjmp / bailout ロジック)の不備に起因します。
  • 発生条件・原理: リクエスト処理中にOOMが発生すると、内部リクエストデータが不完全な状態のまま残存します。その後のクリーンアップ処理(後始末)において、解放済みまたは未初期化のメモリ領域を誤って正常な構造体として参照・操作してしまう(Use After Free)ことでメモリ破壊が起き、結果として任意コード実行に繋がります。

2. CVE-2026-109619:RCE via Stale Global State

  • 原因: リクエスト処理時のグローバルな状態管理の不備に起因します。
  • 発生条件・原理: あるHTTPリクエストで利用された内部状態が、メモリ解放後もグローバルコンテキストに残存します(Stale State)。同一のワーカープロセスが次のHTTPリクエストを処理する際、通常の初期化が行われる前にこの古い状態を誤って参照・利用してしまうことで Use After Free が引き起こされ、リモートコード実行が可能となります。

なぜアプリケーションコード(PHPスクリプト)側で防げないのか?

WebサーバーがHTTPリクエストを受信すると、PHPコアはユーザーが作成したPHPスクリプト(例: index.php)の1行目が実行されるより前の段階で、$_POST や $_FILES などのスーパーグローバル変数を生成・初期化します。

本脆弱性はこの前処理段階(PHPコア内)で発生するため、アプリケーション内でどれほど厳格なバリデーションやサニタイズを行っていても、スクリプトの評価前にメモリ破壊が成立してしまいます。


4. 想定されるセキュリティリスクと実際の影響

セキュリティリスク

  • 認証不要のリモートコード実行(RCE): 特別なログイン権限を持たない遠隔の第三者が、悪意のあるリクエストを送信するだけで発動します。
  • サーバーの完全乗っ取り: Webサーバーの実行権限(例: www-data)で任意のシステムコマンドを実行可能です。
  • 二次被害: データベース内の顧客個人情報・機密データの窃取、Webシェルの設置によるバックドア構築、マルウェア感染、内部ネットワークへの侵入拡大などに繋がります。

業界・社会への実際の影響

  • 情報の先行流出(フライング公開)と混乱: パッチ公開前にSNS上で脆弱性情報が一部拡散されたため、事前防御が急務となりました。
  • サービスの予防的停止: 日本国内では、金融機関の一部サービス停止、官公庁・自民党サイトの停止、民間Webサービス(BASE、コドモン、さくらインターネット、pixiv、Cygames等)で緊急メンテナンスが相次ぎました。
  • 攻撃の急増: Cloudflare等の観測によると、パッチ公開直後から数分〜数時間で数百万件規模の攻撃試行が観測されています。

5. 影響を受ける環境・受けない環境と、その判断条件

影響を受ける条件

  1. Webリクエストを処理するPHP環境:PHP-FPM、Apache mod_php、php-cgi、FrankenPHP、LiteSpeed などで動作している環境。
    • 特に Apache mod_php 構成は、アプリコードが起動する前に未認証リクエストで攻撃が成立するため、最も危険度が高いとされています。
  2. 対象バージョン:PHP 8.5.12 未満、8.4.27 未満、8.3.36 未満、8.2.35 未満、および 8.1 以前の全バージョン。
  3. PHP上で動くあらゆるCMS・フレームワーク:WordPress、Drupal、Laravel、Symfony、EC-CUBE等を利用している環境全般。

影響を受けない(対象外)条件

  1. 純粋な静的HTML/CSSのみで構築されたWebサイト(サーバー上でPHP処理系が動作していない場合)。
  2. 外部リクエストを受け付けない独立したCLIバッチ環境(※ただしWebサーバー経由やWebフックで起動されるものを除く)。
  3. すでに修正済みバージョン(8.5.12, 8.4.27, 8.3.36, 8.2.35)を適用完了している環境。
  4. Node.js, Python, RubyなどPHP以外のプログラミング言語のみで構築された環境。

6. 対策方法:修正版、アップデート手順、暫定対策、注意事項

1. 根本対策:修正プログラムの適用(アップグレード)

唯一の根本的解決策は、各系列の修正済みバージョンへのアップデートです。

  • PHP 8.5系 → 8.5.12 へ更新
  • PHP 8.4系 → 8.4.27 へ更新
  • PHP 8.3系 → 8.3.36 へ更新
  • PHP 8.2系 → 8.2.35 へ更新

EOLバージョン(PHP 8.1以前)を利用中の場合

サポート対象系(8.2以上)への速やかな移行を計画してください。直ちに移行できない場合は、提供されている最小限のソース用バックポートパッチを適用するか、OSディストリビューション(Red Hat、Ubuntu等)やサードパーティ延長サポート(TuxCare等)の提供するパッチを適用してください。

2. 暫定対策(即時アップグレードが不可能な場合の緩和策)

公式アドバイザリでは、パッチ適用までのリスクを低減する緩和策が示されています。ただし、これらは特定経路の露出を抑える限定的な措置であり、完全な代替にはなりません。

  • CVE-2026-109618 向け緩和策:
    • php.ini で memory_limit = -1(無制限)を指定し、アプリケーション側で変更不可にする。
    • post_max_size の値を低く制限する(アップロード不要なら 8M、必要な場合でも 32M 等)。
    • Webサーバーやプロキシ(Nginx, Apache等)の段階で、リクエストボディサイズやマルチパート通信(multipart/form-data)を遮断・制限する。
  • CVE-2026-109619 向け緩和策:
    • session.upload_progress.enabled = 0 を php.ini で無効化し、全ワーカープロセスを再起動する(※ ini_set() や .user.ini での設定は無効)。
    • PHP 8.5環境では fatal_error_backtraces = 0 を設定する。
  • アクセス制御・サービス停止:
    • WAF(Web Application Firewall)の緊急ルールの適用。
    • パッチ適用までの間、サービスを一時停止する(※検索エンジンへの影響を抑えるため、HTTPステータス 503 Service Unavailable を返却して停止すること)。

3. 注意事項・互換性確認

  • PHPのメジャー/マイナーバージョンを大きく上げる場合(例: PHP 7.4 → 8.2)、テーマ、プラグイン、自作コードの互換性エラー(廃止関数の呼び出し等)が発生する可能性があるため、検証環境でテストを行ってください。
  • 再起動の徹底: パッチ適用後は、必ず php-fpm や Apache などのプロセスの再起動を行ってください。再起動を行わないとメモリ上に古い処理系が残り続けます。

7. PHPエンジニア向け確認手順:バージョン確認、設定確認、修正後のテスト

ステップ1:稼働中バージョンの正確な確認

CLI環境とWebサーバー環境で参照しているPHPが異なる場合があるため、両方の経路で確認します。

  • CLI環境の確認: php -v
  • Web環境の確認:
    • phpinfo() を出力する一時スクリプトを作成してブラウザ経由で確認(※確認完了後は直ちに削除すること)。
    • WordPressの場合: 管理画面の「ツール」>「サイトヘルス」>「情報」>「サーバー」で現在Webサーバー上で動いているPHPバージョンを確認できます。

ステップ2:設定情報の確認

php.ini で主要パラメータを確認します。

php -i | grep -E "session.upload_progress.enabled|memory_limit|post_max_size"

ステップ3:修正後のテストと侵害調査(IoC確認)

  1. 動作テスト: ログイン、お問い合わせフォーム、ファイルアップロード、データベース連携などのコア機能が正常動作するかテストします。
  2. 侵害痕跡(IoC)の点検:
    • アクセスログ内に不自然に長い、または異常な値を含む PHPSESSID Cookie が存在しないか。
    • 不審な multipart/form-data リクエストの記録、およびその直前直後に発生したPHPメモリ上限エラー(OOM)や HTTP 500 エラーの履歴。
    • php-fpm や httpd ワーカープロセスが異常終了(クラッシュ)や不自然な頻繁再起動を起こしていないか。
    • Webの公開ディレクトリルート(/var/www/html 等)、アップロードフォルダ、/tmp 等に見知らぬ .php ファイル(Webシェル)や、改ざんされた .user.ini / auto_prepend_file が作成されていないか。

8. よくある質問(FAQ)

Q1. WordPress本体やプラグインを最新にアップデートすれば、この脆弱性は防げますか?

A. 防げません。 今回の脆弱性はWordPressに固有のものではなく、その土台である「PHPコア(処理系本体)」に存在します。WordPress本体やプラグインをどれだけ更新してもPHP自体の穴は塞がらないため、サーバー側のPHPバージョンを修正版(8.5.12, 8.4.27, 8.3.36, 8.2.35)へ更新する必要があります。

Q2. うちのサイトはファイルアップロード機能やログイン機能を備えていませんが、安全ですか?

A. 安全とは断言できません。 本脆弱性は、PHPコアがHTTPリクエストを受信してスーパーグローバル変数($_POST や $_FILES 等)を準備・初期化する段階(ユーザーコードが動く前のタイミング)で発動します。そのため、スクリプト内にファイルアップロード機能が存在しなくても、攻撃者が作成した悪意あるマルチパートリクエストを受信するだけで攻撃が成立する可能性があります。

Q3. レンタルサーバーを利用している場合、自分でPHPを更新する必要がありますか?

A. ご契約中のレンタルサーバー事業者の案内をご確認ください。 共有レンタルサーバー等の環境では、事業者側でサーバー全体のパッチ適用を順次実施しているケースが多いです。ただし、管理画面からユーザー自身で利用PHPバージョンを修正版へ切り替える操作が必要になる場合もあります。

Q4. サポート終了(EOL)している PHP 7.4 や 8.0 を使っています。どうすればいいですか?

A. サポート対象の PHP 8.2 以上への切り替えが強く推奨されます。 公式からはいわゆるバイナリのセキュリティアップデートは提供されません。直ちにバージョンアップが行えない場合は、WAFの適用や設定変更などの暫定措置を講じつつ、延長サポート(TuxCare等)やOSベンダーの独自バックポートパッチの適用状況を確認してください。

Q5. WAF(Web Application Firewall)を導入していれば、PHPのアップデートは不要ですか?

A. いいえ、アップデートは不可欠です。 WAFは攻撃リクエストを検知して遮断する一時的な緩和策に過ぎず、バイパス(回避)手法が存在するリスクがあります。PHP開発チームも「完全な解決策は修正版へのアップデートのみ」と明言しています。


9. まとめ:優先すべき対応と重要事項

  1. 利用状況の棚卸しと即時アップデート: 稼働中の全PHP環境を洗い出し、サポート対象系列のPHP(8.2〜8.5)は修正済みバージョン(8.5.12, 8.4.27, 8.3.36, 8.2.35)へ直ちに更新してください。
  2. ワーカープロセスの再起動: パッチ適用後は、必ず php-fpm や Apache 等のプロセスを再起動してください。
  3. 侵害痕跡の調査(IoC点検): 修正版の適用完了後も、パッチ適用前に不正侵入やWebシェルの設置が行われていなかったかアクセスログやファイルシステムの監査を実施してください。
  4. EOL環境の移行: PHP 8.1以前の環境は暫定措置を講じつつ、8.2以上への移行計画を優先して進めてください。

10. 参考資料・一次情報リンク


公開前の確認事項

  • 技術情報の精度点検: CVE識別子(CVE-2026-109618, CVE-2026-109619)、CVSS v4.0スコア(9.2)、対象および修正バージョン(8.5.12, 8.4.27, 8.3.36, 8.2.35)はすべてThe PHP Group、IPA、JPCERT/CC等の一次発表資料と厳密に整合していることを確認済みです。
  • 概念の分離: 本問題がWordPressや各種フレームワーク固有のバグではなく、PHPコア処理系(C言語層)のメモリ管理エラーである点、およびアプリケーション層のバリデーションでは防げない点を明確に区別して記載しています。
  • EOL版の補完防止: EOL(PHP 8.1以前)バージョンへの公式サポート対応状況(通常修正バイナリの提供なし、ソースコード用バックポートのみ提供)について事実に基づき正確に記述しています。