Technical Briefing: CVE-2026-111497 (Brotli Decoder Flaw), Fixes by Distro and NGINX Impact
Today’s source is a new GetPageSpeed article on CVE-2026-111497, an out-of-bounds write in Google Brotli’s decoder. It explains which distributions ship fixes, how to patch servers stranded on end-of-life platforms (CentOS 7, Amazon Linux 2, older Debian/Ubuntu), and which NGINX packages are actually exposed. Commands, versions and caveats are as stated in the article.
The Problem
The vulnerability
| Item | Detail |
|---|---|
| Type | Out-of-bounds write in c/dec/decode.c (CWE-787). Red Hat locates it in the block-type switch handling. |
| Aliases | HTTP2Shell (F5), Broccoli2Shell, Node2Shell; GHSA-9v8h-qqgm-4m35 |
| Affected | Brotli 1.0.3 through 1.2.0 |
| Fixed upstream | 1.0.10, 1.1.1 and 1.2.1 |
| Impact | A crafted Brotli stream corrupts adjacent decoder state. A remote unauthenticated attacker can disclose memory, cause a denial of service, or potentially execute code. |
| Severity | Red Hat rates it Important (CVSS 3.1 8.1), not Critical, because it scores attack complexity as high. |
| Status | Published October 22, 2026. Listed in CISA KEV. |
| Trigger | Always a program that decompresses attacker-controlled Brotli data. |
The key point is that this is a decoder bug. Software that only compresses with Brotli does not reach the vulnerable code.
Why some servers are stranded
- CentOS 7: EPEL 7 is archived at the vulnerable
libbrotli-1.0.9-10.el7and will never be updated. - Amazon Linux 2: Servers that took Brotli from EPEL are in the same position.
- Ubuntu 18.04/20.04 and Debian 10: These are officially fixed only through Ubuntu Pro and paid Freexian ELTS respectively.
- Ubuntu 16.04: This release is still fixed only through Ubuntu Pro. The article offers no alternative build for it.
The Implementation: Fixes by Platform
CentOS 7 and Amazon Linux 2 (x86_64, aarch64)
GetPageSpeed’s extras repository provides libbrotli 1.2.1:
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y update libbrotli brotli
rpm -q libbrotli
- Expected output:
- CentOS 7:
libbrotli-1.2.1-5.el7.x86_64 - Amazon Linux 2:
libbrotli-1.2.1-5.amzn2.x86_64
- CentOS 7:
- If the last command prints
package libbrotli is not installed, nothing on the server uses the system Brotli library. - Coverage: This one package fixes everything that links the system library, including NGINX, curl and OpenSSL.
- Restart required: Running processes keep the old library mapped until they restart, e.g.
systemctl restart nginx. - CentOS 7 side benefit: The first command also repoints the dead
mirrorlist.centos.orgentries to a maintained vault. This makes yum work again on servers where it had stopped. - Compatibility: The package uses the same package split as Fedora/EPEL. On CentOS 7.9 it upgraded EPEL’s package in place with no conflicts.
- Licensing caveat: The package is free to install. Commercial production use requires a subscription.
RHEL, Rocky Linux and AlmaLinux 8–10
The vendor ships the fix:
dnf -y upgrade --refresh libbrotli brotli
rpm -q --changelog libbrotli brotli | grep CVE-2026-111497
Tested results:
| Release | Fixed package |
|---|---|
| AlmaLinux 9.8 | libbrotli-1.0.9-10.el9_8.1 |
| AlmaLinux 10.2 | libbrotli-1.1.0-8.el10_2.1 |
| EL8 | brotli-1.0.6-5.el8_10 (on EL8 the library lives inside the brotli package) |
- All three changelogs name the CVE.
- On EL8 with the GetPageSpeed repository enabled, the same command moves you to 1.2.1 instead, which is also fixed.
Debian and Ubuntu, supported releases
apt-get update
apt-get install --only-upgrade libbrotli1
dpkg-query -W libbrotli1
| Release | Fixed version |
|---|---|
| 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 18.04/20.04 and Debian 10 (amd64, arm64)
GetPageSpeed provides backported builds:
wget https://extras.getpagespeed.com/release-latest.deb
apt-get install ./release-latest.deb
apt-get update
apt-get install --only-upgrade libbrotli1
dpkg-query -W libbrotli1
| Release | Expected version |
|---|---|
| Ubuntu 18.04 | 1.0.3-1ubuntu1.3+gps1+ubuntu1804+stable |
| Ubuntu 20.04 | 1.0.7-6ubuntu0.1+gps1+ubuntu2004+stable |
| Debian 10 | 1.0.7-2+deb10u2+gps1+deb10+stable |
- No relinking needed: The Brotli version and soname stay the same as stock, so nothing that links the library needs reinstalling.
- Restart long-running services afterwards.
Is NGINX Affected?
Stock NGINX does not link Brotli at all. Exposure depends on which modules and companion packages are installed:
| Package | What it does with Brotli | Affected? |
|---|---|---|
nginx-module-brotli (ngx_brotli) |
Compresses responses, serves .br files |
No (encoder only) |
nginx-module-unbrotli |
Decompresses br responses from upstreams |
Yes, via the system library → yum update libbrotli |
curl-latest, libcurl-latest |
Decompresses br HTTP responses |
Yes → yum update libbrotli |
openssl35, openssl35-libs |
Decompresses received TLS certificates (RFC 8879) | Yes → yum update libbrotli |
- F5’s verdict (K000163902): The NGINX Plus Brotli module never decompresses and needs no update. F5 still advises updating the OS Brotli library for other programs on the server.
lddevidence on CentOS 7:ngx_http_brotli_filter_module.solinks onlylibbrotliencandlibbrotlicommon.ngx_http_brotli_static_module.solinks no Brotli library.ngx_http_unbrotli_filter_module.solinkslibbrotlidec, the decoder.- No module bundles its own Brotli copy. The library update therefore fixes them without reinstalling NGINX. You only need to restart it.
- The module to watch is unbrotli. When a backend sends
Content-Encoding: br, its body goes straight to the decoder. A compromised or hostile upstream can therefore reach the vulnerable code.- Once libbrotli is fixed, you can keep using the module as before (
yum -y install nginx-module-unbrotli). - Licensing: without a subscription, a small license notice appears on HTML pages after 30 days.
- Once libbrotli is fixed, you can keep using the module as before (
Checking Exposure
- Library version:
rpm -q libbrotli brotliAnything from 1.0.3 to 1.2.0 without a vendor fix is vulnerable. This includes EPEL 7’s build.
-
Decoder consumers:
rpm -q --whatrequires 'libbrotlidec.so.1()(64bit)'- On a CentOS 7 test box this listed
brotli,openssl35-libs,libcurl-latest,curl-latestandnginx-module-unbrotli. nginx-module-brotliwas absent because it never touches the decoder.- Do not query the package name instead.
rpm -q --whatrequires libbrotliprintsno package requires libbrotli, because packages depend on sonames, not the package name.
- On a CentOS 7 test box this listed
- Single binary or module:
ldd /usr/lib64/nginx/modules/ngx_http_unbrotli_filter_module.so | grep brotli- A line pointing at
/lib64/libbrotlidec.so.1means the system library update covers it. curl-latest --versionshowsbrotli/1.2.1once fixed.
- A line pointing at
- Processes still on the old library:
grep -l 'libbrotlidec.*(deleted)' /proc/[0-9]*/maps 2>/dev/nullEach path printed belongs to a process that still needs a restart.
Python Bindings on CentOS 7
The libbrotli update does not cover the Python bindings. They compile Brotli into their own extension module. The old python-brotli and python34-brotli subpackages are still at 1.0.7.
- python-brotli:
python2-brotli1.2.1 obsoletes it, soyum updateswaps it in automatically. The import then reports 1.2.1. - python34-brotli: Since 1.2.1-3,
python36-brotliobsoletes it. Ifrpm -q python34-brotlistill shows 1.0.7 after updating, run:
yum -y install python36-brotli
yum -y remove python34-brotli - Warning: Do not run
yum remove python-brotlion a fixed server.python2-brotliprovides that name, so yum would remove the fixed package.
Caveats
- Blocking
Content-Encoding: brin NGINX is not a substitute for patching.- F5’s interim advice for its own products is to reject such requests. That only helps where the server decompresses request bodies.
- It does nothing for unbrotli, curl or OpenSSL, which receive Brotli data from the other side of the connection.
- Update the library instead.
- Test environment: All commands were verified in clean x86_64 containers:
- CentOS 7.9, starting from EPEL’s vulnerable build
- Amazon Linux 2
- AlmaLinux 8.10, 9.8 and 10.2
- Other stale packages: The article advises checking CentOS 7 boxes running PHP for “PHP2Shell” as well. That vulnerability was covered in the previous briefings on CentOS 6.
The Practical Payoff
- The fix belongs in the library, not NGINX. A single
libbrotliupdate fixes every program that links the system decoder: NGINX’s unbrotli module, curl, and OpenSSL’s certificate decompression. - Most servers need no reinstallation or relinking, only a service restart.
- Stranded platforms get a usable path:
- CentOS 7 and Amazon Linux 2 get 1.2.1.
- CentOS 7 also gets working yum mirrors.
- Ubuntu 18.04/20.04 and Debian 10 get soname-compatible backports.
- The common ngx_brotli setup is not exposed. It is encoder-only and never touches the vulnerable code.
Bottom line: Update libbrotli (1.2.1 on CentOS 7/AL2, vendor packages elsewhere), handle the Python bindings separately on CentOS 7, then restart long-running services and confirm that none still map the deleted library.
Read the full article: Brotli CVE-2026-111497 on CentOS 7, RHEL and Amazon Linux 2: Fix libbrotli