Skip to main content

Brotli 脆弱性 CVE-2026-111497 対策:CentOS 7・RHEL・Amazon Linux 2 の libbrotli 更新

この記事は英語版の日本語訳です。


いま話題の Brotli 脆弱性 CVE-2026-111497(通称 HTTP2Shell)は、Brotli のデコーダー(展開処理)のバグです。CentOS 7 と Amazon Linux 2 では、GetPageSpeed が提供する libbrotli 1.2.1 への更新が対策になります。EPEL 7 はアーカイブ済みで、脆弱な 1.0.9 のまま更新されないためです。RHEL、Rocky Linux、AlmaLinux 8〜10 はディストリビューション自身の修正版で対応できます。NGINX の Brotli 圧縮モジュールは圧縮しか行わないため、影響を受けません。

CVE-2026-111497  Google Brotli デコーダーの境界外書き込み (c/dec/decode.c), CWE-787
別名:             HTTP2Shell (F5), Broccoli2Shell, Node2Shell; GHSA-9v8h-qqgm-4m35
影響範囲:         Google Brotli 1.0.3 〜 1.2.0
上流の修正版:     1.0.10, 1.1.1, 1.2.1
深刻度:           Red Hat: Important, CVSS 3.1 8.1; CISA KEV 掲載
CentOS 7 EPEL:   libbrotli 1.0.9-10.el7(アーカイブ済み、修正なし)
CentOS 7 対策:    extras.getpagespeed.com の libbrotli 1.2.1 (x86_64, aarch64)
Amazon Linux 2:  extras.getpagespeed.com の libbrotli 1.2.1 (x86_64, aarch64)

CentOS 7 と Amazon Linux 2 での CVE-2026-111497 対策

yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y update libbrotli brotli
rpm -q libbrotli
Free to install; commercial production use requires a subscription.

最後のコマンドが libbrotli-1.2.1 のビルド(例: CentOS 7 では libbrotli-1.2.1-5.el7.x86_64、Amazon Linux 2 では libbrotli-1.2.1-5.amzn2.x86_64)を表示すれば完了です。package libbrotli is not installed と表示された場合、そのサーバーにはシステムの Brotli ライブラリを使うプログラムがありません。それ以外の場合、このパッケージ 1 つで、NGINX、curl、OpenSSL など、システムの Brotli ライブラリにリンクしているすべてのプログラムが修正されます。ただし、起動中のプロセスは再起動するまで古いライブラリを使い続けるため、常駐サービスは再起動してください。

systemctl restart nginx

CentOS 7 では、最初のコマンドで停止済みの mirrorlist.centos.org の参照先もメンテナンスされている vault に切り替わるため、動かなくなっていた yum も再び使えるようになります。

修正版は x86_64 と ARM64(aarch64)の両方で公開されています。

RHEL、Rocky Linux、AlmaLinux 8・9・10

ディストリビューションが修正版を出しているので、通常の更新で対応できます。

dnf -y upgrade --refresh libbrotli brotli
rpm -q --changelog libbrotli brotli | grep CVE-2026-111497

検証では、AlmaLinux 9.8 が libbrotli-1.0.9-10.el9_8.1 に、AlmaLinux 10.2 が libbrotli-1.1.0-8.el10_2.1 に更新されました。EL8 ではライブラリが brotli パッケージに含まれており、brotli-1.0.6-5.el8_10 で修正されています。3 つとも changelog に CVE-2026-111497 が記載されています。EL8 で GetPageSpeed リポジトリを有効にしている場合は、同じコマンドで修正済みの brotli と libbrotli 1.2.1 に更新されます。

Debian と Ubuntu

apt-get update
apt-get install --only-upgrade libbrotli1
dpkg-query -W libbrotli1

修正版は Debian 12 が 1.0.9-2+deb12u1、Debian 13 が 1.1.0-2+deb13u1、Ubuntu 22.04 が 1.0.9-2ubuntu0.1、Ubuntu 24.04 が 1.1.0-2ubuntu0.1 です。Ubuntu 16.04、18.04、20.04 の修正は Ubuntu Pro 経由でのみ提供されています。

CVE-2026-111497 とは

Brotli デコーダー(c/dec/decode.c)の境界外書き込みです。Red Hat によると、問題はブロックタイプ切り替えの処理にあります。細工した Brotli 圧縮ストリームでデコーダーの内部状態を壊すことができ、CVE レコードによれば、認証不要のリモート攻撃者がメモリ内容の漏えい、サービス停止、場合によっては任意コード実行を引き起こせます。公開日は 2026 年 10 月 22 日で、CISA の Known Exploited Vulnerabilities カタログにも追加されています。

