はじめのコラム㉖PHPの認証不要RCE脆弱性「PHP2Shell」(CVE-2026-109618・CVE-2026-109619)と対策について説明します!

コラム

WebサイトやWebアプリケーションの開発・運用にPHPを利用している方は、早急にセキュリティ対策を確認してください。

2026年10月21日、PHPにおいて、認証なしでリモートコード実行(RCE)を許す深刻な脆弱性「PHP2Shell」に関する情報が公開されました。対象となるのは、CVE-2026-109618およびCVE-2026-109619の2件で、いずれもCVSS v4.0のスコアは9.2と評価されています。攻撃者に悪用された場合、Webサーバー上で任意のコードを実行され、情報漏洩やシステムの乗っ取りにつながるおそれがあります。

本記事では、PHP2Shellの概要や攻撃の仕組み、影響を受ける環境について解説します。さらに、アクセスログやエラーログから攻撃の痕跡を調査する方法、インシデント発生時の初動対応、修正済みバージョンへのアップデート手順、WAFなどを利用した緩和策も紹介します。

PHPを利用したWebサイトやWordPressを運用している方、サーバーの保守・運用を担当しているエンジニアの方は、自社の環境が影響を受けるか確認し、速やかな対策に役立ててください。

なお、WAFによる防御や設定変更は、脆弱性そのものを解消するものではありません。修正済みバージョンへのアップデートを最優先に対応することが重要です。

ぜひ、最後までご覧いただけると嬉しいです!

PHP2Shellとは?脆弱性の概要と影響範囲

今回の脆弱性がどのようなものか、どのような仕組みで攻撃されるのかを解説します。「なぜ緊急なのか」「なぜ認証なしで攻撃が成立するのか」を理解することが、適切な対策を選択するための第一歩です。

脆弱性の基本情報

項目内容
CVE IDCVE-2026-109618、CVE-2026-109619
通称PHP2Shell
CVSS v4.09.2(Critical)
認証不要(未認証での攻撃が可能)
野生での悪用確認済み(watchTowr・Palo Alto Unit 42・Sansecが報告)
パッチ公開日2026年10月21日 14:00 UTC
発見者Wiz Research・Calif(独立して発見、PHPセキュリティチームへ報告)

影響を受ける環境

PHP-FPM、Apache(mod_php)、php-cgi、FrankenPHP、LiteSpeedを含む、Webリクエストを処理するすべてのPHP環境が対象です。PHP 5.4以降のすべてのバージョンが影響を受けます。

特に、mod_phpはアプリケーションのコードが実行される前に未認証のリクエストで攻撃をトリガーできるエクスプロイトが実証されています。ただし、すべての実行モードが高リスクであり、特定の環境のみが安全というわけではありません。

CVE-2026-109618(OOM破損によるRCE)の概要と攻撃メカニズム

<概要>
OOM(メモリ不足)の処理によって、内部リクエストデータが部分的にしか初期化されていない状態でPHPの実行が中断される問題。その後のリクエストクリーンアップ処理で、無効なデータが有効なものとして扱われます。なお、本脆弱性はメモリ情報を外部に漏洩させる二次的なリスク(Heartbleedに類似)も持ちます。

<攻撃の流れ>
攻撃者は、意図的にPHPのメモリ不足(OOM:Out of Memory)を引き起こすことで攻撃を成立させます。極端に巨大なペイロードや、無数の入力フィールド(マルチパートなど)を含む細工されたリクエストを送信し、PHPのメモリ割り当て制限(memory_limit)に到達させます。

リクエストデータの初期化が完了する前にOOMによって処理が強制中断されると、その後のクリーンアップ(後処理)ルーチンが実行されます。この時、PHPの内部エンジンが「まだ初期化されていない不完全なメモリ領域」を有効なデータと誤認して参照・処理しようとするため、メモリ破壊が発生し、最終的に攻撃者の用意した任意のコードが実行されてしまいます。

CVE-2026-109619(古いグローバル状態によるRCE)の概要と攻撃メカニズム

<概要>
リクエストが所有する内部状態が、バッキングメモリの解放後も残存する問題。同じワーカーで処理される後続のリクエストが、正常な初期化によってリセットされる前に、この古い状態を使用する可能性があります(Use-After-Freeに類似)。

<攻撃の流れ>
攻撃者はまず「第1のリクエスト」を送信し、セッションのアップロード進捗機能(session.upload_progress)や致命的エラーのバックトレース機能などを通じて特定の内部状態を作り出し、メモリを解放させます。しかし、この際にグローバルな状態(ポインタなど)が正しくリセットされずに残存します。

