PHPPHP Windows / Brotliメモリ破壊悪用確認

PHPのWindows版のBrotliの脆弱性、8.5.12-1などへの入れ替えとcURL・Guzzleの確かめ方(CVE-2026-111497)

公開 2026-11-01公表 2026-10-26更新 2026-11-01資料確認 2026-11-01PHPの脆弱性 28件のまとめ
対象製品PHP Windows / Brotli
識別番号CVE-2026-111497
影響範囲Windows向けPHP 8.2〜8.5(10月26日より前の版)・cURLでHTTP応答を自動展開する場合
修正情報8.5.12-1・8.4.27-1・8.3.36-1・8.2.35-1

PHP公式は2026年10月26日(日本時間)、圧縮形式Brotliの脆弱性CVE-2026-111497を直したWindows向けパッケージ8.5.12-1・8.4.27-1・8.3.36-1・8.2.35-1を公開しました。10月21日にPHP本体の脆弱性の修正で上げた環境も、同梱のBrotliは古いままです。PHPの版の表示は変わらないので、同梱のBrotliの版で確かめます。

2026-11-01更新:一次情報と照合し、深刻度(NVD・Googleの評価)、KEVへの掲載(10月27日)、Brotliの対象版と修正版、回避策の記載がないこと、自動展開の設定の確かめ方を追記しました。影響の説明の根拠を、JPCERT/CCの注意喚起からCVEの記録に改めました。

2026-11-01更新:記事の型を解説に改め、10月21日の版の同梱Brotliが1.2.0であること(部品の一覧で確認)、GuzzleとWordPressが初期設定で自動展開を有効にすること、8.1の扱い、確認と入れ替えの手順を書き足しました。

この記事の要点
  • 米国のCISAが、悪用が確認された脆弱性の一覧(KEV)に追加しています。
  • 10月21日に出たWindows版(8.5.12など)の同梱Brotliは1.2.0で、対象です。末尾に「-1」が付いた版で1.2.1になります。
  • 経路はcURL拡張の自動展開です。cURLの初期設定では無効ですが、GuzzleやWordPressは初期設定で有効にします。
  • php -vでは見分けられません。curl_version()のbrotli_versionが1.2.1かで確かめます。

01PHPのWindows版で起きることと、10月21日の版が対象の理由

CVEの記録(採番機関はGoogle)によると、Brotli 1.0.3〜1.2.0の展開処理に不備があり、細工した圧縮データを展開すると、メモリの破壊、情報の漏えい、サービス停止、場合によっては任意のコード実行につながるおそれがあります。修正版は1.0.10・1.1.1・1.2.1です。深刻度は、Googleの評価でCVSS 4.0の9.2、NVDの評価でCVSS 3.1の9.8です。[2][4]

PHP公式によると、Windows版ではcURL拡張を通じてこの展開処理に届きます。パッケージに付く部品の一覧(SBOM)では、10月21日に出た8.5.12・8.4.27・8.3.36・8.2.35のWindows版はBrotli 1.2.0を同梱し、-1の版は1.2.1です。10月21日の更新を済ませた環境も、-1の版に入れ替えるまでは対象です。[1][6][7]

Brotliそのものの仕組みと、Python・Node.jsでの確かめ方は、Brotliの脆弱性の記事で説明しています。

Windows版PHPでは、cURLの自動展開から同梱のBrotliの不備に届く

PHP公式の告知とCVEの記録から、攻撃の入口と脆弱な部品を並べる。

外部のAPI・Webページ細工した圧縮データを含むHTTP応答を返す
cURLの自動展開が有効なとき

Windows版PHP 8.2〜8.5(10月26日より前の版)

cURL拡張CURLOPT_ENCODINGを設定するとHTTP応答を自動で展開する
同梱のBrotli 1.2.010月21日に出た8.5.12などのWindows版も1.2.0のまま
展開処理の不備
起きることメモリの破壊、情報の漏えい、サービス停止、場合によっては任意のコード実行
初期設定で自動展開を有効にする
Guzzle 7・8decode_contentの初期値がtrue
LaravelのHTTPクライアントGuzzleを使うため同じく有効
WordPress(Requests)cURLで通信するとき有効にする

