PHP2Shell(CVE-2026-109618 / CVE-2026-109619)まとめ ~公開からパッチ、現在までのタイムライン~

PHP2Shell(CVE-2026-109618 / CVE-2026-109619)まとめ ~公開からパッチ、現在までのタイムライン~

PHP Security CVE Vulnerability AI生成

2026年10月21日に公開されたPHP本体の重大な脆弱性「PHP2Shell」について、事前告知からパッチリリース、各ベンダーの対応までを時系列で整理します

:::message alert この記事はAIによって生成されたものです。筆者(Daisuke Akagawa)が執筆したものではありません。公開前に筆者がレビューしていますが、内容がすべて正確であることは保証できません。正確な情報は記事末尾の一次情報(公式アドバイザリなど)をご確認ください。 :::

2026年10月21日、PHP本体(コアランタイム)に重大な脆弱性が2件公開され、X(旧Twitter)でもトレンド入りするなど大きな話題になりました。研究チームはこれらを「PHP2Shell」と呼んでいます。

この記事では、一次情報(php.net、GitHub Security Advisory、CVE/NVD、研究者のブログなど)をもとに、以下を整理します。

  • 何が起きたのか(脆弱性の概要)
  • 影響を受けるバージョンと修正バージョン
  • 事前告知からパッチ公開、ディストリビューションの対応までのタイムライン
  • 今すぐやるべきこと(アップデートと暫定的な緩和策)

:::message 本記事の内容は 2026年10月22日 0時20分(JST)時点 の情報です。状況は刻々と変わっているので、最新情報は必ず末尾の一次情報を確認してください。日時は原則として元の表記(UTCなど)と日本時間(JST = UTC+9)を併記しています。 :::

まずは結論から!

項目 内容
通称 PHP2Shell(php2shell)
CVE CVE-2026-109618 / CVE-2026-109619
GHSA GHSA-w8hw-w9fx-j79w / GHSA-6wmf-4rv5-p3rp
深刻度 両方とも Critical、CVSS v4.0 で 9.2(CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N)
影響 認証不要のリモートコード実行(RCE)、メモリの内容漏えい
影響を受けるもの Webリクエストを処理するすべてのPHP(PHP-FPM、Apache mod_php、php-cgi、FrankenPHP、LiteSpeed)
修正バージョン PHP 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35
PHP 8.1以前 PHPプロジェクトからの修正リリースはなし(7.4 / 8.0 / 8.1向けに最小限のソースパッチは提供)
CISA KEV 筆者確認時点(KEVカタログ 2026.10.21版)では未掲載

一言でいうと、「PHPランタイムそのもののバグなので、アプリやプラグインを更新しても直らない。PHPを更新してワーカーを再起動するしかない」という脆弱性です。

脆弱性の概要

PHPのセキュリティアドバイザリによると、どちらの脆弱性も「リクエストが異常終了したときに、PHPがメモリを壊れた状態のまま残してしまう」という共通の問題に起因しています。

CVE-2026-109618:OOM(メモリ不足)処理による破損(RCE via OOM corruption)

PHPはメモリ不足(OOM)エラーが起きると longjmp() で処理を抜けてリクエストを中断します。しかし、一部の処理ではリクエスト用のメモリが「初期化しきれていない状態」で参照可能になっており、そこでメモリ確保が失敗すると、無効な状態のまま後片付け(リクエストのシャットダウン処理)が走ってしまいます。その結果、RCEにつながります。

アドバイザリでは、OOMを意図的に起こす手口として以下のようなmultipartリクエストの性質が挙げられています。

  • 有効な Content-Length がないmultipartリクエストが、最初の post_max_size チェックを通過してしまう
  • 1つのパートに無制限の数のヘッダーを付けられ、PHP内部ではワイヤー上より大きなメモリを消費する
  • 空のファイル入力欄は max_file_uploads にカウントされないのに、メタデータの配列は作られる

特に Apache mod_php では、リクエストの開始処理に失敗してもシャットダウン処理が必ず呼ばれるため、アプリケーションのコードが1行も実行される前に攻撃が成立します。mod_phpに対しては、デフォルトのメモリ制限・入力制限のままでHTTP経由の完全なRCEが確認されています。FPMについてはソース解析上は影響を受けうるものの、このCVEでは完全なエクスプロイトは示されていないとされています。

