PHPのWindows版のBrotliの脆弱性、8.5.12-1などへの入れ替えとcURL・Guzzleの確かめ方(CVE-2026-111497)
CVE-2026-111497PHP公式は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の記録から、攻撃の入口と脆弱な部品を並べる。
Windows版PHP 8.2〜8.5(10月26日より前の版)
出典 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日
10月22日
10月26日
10月27日
10月31日
11月10日
出典 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攻撃を受けていないかの確認
悪用が確認された脆弱性は、更新に加えて、更新前に攻撃を受けていないかを確認します。
- 公開していた期間のWebサーバー・アプリケーションのログで、異常終了や不審な要求がないか確認します。
- 見覚えのないファイル(Webシェルなど)や、設定・アカウントの変更がないか確認します。
- サーバーから見覚えのない宛先への通信がないか確認します。
- 痕跡が見つかった場合は、ログや機器の状態を保全し、専門の窓口に相談します。
05PHPの系列ごとの入れ替え先
入れ替え先は、PHP公式の告知と、配布元のWindows版の一覧から出しました(11月1日確認)。
| 系列 | 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以上へ移る |
「-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日の版と入れ替え先を並べる。
出典 PHP公式「Updated PHP Windows builds for Brotli security fix」(2026-10-26)、PHP公式「Windows向け配布物の一覧」(2026-11-01確認)
06Windows版PHPの同梱Brotliを確かめて、-1の版に入れ替える手順
使っているPHPの場所を確かめます。コマンドラインとWebサーバー(IISのFastCGI、Apacheなど)で別のPHPを使っていることがあるので、Webサーバーの設定に書かれたPHPの場所とも照らし合わせます。
コマンドプロンプトwhere php系列と、スレッドセーフ版(TS)か非スレッドセーフ版(NTS)か、x64かx86かを確かめます。入れ替えるzipを選ぶときに使います。
コマンドプロンプトphp -v php -i | findstr /c:"Thread Safety" /c:"Architecture"cURL拡張が使う同梱Brotliの版を表示します。1.2.1でなければ入れ替えの対象です。
コマンドプロンプトphp -r "echo curl_version()['brotli_version'] ?? 'none';"アプリとComposerで入れたライブラリ(vendorフォルダ)で、自動展開を有効にする設定と、Guzzleが入っているかを確かめます。vendor\guzzlehttpに当たるのはGuzzle自身の処理で、Guzzleを使っていれば初期設定で有効です。
コマンドプロンプトfindstr /s /i /m "CURLOPT_ENCODING CURLOPT_ACCEPT_ENCODING decode_content" *.php composer show guzzlehttp/guzzle配布元の一覧から、同じ系列・同じ種類(TS/NTS、x64/x86)の-1の版を入手し、SHA-256の値を一覧の
sha256sum.txtと照らし合わせます。PowerShellGet-FileHash .\php-8.5.12-1-nts-Win32-vs17-x64.zip -Algorithm SHA256php.iniを残してPHPのフォルダを入れ替え、Webサーバーを再起動します(IISの例)。そのあと、Webサーバーが使うPHPでもう一度
brotli_versionが1.2.1になったことを確かめます。コマンドプロンプト(管理者)iisreset php -r "echo curl_version()['brotli_version'] ?? 'none';"
07すぐに入れ替えられないとき
0810月21日のPHP本体の修正とは別に入れ替える