出典 PHP公式「Updated PHP Windows builds for Brotli security fix」(2026-10-26)、CVEの記録「CVE-2026-111497」(2026-10-22)

02PHPのcURLで自動展開が有効になる場合

PHP公式は、cURLでHTTP応答の自動展開が有効なときに問題の処理に届くとし、cURLの初期設定では無効だが、アプリやHTTPクライアントのライブラリが有効にすることがあると説明しています。有効にする設定はCURLOPT_ENCODING(別名CURLOPT_ACCEPT_ENCODING)です。よく使われるライブラリの初期の動作は、ソースで見ると次のとおりです。[1][8][9][12][16]

使い方初期設定での自動展開
自分でcurl_*関数を呼ぶCURLOPT_ENCODINGを設定したときだけ有効
Guzzle 7・8有効(decode_contentの初期値がtrueで、CURLOPT_ENCODINGに空文字を設定し、使えるすべての展開方式を有効にする)
LaravelのHTTPクライアントGuzzleを使うため、同じく有効
WordPress(Requests)有効(cURLで通信するときCURLOPT_ENCODINGに空文字を設定)

GuzzleやWordPressを使うアプリは、何も設定していなくても自動展開が有効です。外部のAPIやWebページから受け取る応答が経路になります(ソースから見た当社の整理)。

03Brotliの脆弱性の悪用の状況

米CISAは10月27日(米国時間)、この脆弱性を「Google Brotli」としてKEVに追加しました。対応期限は11月10日です。PHPのWindows版を通じた悪用の記載は、11月1日の確認時点でPHP公式の告知にもKEVにもありません。今後30日に悪用される見込みの推定(EPSS)は82.6%です(10月31日時点、CVEとしての値)。[1][3][13]

セキュリティ会社ELLIO(第三者)は、PoCが公開されていて、それを写したNode.jsを狙う攻撃の通信を観測したと報告しています。PHPのWindows版で動くPoCの記載は、確認した一次情報にはありません。当社はPoCを検証していません。[14]

10月21日の更新のあとに同梱のBrotliが直り、翌日にKEVに載った

PHP公式の告知、CVEの記録、KEVから、日付のある出来事を並べる。

PHP公式 Google・米CISAなど

2026年10月21日

PHP 8.5.12などを公開PHP本体の脆弱性2件の修正。Windows版の同梱Brotliは1.2.0のまま

10月22日

GoogleがBrotli 1.2.1などを公開CVE-2026-111497の記録も同じ日に出た
9.2CVSS 4.0(Googleの評価)

10月26日

PHP公式が8.5.12-1などを再公開Windows版の同梱Brotliを1.2.1に入れ替えた

10月27日

米CISAが「Google Brotli」としてKEVに追加米国時間。PHP本体の2件は10月26日からKEVに載っている

10月31日

EPSSの推定
82.6%今後30日に悪用される見込み

11月10日

KEVの対応期限

出典 PHP公式「Updated PHP Windows builds for Brotli security fix」(2026-10-26)、CVEの記録「CVE-2026-111497」(2026-10-22)、米CISA「Known Exploited Vulnerabilities Catalog」(2026-10-30版)

04攻撃を受けていないかの確認

悪用が確認された脆弱性は、更新に加えて、更新前に攻撃を受けていないかを確認します。

  1. 公開していた期間のWebサーバー・アプリケーションのログで、異常終了や不審な要求がないか確認します。
  2. 見覚えのないファイル(Webシェルなど)や、設定・アカウントの変更がないか確認します。
  3. サーバーから見覚えのない宛先への通信がないか確認します。
  4. 痕跡が見つかった場合は、ログや機器の状態を保全し、専門の窓口に相談します。

05PHPの系列ごとの入れ替え先

入れ替え先は、PHP公式の告知と、配布元のWindows版の一覧から出しました(11月1日確認)。