続いて、直ちに同じワーカーへ「第2のリクエスト」を送信します。第2のリクエストが正常に初期化処理を完了する前に、PHPエンジンが残存していた古い状態(すでに解放済みのメモリ)を参照してしまうことで、メモリ破損状態に陥り、コード実行へと繋がります。

自社環境への影響確認と攻撃痕跡の調査

すでに攻撃を受けていないか、ログから痕跡を調査する方法を解説します。対策を実施する前に、まず現時点での被害有無を確認することが重要です。攻撃を見つけた場合は第4章のインシデントレスポンスに進んでください。

PHPバージョンの確認(サーバー管理者向け)

サーバーのターミナル(CLI)から以下のコマンドを実行し、使用中のバージョンを確認してください。

php -v
# PHP-FPMを利用している場合は以下も確認
php-fpm -v

出力されたバージョンが 8.5.12、8.4.27、8.3.36、8.2.35 未満の場合はアップデートが必要です(8.1以前もパッチ未適用の場合は危険な状態です)。

ログから攻撃の痕跡(IoC)を調査する

CVE-2026-109618(OOM破損)の痕跡

  • PHPエラーログ:Allowed memory size of ... exhausted(メモリ枯渇)というFatal Errorが不自然に頻発していないか確認します。
  • アクセスログ:異常に大きな Content-Length を持つPOSTリクエストや、大量のマルチパートデータ送信を試みる不審なリクエストを探します。
  • サーバーログ:PHP-FPMやApacheのワーカープロセスがセグメンテーションフォールト(SIGSEGVなど)で異常終了し、再起動を繰り返しているログ(502 Bad Gateway / 503 Service Unavailableの頻発)がないか確認します。

CVE-2026-109619(古いグローバル状態)の痕跡

  • アクセスログ:同一のIPアドレスから、極端に短い間隔(ミリ秒単位など)で連続して送信される不自然なリクエスト群がないか確認します(1つ目で脆弱な状態を作り、直後の2つ目で悪用するため)。
  • WAF/リクエストログ:リクエストのペイロードやヘッダーに PHP_SESSION_UPLOAD_PROGRESS が意図せず含まれているものをスキャンします。
  • PHPエラーログ:意図的に発生させられたFatal Errorや、不自然なバックトレース関連のエラー出力がないか確認します。

侵害後の共通の痕跡(バックドア・Webシェル)

  • 新規に作成された見覚えのない .php ファイル(無作為な文字列のファイル名など)が公開ディレクトリ内にないか確認します。
  • Webサーバーのプロセス(www-data や nginx など)を親として、sh、bash、curl、wget などの不審な子プロセスが実行された痕跡がOSの監査ログ(auditdなど)やEDRに残っていないか確認します。

対策の実施――パッチ適用・緩和策・環境別の手順

対策には「パッチ適用(根本解決)」と「緩和策(応急処置)」の2種類があります。PHPは「アップデートのみが完全な解決策」と明言しており、緩和策はすべての攻撃経路を閉じるものではありません。環境に応じた手順を選択してください。

アップデート対象バージョン

以下の修正済みバージョンへ直ちにアップデートしてください。

PHPブランチ修正済みバージョン
PHP 8.58.5.12
PHP 8.48.4.27
PHP 8.38.3.36
PHP 8.28.2.35
PHP 8.1・8.0・7.4公式リリースなし。PHPセキュリティチーム提供のソースバックポートを適用

LinuxディストリビューションおよびLTSベンダーは事前にパッチを受け取っているため、提供元の更新パッケージを確認してください。

🇬🇧 英国NCSCのアドバイス:即時にパッチを適用できないシステムについては、一時的にオフラインにすることを検討するよう呼びかけています。

サーバー管理者:ソースコードからビルド・アップデートする手順

LTSベンダーからのパッケージ提供が待てない場合は、以下の手順で公式ソースコードから安全にコンパイル・アップデートを行います。

1. 公式ソースコードと署名の取得