CVE-2026-109619:古いグローバル状態の残存(RCE via stale global state)

PHPのワーカーは、エラー・セッション・オブジェクト・拡張機能などのグローバルな状態を保持しています。本来はリクエストのメモリを解放する前にリセットされるべきですが、致命的エラー(OOMを含む)などで処理が途中で中断されると、解放済みのメモリを指したままの状態が残ってしまいます。同じワーカーが次のリクエストを処理するとき、通常の初期化より前にその古い状態を参照してしまい、Use-After-Free → メモリ漏えい・RCEにつながります。

確認済みのパターンとして、以下の2つが挙げられています。

  • PHP 8.5の致命的エラーのバックトレース(fatal_error_backtraces 有効時):mod_phpに対するRCEの根拠になっている最も強力なケース
  • セッションのアップロード進捗(session upload progress):デフォルトで有効で、アプリが session_start() を呼んでいなくても到達可能。mod_phpとFPMの両方でRCEを確認

:::message 研究チーム(Wiz Research)のブログでは、実際に見つかったバグとして「アップロード進捗のunserializer UAF」「リモートからのプロセスメモリ漏えい」「致命的エラーのバックトレースUAF」「OPcacheの型混同」の4つが紹介されています。Wizのブログ内の表とPHP公式アドバイザリでは、個々のバグがどちらのCVEに属するかの書き方が一部異なっています。CVEの分類はPHP公式アドバイザリを基準に読むのがよいと思います。 :::

どれくらいヤバいのか

Wiz Researchは、これらを組み合わせたエクスプロイトスクリプト「php2shell」で、WordPress・Drupal・Joomlaの公式コンテナイメージ(latest)に対して認証なしのRCEを実証したと公表しています。ただしこれらは代表例であり、脆弱なのはPHP本体なので、シンプルな「Hello World」アプリでも影響を受けうるとしています。

また、RCEまで行かなくても、PHPワーカーのメモリ(パスワード、認証トークン、APIキー、証明書など)を読み出せることも実証されています。

なお、Wizはこの研究で Wiz Atlas、Gemini 4 Argon、GPT-5.6 Sol といったAIモデルを活用したと説明しており、「AIによって複雑なエクスプロイト開発のハードルが下がった」ことも話題になったポイントです。

影響を受けるバージョンと修正バージョン

PHP公式アドバイザリ(GHSA)とCVEレコードに記載されている影響範囲は以下のとおりです。

ブランチ 影響を受けるバージョン 修正バージョン
PHP 8.5 8.5.12 未満 8.5.12
PHP 8.4 8.4.27 未満 8.4.27
PHP 8.3 8.3.36 未満 8.3.36
PHP 8.2 8.2.35 未満 8.2.35
PHP 8.1以前 サポート終了(EOL) 公式リリースなし。7.4 / 8.0 / 8.1向けに最小限のソースバックポートのみ提供

Wiz Researchおよび Google Cloud のブログでは、PHP 5.4以降のほぼすべてのバージョンが少なくともどちらかの脆弱性の影響を受けるとされています。

:::message alert PHP 8.2 は 2026年12月31日でサポート終了(EOL)予定です。8.2.35 に上げて終わりではなく、サポート中のバージョンへの移行計画もあわせて検討しましょう。 :::

タイムライン

ここからは、発見から現在までを時系列で整理します。日付のみの情報は元ソースのとおり記載しています。