系列10月21日の版(Brotli 1.2.0)入れ替え先(Brotli 1.2.1)
8.58.5.128.5.12-1
8.48.4.278.4.27-1
8.38.3.368.3.36-1
8.28.2.358.2.35-1
8.18.1.34(2025年12月)再公開なし。8.2以上へ移る

「-1」は依存ライブラリを更新して作り直したことを示し、PHPのソースと実行時の版は変わりません。-2以降の版は出ていません。配布物の一覧は、windows.php.netからdownloads.php.net/~windows/releases/に転送されます。[1][5]

各パッケージには部品の一覧(.cdx.json)と、既知の脆弱性への対応を書いたVEX(.openvex.json)が付きます。8.5.12-1のVEXにはCVE-2026-111497の記載がないので、脆弱性スキャナーの結果は、部品の一覧のBrotliの版と照らし合わせます。8.1はPHPのサポート対象(8.2〜8.5)に入っておらず、8.1.34には部品の一覧もありません。[5][6][11][15]

10月21日の版は同梱のBrotliが1.2.0で、末尾に「-1」が付いた版に入れ替える

PHPの系列ごとに、10月21日の版と入れ替え先を並べる。

10月21日の版Brotli 1.2.0
入れ替え先Brotli 1.2.1
8.5
8.5.12
8.5.12-1
8.4
8.4.27
8.4.27-1
8.3
8.3.36
8.3.36-1
8.2
8.2.35
8.2.35-1
8.1
8.1.34(2025年12月)
再公開なし。8.2以上へ移る
だから php -vの表示は変わらないので、curl_version()のbrotli_versionが1.2.1かで確かめる。

出典 PHP公式「Updated PHP Windows builds for Brotli security fix」(2026-10-26)、PHP公式「Windows向け配布物の一覧」(2026-11-01確認)

06Windows版PHPの同梱Brotliを確かめて、-1の版に入れ替える手順

  1. 使っているPHPの場所を確かめます。コマンドラインとWebサーバー(IISのFastCGI、Apacheなど)で別のPHPを使っていることがあるので、Webサーバーの設定に書かれたPHPの場所とも照らし合わせます。

    コマンドプロンプト
    where php
  2. 系列と、スレッドセーフ版(TS)か非スレッドセーフ版(NTS)か、x64かx86かを確かめます。入れ替えるzipを選ぶときに使います。

    コマンドプロンプト
    php -v
    php -i | findstr /c:"Thread Safety" /c:"Architecture"
  3. cURL拡張が使う同梱Brotliの版を表示します。1.2.1でなければ入れ替えの対象です。

    コマンドプロンプト
    php -r "echo curl_version()['brotli_version'] ?? 'none';"
  4. アプリとComposerで入れたライブラリ(vendorフォルダ)で、自動展開を有効にする設定と、Guzzleが入っているかを確かめます。vendor\guzzlehttpに当たるのはGuzzle自身の処理で、Guzzleを使っていれば初期設定で有効です。

    コマンドプロンプト
    findstr /s /i /m "CURLOPT_ENCODING CURLOPT_ACCEPT_ENCODING decode_content" *.php
    composer show guzzlehttp/guzzle
  5. 配布元の一覧から、同じ系列・同じ種類(TS/NTS、x64/x86)の-1の版を入手し、SHA-256の値を一覧のsha256sum.txtと照らし合わせます。

    PowerShell
    Get-FileHash .\php-8.5.12-1-nts-Win32-vs17-x64.zip -Algorithm SHA256
  6. php.iniを残してPHPのフォルダを入れ替え、Webサーバーを再起動します(IISの例)。そのあと、Webサーバーが使うPHPでもう一度brotli_versionが1.2.1になったことを確かめます。

    コマンドプロンプト(管理者)
    iisreset
    php -r "echo curl_version()['brotli_version'] ?? 'none';"

07すぐに入れ替えられないとき