必ず公式のダウンロードページ(https://www.php.net/downloads.php)からダウンロードします。

wget https://www.php.net/distributions/php-8.x.x.tar.gz
wget https://www.php.net/distributions/php-8.x.x.tar.gz.asc

2. GPG署名によるファイルの検証(必須)

# 鍵のインポート(リリース担当者の鍵IDを指定)
gpg --keyserver hkps://keyserver.ubuntu.com --recv-keys <Key_ID>
# 署名の検証("Good signature"が出力されることを確認)
gpg --verify php-8.x.x.tar.gz.asc php-8.x.x.tar.gz

3. コンパイルとインストール

既存のPHPのビルドオプション(php -i | grep "Configure Command" で確認可能)を引き継ぎつつビルドします。

tar -zxvf php-8.x.x.tar.gz
cd php-8.x.x
./configure --prefix=/usr/local/php ...
make
sudo make install

4. サービスの再起動

sudo systemctl restart php-fpm
sudo systemctl restart nginx  # または apache2

レンタルサーバー(共用サーバー)ご利用の方へ

エックスサーバー、さくらのレンタルサーバ、ConoHa、ロリポップなどの共用サーバーでWordPressを運用している場合、OSやPHPの根本的な管理はホスティング事業者が行っています。

  1. コントロールパネルでのPHPバージョン確認: 管理画面にログインし、「PHPバージョン設定」から修正済みバージョンへ切り替えます。
  2. 標準WAFの有効化: SiteGuardなどのWAF機能を「ON」にすることで、PHPエンジンに到達する前に不正なリクエストをブロックできる可能性が高まります。
  3. 事業者のアナウンス確認: 利用者権限(.user.ini や .htaccess)では今回の緩和策を完全に適用できません。事業者のサポートページやメンテナンス情報をこまめに確認し、指示に従ってください。

即時アップデートが不可能な場合の緩和策

⚠️ 注意: PHPは「アップデートのみが完全な解決策」と明言しています。以下はあくまで一時的なリスク軽減策です。

CVE-2026-109618(OOM破損)の緩和策

  • memory_limit=-1 に設定する。PHPのメモリ上限によるOOMが発生しなくなり、今回の脆弱性トリガーを防ぎます。FPMプールやApache設定(php_admin_value)などで、アプリケーション側から上書きできないよう強制してください。
  • post_max_size を低く設定する。ファイルアップロードが不要な場合は 8M、必要な場合は 32M に設定し、upload_max_filesize はそれ以下に制限します。
  • コンテナやcgroupの制限を利用し、影響を受けたワーカーのみを強制終了するポリシーを適用します(RLIMIT_AS や RLIMIT_DATA は使用しない)。

CVE-2026-109619(古いグローバル状態)の緩和策

  • session.upload_progress.enabled=0 に設定し、すべてのワーカーを再起動する(ini_set() や .user.ini は不可。php.iniやサーバー設定で行う必要があります)。
  • PHP 8.5の場合、fatal_error_backtraces=0 に設定してワーカーを再起動する。
  • コールバックやアップロード処理の失敗など、攻撃者が到達可能な致命的エラー(Fatal Error)や実行タイムアウトを修正する。

WAF・リバースプロキシによる多層防御

  • 異常なサイズや構造のリクエストを遮断(CVE-2026-109618対策): デコード後のリクエスト全体サイズ・入力フィールド数・マルチパートのパート数・HTTPヘッダーの数とサイズ・ネストの深さを制限し、有効な Content-Length を持たないリクエストを破棄します。
  • 既知の攻撃ベクトルのブロック(CVE-2026-109619対策): PHP_SESSION_UPLOAD_PROGRESS を含むリクエストペイロードや、意図的にFatal Errorを引き起こすような異常なパラメータ構造を検知・ブロックするWAFシグネチャを適用します。

現在の設定値は以下のコマンドで確認できます。

# メモリ制限(CVE-2026-109618 緩和策関連)
php -i | grep memory_limit

# POSTサイズ制限(CVE-2026-109618 緩和策関連)
php -i | grep post_max_size

# セッションアップロード進捗(CVE-2026-109619 緩和策関連)
php -i | grep session.upload_progress.enabled

侵害を発見した場合の初動対応と今後の継続的な備え

万が一攻撃の痕跡を発見した場合の対応手順と、今後同様の脆弱性が発生した際に素早く対応するための情報収集体制について解説します。インシデント対応は「早さ」と「正確さ」が被害の拡大を左右します。

攻撃の痕跡を発見した場合の初動対応

1. ネットワークからの切り離し(隔離)

被害を受けたサーバーを直ちに外部ネットワークから遮断します。この際、フォレンジック調査のためにサーバーの電源は落とさず稼働状態を維持してください。

2. 証拠の保全

現在のメモリダンプ、ディスクのスナップショット、アクセスログ、エラーログ、OSのシステムログなどを安全な別のストレージにバックアップ・保全します。攻撃者がログを改ざん・消去する前に確保することが重要です。

3. 被害範囲の特定

保全したデータを元に、攻撃者がいつ侵入し、どのファイルにアクセスしたか(機密情報の窃取があったか)、ネットワーク内の他のサーバーへ横展開(ラテラルムーブメント)していないかを調査します。

4. システムの再構築と復旧

侵害されたサーバーはマルウェアが残留している可能性が高いため、既存の環境をそのままアップデートするのではなく、安全が確認されている過去のバックアップからシステムをクリーンな状態で再構築します。その上で最新のPHPパッチを適用してからネットワークに再接続します。

5. 関係各所への報告

個人情報や顧客データが漏洩した可能性がある場合は、速やかに経営陣、法務、関連当局(警察や個人情報保護委員会など)、および影響を受ける顧客へ報告を行います。

今後の脆弱性情報をいち早くキャッチするために

  • PHP公式アナウンスリスト(php-announce):セキュリティに関する緊急告知が直接届く公式のメーリングリストです。最も信頼性が高く、一次情報として推奨されます。
  • GitHub Security Advisories:php/php-src リポジトリの「Security」タブでは、CVE情報と共に技術的背景や修正パッチの内容がいち早く公開されます。リポジトリの通知設定(Watch機能)で「Security alerts」を有効にしておきましょう。
  • 国内のセキュリティ機関(JPCERT/CC・JVN):JPCERT/CCのアラートメールやJVN(Japan Vulnerability Notes)のRSSフィードを購読することで、国内向けの影響範囲や対策サマリーを素早く確認できます。
  • 脆弱性スキャンツールの導入(SCA):サーバー上で稼働しているPHPのバージョンやライブラリを監視し、NVD等のCVEデータベースと照合して自動でアラートを上げるツール(Trivyなど)をCI/CDやサーバー運用フローに組み込むことを推奨します。

まとめ

今回は、下記4点について説明しました。

  1. PHP2Shellとは?脆弱性の概要と影響範囲
  2. 自社環境への影響確認と攻撃痕跡の調査
  3. 対策の実施――パッチ適用・緩和策・環境別の手順
  4. 侵害を発見した場合の初動対応と今後の継続的な備え

本記事では、PHPの深刻な脆弱性「PHP2Shell」(CVE-2026-109618、CVE-2026-109619)について、攻撃の仕組みから検知方法、具体的な対策まで解説しました。

今回の脆弱性は、認証を必要とせずにリモートコード実行を許す可能性があり、悪用された場合にはWebサーバーの乗っ取りや機密情報の漏洩など、重大な被害につながるおそれがあります。PHP-FPMやApache(mod_php)など、Webリクエストを処理するPHP環境を運用している場合は、実行方式だけで安全性を判断せず、影響の有無を確認する必要があります。

対策として、特に重要なのは次の4点です。

  • 修正済みバージョンへのアップデート:PHPの公式情報や利用しているOS・ディストリビューションのセキュリティ情報を確認し、適切な修正プログラムを速やかに適用する。
  • 攻撃の痕跡の調査:アクセスログやPHPエラーログを確認し、不審なリクエスト、メモリ枯渇エラー、プロセスの異常終了などが発生していないか調査する。
  • 多層防御の実施:WAFやリバースプロキシによるリクエスト制限、不要な機能の無効化などを組み合わせ、パッチ適用までのリスクを軽減する。
  • 侵害が疑われる場合の対応:サーバーの隔離と証拠保全を行い、影響範囲を調査したうえで、安全な環境への再構築や認証情報の変更など、必要な復旧措置を実施する。

また、レンタルサーバーでWordPressなどを運用している場合も、ホスティング事業者のセキュリティ情報を確認し、利用者側で対応できる設定変更やバージョンの切り替えを進めることが大切です。

セキュリティ対策では、脆弱性の情報を把握するだけでなく、影響を受ける資産を特定し、修正プログラムの適用から適用後の確認までを確実に実施することが重要です。 今回のような緊急性の高い脆弱性に備え、PHP公式のアナウンスやJPCERT/CCなどの情報を継続的に収集できる体制も整えておきましょう。

これからも、Macのシステムエンジニアとして、日々、習得した知識や経験を発信していきますので、是非、ブックマーク登録してくれると嬉しいです!

それでは、次回のブログ!

タイトルとURLをコピーしました