攻撃の条件は 1 つだけです。攻撃者が用意した Brotli データを、プログラムが展開すること。Red Hat は攻撃の複雑さを「高」と評価しており、深刻度を Critical ではなく Important としています。上流の修正は Brotli 1.2.1 で、古いブランチ向けに 1.0.10 と 1.1.1 も出ています。

NGINX は Brotli 脆弱性の影響を受けるか

標準の NGINX は Brotli をリンクしていません。影響は、読み込んでいる Brotli モジュールによって決まります。

パッケージ Brotli の使い方 影響 対応
nginx-module-brotli(ngx_brotli) レスポンスの圧縮、.br ファイルの配信 なし(エンコーダーのみ) この CVE では不要
nginx-module-unbrotli アップストリームの br レスポンスを展開 あり(システムライブラリ経由) yum update libbrotli
curl-latest、libcurl-latest HTTP の br レスポンスを展開 あり(システムライブラリ経由) yum update libbrotli
openssl35、openssl35-libs 受信した TLS 証明書を展開(RFC 8879) あり(システムライブラリ経由) yum update libbrotli

F5 K000163902 も NGINX Plus について同じ結論です。NGINX Plus の Brotli モジュールは圧縮と圧縮済みファイルの配信のみで展開は行わないため、更新は不要としています。そのうえで、同じサーバー上の他のプログラムのために OS の Brotli ライブラリは更新するよう勧めています。

GetPageSpeed のビルドでも同じことが確認できます。CentOS 7 で ldd を実行すると、ngx_http_brotli_filter_module.so がリンクしているのは libbrotlienc と libbrotlicommon だけで、ngx_http_brotli_static_module.so は Brotli ライブラリを一切リンクしていません。ngx_http_unbrotli_filter_module.so はデコーダーの libbrotlidec をリンクしています。どのモジュールも Brotli を内蔵していないため、NGINX を入れ直さなくてもライブラリの更新だけで修正されます。Brotli 圧縮をまだ設定していない場合は、NGINX Brotli モジュールのインストール方法を参照してください。

注意が必要なのは NGINX unbrotli モジュールです。バックエンドが Content-Encoding: br で返した本文は、そのままデコーダーに渡されます。つまり、乗っ取られたアップストリームや悪意のあるアップストリームからは脆弱なコードに届きます。libbrotli を修正版にすれば、これまでどおり使えます。

yum -y install nginx-module-unbrotli
Free to install; commercial production use requires a subscription. Without one, a small license notice appears on HTML pages after 30 days.

サーバーが脆弱かどうかを確認する

まずライブラリのバージョンです。

rpm -q libbrotli brotli

ベンダーの修正が入っていない 1.0.3〜1.2.0 はすべて脆弱で、EPEL 7 の libbrotli-1.0.9-10.el7 も該当します。次に、デコーダーを使っているパッケージを一覧します。

rpm -q --whatrequires 'libbrotlidec.so.1()(64bit)'

curl-latest、nginx-module-brotli、nginx-module-unbrotli を入れた CentOS 7 の検証環境では、brotli、openssl35-libs、libcurl-latest、curl-latest、nginx-module-unbrotli が表示されました。デコーダーを使わない nginx-module-brotli は出てきません。なお、rpm -q --whatrequires libbrotli は no package requires libbrotli と表示します。各パッケージが依存しているのはパッケージ名ではなく、ライブラリの soname だからです。

個別のバイナリやモジュールは ldd で確認できます。

ldd /usr/lib64/nginx/modules/ngx_http_unbrotli_filter_module.so | grep brotli

/lib64/libbrotlidec.so.1 を指す行があれば、そのモジュールはシステムライブラリを使っており、libbrotli の更新で修正されます。修正版のライブラリを入れると、curl-latest --version には brotli/1.2.1 と表示されます。

最後に、更新後も古いライブラリを使い続けているプロセスを探します。

grep -l 'libbrotlidec.*(deleted)' /proc/[0-9]*/maps 2>/dev/null

表示されたパスのプロセスは再起動が必要です。

CentOS 7 の Python 用 Brotli バインディング

Python バインディングは Brotli を自身の拡張モジュールに組み込んでいるため、libbrotli の更新では修正されません。GetPageSpeed の古いサブパッケージのうち、python-brotli と python34-brotli の 2 つが 1.0.7 のままです。

python-brotli は自動で置き換わります。python2-brotli 1.2.1 が python-brotli を obsoletes しているため、yum update で入れ替わり、import 後のバージョンは 1.2.1 になります。