PHP公式の告知に回避策の記載はありません。条件から見ると、cURLの自動展開を使わなければ経路から外れます。Guzzleでは'decode_content' => falseを指定し、自分のコードではCURLOPT_ENCODINGを設定しないようにします。これは当社の整理で、提供元が示した回避策ではありません。[1][8]

自動展開を止めると、圧縮された応答がそのまま渡り、アプリが読めなくなる場合があります。外部のAPIとの連携を検証環境で確かめてから切り替えます。

0810月21日のPHP本体の修正とは別に入れ替える

PHP公式は10月21日、PHP本体の脆弱性2件(CVE-2026-109618・CVE-2026-109619、報道ではPHP2Shellとも呼ばれます)を直した8.5.12などを公開しました。この2件は10月26日からKEVに載っています。今回の-1の版は、同梱のBrotliを入れ替えたもので、原因も確かめる所も別です。[3][10]

-1の版は8.5.12などと同じソースから作られているので、10月21日より前の版に留まっている環境も、-1の版に入れ替えれば両方の修正が入ります。[1]

PHPの脆弱性情報まとめで、PHP2Shell・追加の設定問題・Brotliの対応を比較することもできます。

緊急の場合AI攻撃リスク即点検サービス公開情報と、契約後すぐに用意できるアクセスの記録から先に調べ、被害や狙われやすい構成がないかを早く確かめます。

よくある質問

10月21日に8.5.12へ上げました。もう一度入れ替えが要りますか?

Windows版を使っているなら要ります。10月21日のWindows版の同梱Brotliは1.2.0で、8.5.12-1で1.2.1になります。[6][7]

php -vで-1の版かどうか分かりますか?

分かりません。-1の版でもPHPの版の表示は8.5.12のままです。curl_version()のbrotli_versionを見るか、取得したzipの名前とSHA-256の値を配布元の一覧と照らし合わせます。[1][5]

Guzzleを使っていなければ対象外ですか?

そうとは限りません。WordPressは初期設定で自動展開を有効にし、他のライブラリや自分のコードがCURLOPT_ENCODINGを設定していることもあります。手順の検索で確かめます。[9]

LinuxやコンテナのPHPも、この-1の版に入れ替えますか?

今回の再公開はWindows向けです。Linuxで動くPHPのcURLが使うBrotliは、OSや配布元のパッケージの更新で直します。[1]

