10月21日、Cloudflareが「Cloudflare deploys protections against php2shell vulnerability」と題した記事を公開した。PHPに発見された深刻な脆弱性「php2shell」に対し、CloudflareがWAFによる保護を公式開示の約9時間前から全ユーザーへ自動展開した経緯と、今回新たに開発した「フルトランザクション検出」機能の詳細が紹介されている。
PHPは世界のウェブサイトの約70%で利用されており、WordPressやMagentoといった広く普及したプラットフォームの基盤でもある。今回の脆弱性はPHPランタイム自体に存在し、PHP 5.4以降のすべてのバージョンが対象となる。攻撃が成功した場合、DoS(サービス妨害)・リモートコード実行(RCE)・データ漏洩のいずれも引き起こせる。影響範囲の広さと攻撃の深刻度から、セキュリティコミュニティで緊急度の高い案件として扱われた。
協調開示の全体像
2026年10月21日、Calif.io(セキュリティリサーチ会社)・Wiz・OpenAI・Quarkslabの4社が、PHPの脆弱性2件(CVE-2026-109618 および CVE-2026-109619)を協調開示した。これらは「php2shell」と総称される。CloudflareはPHP Foundation・OpenAI・Wizらとともにこの協調的な対応に参加し、公式開示前の段階からWAFルールの準備を進めていた。
脆弱性の仕組み:メモリ管理の不備を突く
2件の脆弱性はいずれも、HTTPリクエスト処理中に異常が発生した際のPHPのメモリ管理の不備に起因する。
| 脆弱性 | 何が起きるか |
|---|---|
| CVE-2026-109618 | メモリ不足で処理が中断し、未初期化のデータがクリーンアップ時に参照される |
| CVE-2026-109619 | 致命的エラーで処理が中断し、解放済みメモリへの参照が残存。次のリクエスト処理時にそのメモリにアクセスし、機密情報が漏洩しうる |
攻撃者は意図的に細工したHTTPリクエストを送ることでこれらの状態を誘発できる。大きなリクエストでメモリを圧迫するのが一手だが、問題の本質はリソース枯渇だけではない。無効なメモリ上のデータを操作してコード実行や情報漏洩を狙える点が、この脆弱性を特に危険なものにしている。
Cloudflareの対応:公式開示の9時間前に保護を展開
Cloudflareは協調開示チームから事前に情報提供を受け、2026年10月21日 午前3時02分(UTC)時点で、無料プランを含む全WAFユーザーへの保護を自動で有効化した。これは公式開示より約9時間早いタイミングだ。
公式開示前の段階で攻撃トラフィックが実際に観測される状況下でも、複数の緩和策を展開できたという。Cloudflareはルールのマッチ件数を追跡しながら攻撃者がペイロードを変異させる様子をリアルタイムで監視し、ルールを都度更新した。
新機能「フルトランザクション検出」とは
今回の対応で技術的な目玉となるのが、フルトランザクション検出(Full Transaction Detection)だ。一言でいえば、「リクエストだけでなくレスポンスも見て攻撃の成否を判断する」仕組みである。
従来のWAFはHTTPリクエストの内容のみでルールを適用する。これは、正常なリクエストと攻撃リクエストをリクエスト単体のシグナルだけで識別するアプローチだ。しかしphp2shellの検出では、リクエストの形式だけでは攻撃と正常トラフィックを区別しにくいケースがある。そこでCloudflareは、同一HTTPトランザクション内のリクエストとレスポンスの両方を組み合わせて判定する新機能を開発した。
オリジンサーバーのレスポンスに含まれるシグナルを加味することで「エクスプロイトが実際に成功したか」を判断でき、誤検知(false positive)を抑えながら高精度な検出を実現している。マッチした場合、レスポンスはリクエスト送信者に届く前にブロックされる。php2shellの保護は、この機能を用いた最初のマネージドルールとなった。
展開されたWAFルールと確認方法
無料プラン向け(Cloudflare Managed Free Ruleset、Ruleset ID: 77454fe2d30c4220b5701f6fdfb893ba)には「Generic Rules - Anomalous Execution」として7つのルールが追加されており、設定変更なしで自動適用される。
有料プラン向け(Cloudflare Managed Ruleset、Ruleset ID: efb7b8c949ac4650a09736fc376e9aee)についても同様の7ルールが展開されている。Professional・Business・Enterpriseプランの管理者は、Managed Rulesetがブロックモードでデプロイ済みか確認しておくべきだ。
また、全プランを対象に「Cloudflare Managed Response Firewall Default」として、フルトランザクション検出を用いた高信頼度シグネチャのブロックルール(Rule ID: afffe22785674c80a31875c848d2242a)も展開されている。ブロックされたリクエストは Security > Security Analytics > Events で確認でき、上記のRule IDでフィルタリング可能だ。ルールの追加・更新はchangelogページで追跡できる。
WAF保護はあくまで追加の防御層
CloudflareはWAF保護の有効化と並行して、PHPランタイム自体のアップデートを速やかに適用することを強く推奨している。ホスティングプロバイダーがPHPを管理している場合は、プロバイダーへのアップデート依頼が必要だ。不要なファイルアップロードの制限やアップロードサイズの縮小もリスク軽減に寄与するが、これらはPHP本体の修正を代替するものではない。WAFはあくまで多層防御の一層であり、根本的な対処はPHP側のパッチ適用にある。
詳細はCloudflare deploys protections against php2shell vulnerabilityを参照していただきたい。