日時(元の表記) 日本時間(JST) 出来事 出典
2026-08-19 - Wiz Research が最初の脆弱性を発見 Wiz
2026-08-20 - Drupal に対する認証なしRCEを確認 Wiz
2026-08-21 - WordPress に対する認証なしRCEを確認 Wiz
2026-08-24 - Wiz Research が PHP セキュリティチームに報告 Wiz
2026-09-21 - PHP が報告を受理し、協調した修正の開発を開始 Wiz
2026年10月上旬 - Cloudflare が WAF 保護ルールの開発・展開を開始 Cloudflare
2026-10-12 21:03 UTC 10-13 06:03 両CVE IDが予約(reserved)される CVEレコード
2026-10-20 - php.net が「重大なセキュリティリリースの事前告知」を掲載。リリースは 10月21日 14:00 UTC 予定、2件とも CVSS v4.0 9.2、詳細が漏れたり悪用が確認された場合は前倒しもありうると告知 php.net
2026-10-21 03:02 UTC 10-21 12:02 Cloudflare の WAF(無料プラン含む)で php2shell 対策がデフォルト有効に(公開の約9時間前と説明) Cloudflare
2026-10-21 13:30 UTC 10-21 22:30 CERT-EU によると、この時刻に PHP 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35 がリリース(予定の14:00 UTCより前) CERT-EU
2026-10-21 13:48 / 13:54 UTC 10-21 22:48 / 22:54 CVE-2026-109618 / CVE-2026-109619 のCVEレコードが公開 CVEレコード
2026-10-21 10-21 php.net がセキュリティアドバイザリ「Critical remote code execution vulnerabilities, update now」と各リリースを公開。GitHub上で GHSA-w8hw-w9fx-j79w / GHSA-6wmf-4rv5-p3rp が公開 php.net / GitHub
2026-10-21 10-21 Wiz Research が詳細ブログを公開、特設サイト php2shell.com も公開 Wiz / php2shell.com
2026-10-21 14:04 UTC 10-21 23:04 CISA KEV カタログ 2026.10.21 版が公開。本CVEは未掲載 CISA KEV(JSON)
2026-10-21 14:17 UTC 10-21 23:17 NVD に CVE-2026-109618 が登録(ステータス:Received) NVD API
2026-10-21 14:29 UTC 10-21 23:29 Google Cloud が対応ガイダンスのブログを公開 Google Cloud
2026-10-21 10-21 英国 NCSC がアラートを公開。即時アップデート、できない場合はオフライン化も検討するよう呼びかけ NCSC
2026-10-21 10-21 CERT-EU が Security Advisory 2026-018 を更新。技術的な詳細が公に議論され、初期のPoCが出回り始めていると記載 CERT-EU
2026-10-21 10-21 各ディストリビューションが修正パッケージを公開(後述) Red Hat / Debian / Ubuntu

悪用状況(in the wild)とPoC

現時点で確認できた情報は以下です。

  • Cloudflare:脆弱性の情報が公式リリース前に漏れており、顧客を狙った攻撃トラフィックを観測したと公表しています。攻撃者がWAFを回避しようとペイロードを変化させている様子も観測したとのことです。
  • BleepingComputer:パッチ公開前に、Cloudflare CTO が「初期の攻撃」を観測していると認めたと報じています。
  • CERT-EU:初期のPoCが出回り始めており、攻撃者がすでに悪用している可能性が高まっているとしています。
  • CISA KEV:筆者が確認した KEV カタログ(2026.10.21版、2026-10-21 14:04 UTC 公開)には、どちらのCVEもまだ掲載されていませんでした。

:::message 「PoCが出回っている」「攻撃が観測されている」という情報は上記の組織による報告であり、筆者自身が攻撃コードを確認したわけではありません。KEVへの追加は今後変わる可能性が高いので、継続的にチェックしてください。 :::

ディストリビューション・ベンダーの対応

php.netによると、Linuxディストリビューションや LTS ベンダーには事前にパッチが共有されていました。筆者が確認できた範囲の対応状況は以下です。

ベンダー 内容
Red Hat RHSA-2026:87072(php:8.2 モジュール、RHEL 9、深刻度 Important、2026-10-21 公開)。php-8.2.35 ベースのパッケージ
Debian DSA-6574-1(trixie:php8.4 8.4.27-1deb13u1)、DLA-4848-1(bookworm:php8.2 8.2.35-1deb12u1)。unstable はまだ未修正
Ubuntu 優先度 Critical。22.04 LTS(php8.1 8.1.2-1ubuntu2.28)、24.04 LTS(php8.3 8.3.6-0ubuntu0.24.04.13)、26.04 LTS(php8.5 8.5.4-0ubuntu1.5)、26.10(php8.5 8.5.9-0ubuntu2.1)で修正済み(CVE-2026-109618 のページで確認)
Cloudflare WAF マネージドルールを無料プランを含む全プランにデフォルトで展開。リクエストとレスポンスの両方を見る新機能「full transaction detection」を使ったルールも提供
Google Cloud App Engine standard(PHP 8.2以降)は自動でパッチ適用。Cloud Run、GKE、App Engine flexible などは、パッチ済みのPHPでリビルド・再デプロイが必要