1.2.1-3 以降は python36-brotli も同じように python34-brotli を置き換えます。yum update の後も rpm -q python34-brotli が 1.0.7 を表示する場合は、Python 3.6 版を入れてから古いパッケージを削除してください。

yum -y install python36-brotli
yum -y remove python34-brotli

修正済みのサーバーで yum remove python-brotli を実行しないでください。python2-brotli が python-brotli という名前を provides しているため、修正版のほうが削除されてしまいます。

CentOS 7 に他の修正手段がない理由

Debian、Ubuntu、Red Hat、AlmaLinux は数日以内に修正版を出しました。一方、CentOS 7 にはもうそうした更新経路が残っていません。CentOS 7 の Brotli は EPEL 7 から入れるものでしたが、EPEL 7 はアーカイブ済みです。最終ビルドの libbrotli-1.0.9-10.el7 は影響範囲のど真ん中にあり、今後更新されることはありません。EPEL から Brotli を入れた Amazon Linux 2 も同じ状況です。

GetPageSpeed の libbrotli 1.2.1 は、Fedora や EPEL と同じパッケージ分割になっています。CentOS 7.9 での検証では、EPEL の libbrotli-1.0.9-10.el7 が yum update 1 回で、競合なしにそのまま置き換わりました。

検証方法

この記事のコマンドは、すべてクリーンなコンテナで実行しました。CentOS 7.9、Amazon Linux 2、AlmaLinux 8.10・9.8・10.2 で、いずれも x86_64 です。CentOS 7 では、先に EPEL の脆弱な libbrotli-1.0.9-10.el7 を入れてから対策コマンドを実行しました。更新後、ldd ですべての Brotli 利用プログラムが 1.2.1 のライブラリを参照していること、curl-latest --version が brotli/1.2.1 を表示すること、Python の確認結果が記事のとおりであることを確かめています。

よくある質問

ngx_brotli は CVE-2026-111497 の影響を受けますか?

受けません。nginx-module-brotli として配布している ngx_brotli は、レスポンスの圧縮と圧縮済みファイルの配信しか行わず、展開はしません。脆弱なデコーダーが動くことはありません。F5 も NGINX Plus の Brotli モジュールについて同じ見解です。

NGINX を入れ直す必要はありますか?

ありません。NGINX の Brotli モジュールはシステムライブラリにリンクしているため、yum update libbrotli で修正されます。ワーカーに新しいライブラリを読み込ませるため、NGINX は再起動してください。

CentOS 7 の EPEL の brotli は修正されていますか?

されていません。EPEL 7 は libbrotli-1.0.9-10.el7 でアーカイブされており、これは脆弱です。代わりに GetPageSpeed リポジトリの libbrotli 1.2.1 を入れてください。

NGINX 側で攻撃を防ぐことはできますか?

F5 は自社製品向けの暫定策として、Content-Encoding: br 付きのリクエストを拒否する方法を挙げています。ただし、効果があるのはサーバーがリクエスト本文を展開する場合だけです。接続の相手側から Brotli データを受け取る nginx-module-unbrotli、curl、OpenSSL には効きません。ライブラリを更新してください。

まとめ

Brotli 脆弱性はデコーダーのバグなので、直すべきは NGINX ではなくライブラリです。RHEL、Rocky Linux、AlmaLinux 8〜10 はベンダーの修正版があります。CentOS 7 と Amazon Linux 2 では、GetPageSpeed リポジトリから yum update libbrotli を実行すれば 1.2.1 が入り、NGINX、curl、OpenSSL がまとめて修正されます。

CentOS 7 のサーバーで古いのは、たいていライブラリだけではありません。 同じサーバーで PHP を動かしているなら、次は CentOS 7 の PHP2Shell 対策を確認してください。CentOS 7 向け Everpatch には、カーネルから PHP、NGINX モジュールまで、GetPageSpeed が EL7 向けに更新を続けているものがまとまっています。

ライブラリを直しても、設定までは直りません。前段の NGINX の設定は、変更のたびに少しずつずれていきます。GetPageSpeed Amplify は全ホストで gixy による定期スキャンを実行し、検出結果を NGINX の実行時メトリクスと結び付けます。サポートが終了した nginx-amplify-agent(2026年1月に EOL)とそのまま置き換えられます。

業務でこれらのサーバーを運用しているなら、GetPageSpeed のサブスクリプションで、CentOS 7 と Amazon Linux 2 を含む対応ディストリビューションすべての NGINX ビルドとモジュールを利用できます。