PHPのHTTPS通信でPHP-FPMがクラッシュするHigh脆弱性(CVSS 8.2)の仕組みと、自分のサーバーが影響を受けるかの判断方法、修正バージョンへの対処手順を解説します。
「サイトが突然落ちた」その原因がPHPの脆弱性かもしれません
ある日突然、Webサイトへのリクエストが500エラーを返し始める。PHP-FPMのワーカーがなぜか消耗している。アクセスログに心当たりがない。そういった「原因不明のサービス停止」が、PHPの既知の脆弱性によって引き起こされるケースは少なくありません。
2026年7月に公開された CVE-2026-12184 は、PHPのHTTPS通信処理に潜むNULLポインタ参照のバグで、PHP-FPM環境においてワーカープール枯渇によるDoS(サービス停止)を引き起こす可能性があります。深刻度はCVSS v4.0スコアで 8.2(High) と評価されており、対応を要する脆弱性です。
この記事では、技術的なメカニズムを正確に解説したうえで、「自分のサーバーが影響を受けるのか」を判断するための実務的な切り分け方と、具体的な対処手順を丁寧に示します。
CVE-2026-12184 の概要と深刻度
CVSSスコアについての注記
この脆弱性のCVSSスコアについては、英語の二次情報記事の中に 8.7 と記載しているものが存在しますが、PHP公式CNA(CVE採番機関)が公開しているアドバイザリ(GHSA-mhmq-mmqj-2v39)の公式値は 8.2 です。本記事では公式値の8.2を採用しています。
CVSSベクトルから読み取れること
ベクトルは AV:N / AC:H / AT:P / PR:N / UI:N / VA:H です。これを日本語に分解すると以下のとおりです。
- ネットワーク経由・認証不要・ユーザー操作不要:外部から特別な権限なしに攻撃を試みられる
- 攻撃複雑性:高(AC:H):ただし特定の条件(後述)が揃わないと発動しない
- 影響は可用性のみ:機密情報の漏洩や改ざんは発生しない。あくまで DoS(サービス停止) が脅威
脆弱性のメカニズム:なぜPHP-FPMが止まるのか
この脆弱性の根本原因は、PHPのHTTPストリームラッパー php_stream_url_wrap_http_ex(ソース上は ext/standard/http_fopen_wrapper.c)に存在するNULLポインタ参照です。
元々のバグレポート(GitHub Issue #21468)は「プロキシ設定がある環境でHTTPS URLに file_get_contents するとセグフォルトする」というものでした。
クラッシュが起きるまでの流れ
flowchart TD
A["file_get_contents('https://...')"] --> B[PHPストリームラッパーが接続を試みる]
B --> C{TLS証明書の検証}
C -->|"検証成功"| D[正常にレスポンス取得]
C -->|"検証失敗(期限切れ・ホスト名不一致等)"| E[ストリームがNULLにリセットされる]
E --> F[後処理コードがNULLポインタを参照]
F --> G[セグメンテーション違反=プロセスクラッシュ]
G --> H[PHP-FPMワーカーが1つ消滅]
H --> I{繰り返し攻撃}
I --> J[ワーカープール枯渇]
J --> K[サービス停止(DoS)]トリガーに必要な条件
この脆弱性が発動するには、以下の 両方 が揃う必要があります。
- PHPストリーム経由のHTTPS通信 かつ プロキシ設定がある、または 接続先が無効な証明書を提示する(期限切れ、ホスト名不一致など)
- アプリケーションがアウトバウンドのHTTPS通信を行っている
CVSSにAC:H(攻撃複雑性・高)が含まれているのは、この「特定条件が揃う必要がある」という点を反映しています。
重要:cURLとPHPストリームの切り分け
ここが実務上、最も重要な判断ポイントです。
この脆弱性が影響するのは、PHPストリーム経由のHTTPS通信のみです。
| 通信方法 | 脆弱性の対象 | 主な使用箇所 |
|---|---|---|
| PHPストリーム(file_get_contents / fopen) | 直接HTTPSを取得するカスタムコード等 | |
| cURL経由(curl_exec等) | LaravelのGuzzle HTTP(デフォルト) | |
| GuzzleHTTP(Laravelのデフォルト) | Http::get() / Http::post() 等 |
Laravelで標準的に使われる Http::get() や Http::post() は、内部でGuzzleHTTPを使いcURLで通信するため、この脆弱性の影響を受けません。
一方、以下のようなコードを書いている場合は対象になります。
// PHPストリーム経由:この脆弱性の対象
$response = file_get_contents('https://api.example.com/data');
$fp = fopen('https://api.example.com/data', 'r');
// cURL経由(Laravelの標準):対象外
use Illuminate\Support\Facades\Http;
$response = Http::get('https://api.example.com/data');
自分のコードや導入しているプラグイン・ライブラリがどちらを使っているかを確認することが、露出範囲を正確に把握する第一歩です。
影響を受けるバージョンと修正版
| PHPバージョン系列 | 影響対象 | 修正バージョン |
|---|---|---|
| PHP 8.3系 | 8.3.32以上 | |
| PHP 8.4系 | 8.4.21以上 | |
| PHP 8.5系 | 8.5.6以上 | |
| PHP 8.2系 | 対象外(別CVEの修正はあり) |
PHP 8.2系はCVE-2026-12184の対象外です。 8.2.32で修正された CVE-2026-14355(OpenSSL関連)は別の脆弱性であり、混同しないよう注意が必要です。
確認手順:自分のサーバーは該当するか
よくある失敗:CLIだけ確認して安心してしまう
サーバー管理でよくあるのが、ターミナルで php -v を実行して「8.3.32だから大丈夫」と判断するケースです。しかし、PHP-FPM(Webリクエストを処理するプロセス)とCLI(コマンドライン)は別々のパッケージとして管理されていることがあり、バージョンが異なる場合があります。 実際に脆弱性が刺さるのはFPM側ですが、CLIしか確認していないと見落とします。
正しい確認の手順
ステップ1:CLIのバージョン確認
php -v
出力例:
PHP 8.3.29 (cli) (built: ...)
上記の場合、8.3.32未満なので対応が必要です。
ステップ2:PHP-FPMのバージョン確認
Webサーバー経由でPHPが使うバージョンを確認します。最も確実なのは phpinfo() を一時的に設置する方法です。
<?php
// 確認後は必ず削除すること
phpinfo();
Pleskをお使いの場合は、ドメインのPHP設定画面でPHPバージョンを確認できます。CLIとFPMで異なるバージョンが設定されているケースも珍しくありません。
ステップ3:両方が修正版以上かを確認する
CLIとFPMの両方が修正バージョン(8.3.32 / 8.4.21 / 8.5.6)以上になっているかを確認します。片方だけ更新して「完了」とするのは、よくある見落としです。
対処法:修正バージョンへのアップデート
確実な対処はひとつ——修正済みバージョンへのアップデートです。
Pleskを使っている場合
Pleskは事前にビルド済みのPHPパッケージを管理画面から配布しています。手動コンパイルは不要で、以下の手順で更新できます。
Tools & Settings > Updates and Upgrades > PHP のアップデートを適用
その後、各ドメインのPHP設定から修正版のPHPバージョンを選択してください。
Ubuntu / Debian系OSで apt 管理の場合
sudo apt update
sudo apt upgrade php8.3 php8.3-fpm
# 使用しているバージョンに合わせて指定
CLIとFPMのパッケージが分かれている環境では、両方を明示的にアップグレードする必要があります。片方だけ更新してしまうのが実際に起こりやすいミスです。
アップデート後の確認
# CLIの確認
php -v
# PHP-FPMの確認
php-fpm8.3 -v
# または
systemctl status php8.3-fpm
Webサーバー側も phpinfo() で最終確認し、修正バージョンが反映されていることを確かめましょう(確認後は必ずファイルを削除してください)。
まとめ:今すぐ確認すべきことのチェックリスト
CVE-2026-12184は、機密情報漏洩や改ざんを引き起こす脆弱性ではありませんが、外部から繰り返し攻撃されるとPHP-FPMが停止し、サイト全体がダウンするDoSの危険があります。PHP 8.3・8.4・8.5系を使っていてアウトバウンドHTTPS通信を行うアプリを運用している場合は、早めの対応をお勧めします。
開発・運用でお困りなら
システム開発
設計から運用まで、堅牢なシステムを構築します
※ 通常1営業日以内にご返信します
サーバーの確認・対応にお困りの方へ
「バージョン確認はできたけど、どのPHPパッケージが使われているか自信がない」「Pleskの操作に慣れておらず、更新作業が不安」「そもそも自社サーバーの構成を把握しきれていない」——そういったお声をお客様からいただくことは少なくありません。
Fivenine Designでは、PHPバージョンやサーバー設定の確認から脆弱性への対応、WordPress・Laravelサイトの継続的な保守運用まで、Web制作とサーバー運用の実務知見をもとにサポートしています。
「自分でやってみたけど確認しきれなかった」「定期的にサーバーを見てほしい」という場合は、お気軽にご相談ください。