よくある質問
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]
出典・参考資料
- PHP公式:Updated PHP Windows builds for Brotli security fix2026-10-26(日本時間) / 再公開した4パッケージ、Brotli 1.2.1、cURLの自動展開の条件、-1の意味、回避策の記載がないこと
- CVEの記録:CVE-2026-111497(採番機関Google、NVDの評価を含む)2026-10-22(日本時間) / 対象のBrotliの版、影響、修正版、CVSS(Google 4.0 9.2・NVD 3.1 9.8)
- 米CISA:Known Exploited Vulnerabilities Catalog2026-10-30版 / CVE-2026-111497の追加日10月27日・対応期限11月10日、PHP本体の2件の追加日10月26日
- Google:Brotli v1.2.12026-10-22(日本時間) / Brotliの修正版の公開
- PHP公式:Windows向け配布物の一覧2026-11-01確認 / -1のパッケージ、-2以降が無いこと、sha256sum.txt、部品の一覧とVEXの公開、8.1.34の扱い、windows.php.netからの転送
- PHP公式:8.5.12-1(x64 NTS)の部品の一覧(CycloneDX)2026-10-26 / 同梱Brotliが1.2.1であること
- 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も同じ)
- Guzzle:CurlFactory.php・Client.php(7.16.1)2026-10-25 / decode_contentの初期値true、CURLOPT_ENCODINGに空文字を設定すること(8.3.1も同じ)
- WordPress:Requestsのcurl転送(wp-includes/Requests/src/Transport/Curl.php)2026-11-01確認 / CURLOPT_ENCODINGに空文字を設定すること
- PHP公式:PHP 8.5.12 Released!2026-10-21 / PHP本体の脆弱性2件(CVE-2026-109618・CVE-2026-109619)と修正版
- PHP公式:サポート中の版(releases/active)2026-11-01確認 / サポート中の系列が8.2〜8.5であること
- php-src:ext/curl/interface.c・curl.stub.php2026-11-01確認 / curl_version()がbrotli_versionを返すこと、CURLOPT_ENCODINGがCURLOPT_ACCEPT_ENCODINGの別名であること
- FIRST:EPSS(CVE-2026-111497)2026-10-31 / EPSSの値
- ELLIO:Node2Shell(CVE-2026-111497)(第三者の調査)2026-10-25(10-26更新) / 公開されたPoCと、Node.jsを狙う攻撃の通信の観測(CVEの記録に参考として掲載)
- PHP公式:8.5.12-1(x64 NTS)のVEX(OpenVEX)2026-10-26 / CVE-2026-111497の記載がないこと(11月1日確認)
- Laravel:Illuminate/Http/Client/PendingRequest.php(12.x)2026-11-01確認 / LaravelのHTTPクライアントがGuzzleを使うこと
- リリースノート:nodejs.org/en/blog/vulnerability/october-2026-security-releases#nodejs-brotli-decoder-out-GitHub Advisoryの参考リンク / 修正の内容・経緯
- 修正のコミット:github.com/google/brotli/commit/0ed4268a4401abcb4472096340477cf4af7d1a2bGitHub Advisoryの参考リンク / 修正の内容・経緯
- 修正のコミット:github.com/google/brotli/commit/50a9b70a4d5e1443fc40927952276b68fffa83a0GitHub Advisoryの参考リンク / 修正の内容・経緯
- 修正のコミット:github.com/google/brotli/commit/b418fa81c48262a86a95332b0bc6d62c30aa78b6GitHub Advisoryの参考リンク / 修正の内容・経緯
- 修正のコミット:github.com/google/brotli/commit/da9806362874b9bd4b552a3af360b5d6347beb12GitHub Advisoryの参考リンク / 修正の内容・経緯
- リリースノート:github.com/google/brotli/releases/tag/v1.0.10GitHub Advisoryの参考リンク / 修正の内容・経緯
あわせて読みたい記事
Brotliの脆弱性の確認方法、PythonとNode.jsで対象かを確かめて直す(CVE-2026-111497、コード実行のおそれ)
圧縮形式Brotliの展開処理の脆弱性CVE-2026-111497(HTTP2Shell)は、米CISAが悪用を確認しています。Pythonのbrotli・brotlicffi、Node.jsの同梱版などで、自分の版と構成が対象かを確かめる方法と修正版を、言語ごとに説明します。
LaravelのTokenGuardに認証回避の脆弱性、MySQL・MariaDBの一部の構成で他人として認証されるおそれ。Sanctumとの見分け方と11系以前の扱い
Laravelの脆弱性CVE-2026-114509は、TokenGuardで守るAPIに文字列でない値を送ると、MySQL・MariaDBの一部の構成で既存の利用者として認証されるおそれがあります。自社がTokenGuardかSanctumかの見分け方、12.69.0・13.30.0以上への上げ方、サポートが終わった11系以前の扱いを説明します。
Starletteの脆弱性BadHost、Hostヘッダーでパスによる認証の確認を回避されるおそれ。FastAPIを上げても古い版が残る場合の確かめ方
Starletteの脆弱性CVE-2026-48710(BadHost)は、細工したHostヘッダーでrequest.url.pathを偽り、パスで判定するアクセスの確認を回避されるおそれがあります。9月2日にKEVに追加されました。FastAPI・vLLM・LiteLLMの下で古いStarletteが残る例と、間接依存の確かめ方を説明します。