【ITニュース解説】PHP2Shell: Two Critical PHP RCE Flaws and What to Do in the First Hour
2026年10月30日に「Dev.to」が公開したITニュース「PHP2Shell: Two Critical PHP RCE Flaws and What to Do in the First Hour」について初心者にもわかりやすく解説しています。
ITニュース概要
PHPに「PHP2Shell」と呼ばれる深刻なリモートコード実行の脆弱性が2件見つかった。多くのPHPバージョンが影響を受け、ログインなしで攻撃される恐れがある。既に攻撃も確認されているため、PHP利用者は速やかに最新版へアップデートするか、暫定対策を適用する必要がある。
ITニュース解説
最近、多くのウェブサイトで利用されているプログラミング言語PHPに、非常に危険な脆弱性が2つ発見され、その修正版が緊急リリースされた。これらの脆弱性は「PHP2Shell」と総称され、悪用されると、攻撃者が遠隔からサーバー上で任意のプログラムを実行できる可能性(RCE: Remote Code Execution)があるため、早急な対応が求められる。
一つ目の脆弱性(CVE-2026-109618)は、PHPがメモリ不足に陥った際に発生する。PHPはメモリが足りなくなると処理を中断するが、このとき、まだ完全に準備されていない(初期化されていない)データがメモリ内に残ってしまう場合がある。残された不完全なデータが後続の処理で誤って使われると、プログラムが予期しない動作を起こし、最終的に攻撃者がサーバー上で悪意のあるコードを実行できる状態になるというものだ。特にファイルアップロードなどで使われる「multipart解析」という処理中にこの状態を引き起こしやすいことが指摘されている。
二つ目の脆弱性(CVE-2026-109619)は、PHPがウェブサーバーと連携する際に使われる「永続ワーカー」という仕組みと関連している。永続ワーカーは、前のリクエストで使ったメモリや状態を保持して次のリクエストに再利用することで、処理を高速化する。しかし、この脆弱性では、以前のリクエストで使われて解放されたはずのメモリ領域を指す古い情報(「stale global state」と呼ばれる)が誤って残ってしまい、次のリクエストでその古い情報が初期化される前に使われてしまうことで、攻撃者が悪意のあるコードを実行できてしまう。PHP 8.5の特定のログ設定や、セッションアップロード進捗機能がこの脆弱性の引き金となることが確認されている。これら二つの脆弱性はいずれもPHP本体のメモリの扱い方に関するバグであり、フレームワークやプラグイン、あるいは利用者が書いたアプリケーションコードに問題があるわけではない。
これらの脆弱性は、PHP 8.2、8.3、8.4、8.5の特定のバージョン未満の、ウェブサーバーとして機能するすべてのPHPインストールに影響する。具体的には、PHP-FPM、Apacheのmod_phpモジュール、php-cgi、FrankenPHP、LiteSpeedなど、ウェブのリクエストをPHPで処理するあらゆる環境が危険にさらされる。特にApacheのmod_php環境では、アプリケーションコードが実行される前に攻撃が成立する可能性が示されており、非常に高いリスクがある。脆弱性の深刻度を示すCVSSスコアは9.2(最高は10.0)と評価されており、ログインなしで攻撃が可能である点も危険性を高めている。現在公式サポートが終了しているPHP 8.1以前のバージョンも、ディストリビューションによっては修正がバックポートされている場合があるため、自身の環境を確認することが重要だ。
さらに懸念されるのは、この脆弱性が公表される前から、Amazonの脅威インテリジェンスチームが攻撃の試みを検知していたことだ。修正版がリリースされた後も、数時間以内に脆弱性を悪用する実証コード(PoC: Proof of Concept)が出回り、すでに広い範囲で実際のシステムに対する攻撃が試みられている。このため、自社のPHP環境が攻撃者に見つけられていないかではなく、すでに修正されているかどうかが問われる状況だと言える。
このような状況を受け、システムエンジニアとしてまず最初にやるべきことは、自分のウェブサービスが実際にどのPHPバージョンで動いているのかを正確に特定することである。コマンドラインで「php -v」と入力して表示されるバージョンは、必ずしもウェブサーバーが使っているPHPのバージョンと同じではない可能性がある。ウェブサーバーの実行環境、コンテナイメージのタグ、デプロイ設定、CI/CDの設定などを確認し、リクエストを処理している実際のPHPランタイムバージョンを把握することが極めて重要だ。
次に、可能な限り速やかに修正済みのPHPバージョン(8.5.12、8.4.27、8.3.36、8.2.35)へアップデートするか、利用しているOSのディストリビューションが提供する修正済みのパッケージを適用する。PHPプロジェクトは、このアップデートが両方の脆弱性に対する唯一の完全な修正策であると明言している。特にDockerなどのコンテナ環境を使用している場合は、単にコンテナを再起動するだけでは何も変わらないため、必ず修正済みのベースイメージから新しいイメージを再構築し、コンテナを作り直す必要がある。
もし、すぐにアップデートできない場合は、あくまで一時的な対策として以下の設定変更を行うことが推奨される。ただし、これらは部分的な対策であり、完全な解決ではないことを理解しておくべきだ。一つ目のOOM脆弱性に対しては、PHPのメモリ使用制限である「memory_limit」を「-1」に設定し、PHP自身によるメモリ制限を無効にする。これにより、PHPがメモリ不足で異常終了する経路を回避する。ただし、これでは個々のリクエストに対するメモリ上限がなくなるため、コンテナやcgroupなどの外部的な仕組みで、メモリを使いすぎたワーカープロセスを停止させる設定を検討する必要がある。また、「post_max_size」を8MB(アップロードが必要な場合は32MB)、その値より低い「upload_max_filesize」を設定し、リクエストのサイズやファイル数をウェブサーバーの手前にあるプロキシなどで制限する。二つ目のstale-state脆弱性に対しては、「session.upload_progress.enabled」の設定を「0」に無効化し、全てのPHPワーカープロセスを再起動する。PHP 8.5を使用している場合は、「fatal_error_backtraces」も「0」に設定することを忘れてはならない。これらの設定は、「php.ini」やFPMプールの設定、あるいはウェブサーバーの設定ファイルで適用する必要があり、通常の「ini_set()」や「.user.ini」では効果がない点に注意が必要だ。
最後に、攻撃の兆候がないか過去のログを遡って確認することも重要だ。特に10月17日以降のウェブサーバーのアクセスログを調べ、フォームデータに「PHP_SESSION_UPLOAD_PROGRESS」という文字列を含むPOSTリクエストがないか、また、サーバー上で予期しないプロセスが実行されたり、ファイルが変更されたりしていないかなどを確認する。攻撃が公表された日だけでなく、それ以前の日付から調査を開始することが肝心だ。
なお、今回発表された二つの脆弱性とは別に、セッションアップロード進捗機能に関連する別の脆弱性(CVE-2026-115560)も指摘されているが、これらは別の問題である。アップロード進捗機能を利用しない場合は、この機能を無効にしておくことで、両方の脆弱性から保護される可能性が高まる。PHPのような基盤となるソフトウェアのセキュリティは、ウェブサービス全体の安全性に直結する。今回の事態を深く理解し、迅速かつ適切に対応することが、システムエンジニアとして非常に重要な役割となる。