:::message ディストリビューションのパッケージは、上流のバージョン番号(8.2.35など)ではなく独自のバージョン番号でバックポートされていることがあります。php -v の表示だけで判断せず、各ディストリビューションのセキュリティトラッカーで修正済みパッケージかどうかを確認しましょう。 :::

今すぐやるべきこと

1. PHPをアップデートしてワーカーを再起動する

唯一の完全な対策はアップデートです。PHP 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35(またはディストリビューションの修正済みパッケージ)に更新し、Apache・PHP-FPM・常駐するPHPワーカーをすべて再起動してください。コンテナで動かしている場合は、イメージをリビルドして再デプロイする必要があります。

2. すぐに更新できない場合の暫定策

PHP公式アドバイザリでは、以下の緩和策が示されています。ただし「特定の攻撃経路を減らすだけで、安全になるわけではない」と明記されている点に注意してください。

CVE-2026-109618(OOM破損)向け

  • memory_limit=-1 を、アプリから上書きできない方法(FPMプールやApache設定の php_admin_value など)で設定する。どこかで有限の値に戻されていないかも確認する
  • post_max_size を小さくする(アップロード不要なら 8M、必要なら 32M)。upload_max_filesize は post_max_size より小さくする
  • Webサーバーやプロキシ側で、リクエストサイズ・入力フィールド数・multipartのパート数・ヘッダー数・ネストの深さを制限する(Content-Length がないリクエストもカバーすること)
  • コンテナや cgroup のメモリ制限を可用性の境界として使う。RLIMIT_AS や RLIMIT_DATA で代用してはいけない(脆弱な経路を逆に踏む原因になる)

CVE-2026-109619(古いグローバル状態)向け

  • session.upload_progress.enabled=0 に設定し、すべてのワーカーを再起動する(ini_set() や FPM の .user.ini ではなく、php.ini・FPMプール・サーバー設定で行う)
  • PHP 8.5 では fatal_error_backtraces=0 に設定して再起動する
  • リクエストごとに適用される、無効な設定や非推奨の設定を取り除く(error_reporting や display_errors、@ で警告を隠しても効果なし)
  • 攻撃者が到達できる致命的エラーや実行タイムアウトを潰す
; 暫定策の例(あくまで緩和策です。アップデートの代わりにはなりません)
session.upload_progress.enabled = 0
post_max_size = 8M
; PHP 8.5 の場合
fatal_error_backtraces = 0

:::message alert memory_limit=-1 は、メモリ不足の処理をOSに任せることになるため、ワーカーが強制終了されやすくなるなど可用性に影響します(php2shell.com でも注意喚起されています)。設定を変える前に、自分の環境で影響を確認してください。 :::

3. 侵害の痕跡を確認する

Wiz Research と php2shell.com では、調査の手がかりとして以下が挙げられています。

  • 異常なmultipartリクエストのあとに、メモリ制限エラーや HTTP 500 が繰り返されている
  • レスポンスの PHPSESSID Cookie が異常に大きい、または不正な形式になっている
  • 原因不明のPHPワーカーのクラッシュや再起動

ただし、これらの兆候がないからといって安全とは限らない点も強調されています。英国 NCSC も、すぐに更新できない場合は、更新前にバックドアなど侵害の痕跡を確認するよう推奨しています。

まとめ

今回は、2026年10月21日に公開されたPHP本体の脆弱性「PHP2Shell」(CVE-2026-109618 / CVE-2026-109619)について、タイムラインを中心に整理しました。

  • PHPランタイム自体のバグなので、アプリやCMSを更新しても直らない
  • 対策は PHP 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35 への更新+ワーカー再起動 が基本
  • 事前告知の段階で情報が漏れ、公開前から攻撃が観測されている
  • PHP 8.1以前を使っている場合は、ベンダーのバックポートを確認するか、サポート中のバージョンへの移行を急ぎましょう

PHPで動いているサーバーをお持ちの方は、まずは自分の環境のPHPバージョンを確認するところから始めてみてください。

参考資料(一次情報)