出典・参考資料

  1. PHP公式:Updated PHP Windows builds for Brotli security fix2026-10-26(日本時間) / 再公開した4パッケージ、Brotli 1.2.1、cURLの自動展開の条件、-1の意味、回避策の記載がないこと
  2. CVEの記録:CVE-2026-111497(採番機関Google、NVDの評価を含む)2026-10-22(日本時間) / 対象のBrotliの版、影響、修正版、CVSS(Google 4.0 9.2・NVD 3.1 9.8)
  3. 米CISA:Known Exploited Vulnerabilities Catalog2026-10-30版 / CVE-2026-111497の追加日10月27日・対応期限11月10日、PHP本体の2件の追加日10月26日
  4. Google:Brotli v1.2.12026-10-22(日本時間) / Brotliの修正版の公開
  5. PHP公式:Windows向け配布物の一覧2026-11-01確認 / -1のパッケージ、-2以降が無いこと、sha256sum.txt、部品の一覧とVEXの公開、8.1.34の扱い、windows.php.netからの転送
  6. PHP公式:8.5.12-1(x64 NTS)の部品の一覧(CycloneDX)2026-10-26 / 同梱Brotliが1.2.1であること
  7. PHP公式:8.5.12(x64 NTS、10月21日の版)の部品の一覧2026-11-01確認 / 10月21日の版の同梱Brotliが1.2.0であること(8.4.27・8.3.36・8.2.35も同じ)
  8. Guzzle:CurlFactory.php・Client.php(7.16.1)2026-10-25 / decode_contentの初期値true、CURLOPT_ENCODINGに空文字を設定すること(8.3.1も同じ)
  9. WordPress:Requestsのcurl転送(wp-includes/Requests/src/Transport/Curl.php)2026-11-01確認 / CURLOPT_ENCODINGに空文字を設定すること
  10. PHP公式:PHP 8.5.12 Released!2026-10-21 / PHP本体の脆弱性2件(CVE-2026-109618・CVE-2026-109619)と修正版
  11. PHP公式:サポート中の版(releases/active)2026-11-01確認 / サポート中の系列が8.2〜8.5であること
  12. php-src:ext/curl/interface.c・curl.stub.php2026-11-01確認 / curl_version()がbrotli_versionを返すこと、CURLOPT_ENCODINGがCURLOPT_ACCEPT_ENCODINGの別名であること
  13. FIRST:EPSS(CVE-2026-111497)2026-10-31 / EPSSの値
  14. ELLIO:Node2Shell(CVE-2026-111497)(第三者の調査)2026-10-25(10-26更新) / 公開されたPoCと、Node.jsを狙う攻撃の通信の観測(CVEの記録に参考として掲載)
  15. PHP公式:8.5.12-1(x64 NTS)のVEX(OpenVEX)2026-10-26 / CVE-2026-111497の記載がないこと(11月1日確認)
  16. Laravel:Illuminate/Http/Client/PendingRequest.php(12.x)2026-11-01確認 / LaravelのHTTPクライアントがGuzzleを使うこと
  17. リリースノート:nodejs.org/en/blog/vulnerability/october-2026-security-releases#nodejs-brotli-decoder-out-GitHub Advisoryの参考リンク / 修正の内容・経緯
  18. 修正のコミット:github.com/google/brotli/commit/0ed4268a4401abcb4472096340477cf4af7d1a2bGitHub Advisoryの参考リンク / 修正の内容・経緯
  19. 修正のコミット:github.com/google/brotli/commit/50a9b70a4d5e1443fc40927952276b68fffa83a0GitHub Advisoryの参考リンク / 修正の内容・経緯
  20. 修正のコミット:github.com/google/brotli/commit/b418fa81c48262a86a95332b0bc6d62c30aa78b6GitHub Advisoryの参考リンク / 修正の内容・経緯
  21. 修正のコミット:github.com/google/brotli/commit/da9806362874b9bd4b552a3af360b5d6347beb12GitHub Advisoryの参考リンク / 修正の内容・経緯
  22. リリースノート:github.com/google/brotli/releases/tag/v1.0.10GitHub Advisoryの参考リンク / 修正の内容・経緯

あわせて読みたい記事

Python公表 2026-10-22

Brotliの脆弱性の確認方法、PythonとNode.jsで対象かを確かめて直す(CVE-2026-111497、コード実行のおそれ)

圧縮形式Brotliの展開処理の脆弱性CVE-2026-111497(HTTP2Shell)は、米CISAが悪用を確認しています。Pythonのbrotli・brotlicffi、Node.jsの同梱版などで、自分の版と構成が対象かを確かめる方法と修正版を、言語ごとに説明します。

PHP公表 2026-10-19

LaravelのTokenGuardに認証回避の脆弱性、MySQL・MariaDBの一部の構成で他人として認証されるおそれ。Sanctumとの見分け方と11系以前の扱い

Laravelの脆弱性CVE-2026-114509は、TokenGuardで守るAPIに文字列でない値を送ると、MySQL・MariaDBの一部の構成で既存の利用者として認証されるおそれがあります。自社がTokenGuardかSanctumかの見分け方、12.69.0・13.30.0以上への上げ方、サポートが終わった11系以前の扱いを説明します。

Python公表 2026-05-22

Starletteの脆弱性BadHost、Hostヘッダーでパスによる認証の確認を回避されるおそれ。FastAPIを上げても古い版が残る場合の確かめ方

Starletteの脆弱性CVE-2026-48710(BadHost)は、細工したHostヘッダーでrequest.url.pathを偽り、パスで判定するアクセスの確認を回避されるおそれがあります。9月2日にKEVに追加されました。FastAPI・vLLM・LiteLLMの下で古いStarletteが残る例と、間接依存の確かめ方を説明します。