The Brotli flaw (CVE-2026-111497) on WordPress: check your server and close the gap

A critical bug in Brotli, the compression library behind most web traffic, is on the US list of actively exploited flaws. WordPress doesn’t include Brotli, yet a default WordPress site can be made to run the broken code without anyone logging in. The fix is a server update, not a WordPress or plugin update. Here is how to check yours and what to do until it’s in place.

By the Moatline team at Next Nova Technologies · Published 1 November 2026 · 7 min read

Worried your site was knocked offline?See what your visitors and Google see right now. Free, no sign-up, about 20 seconds.
Check my site free

Short answer

  • Affected: servers with Brotli 1.0.3 to 1.2.0, which most Linux and Windows PHP setups use through curl. No login needed via pingbacks.
  • Fix: the server’s Brotli security update, then restart PHP. A WordPress or plugin update doesn’t fix it.
  • Today: turn off XML-RPC pingbacks. So far attacks on WordPress crash sites; no break-in is confirmed.

What happened

  • The bug: CVE-2026-111497, rated 9.2 out of 10, is a memory flaw in the part of Google’s Brotli library that unpacks compressed data. A crafted compressed response can crash the program reading it, leak memory or, in some programs, let an attacker run code.
  • Affected: Brotli 1.0.3 to 1.2.0. The fixes, 1.0.10, 1.1.1 and 1.2.1, came out on 21 October 2026, and Linux distributions have since released patched packages.
  • The nickname: “Node2Shell”, because the first public code-execution exploits targeted Node.js.
  • Attacks: the threat-monitoring firm ELLIO reported exploit traffic in the wild, and the US cyber agency CISA added it to its list of exploited vulnerabilities on 27 October 2026, with a 10 November deadline for US government systems.

Why WordPress is exposed, even though it doesn’t ship Brotli

WordPress fetches outside addresses all the time, and it does it through curl, the download tool built into PHP. WordPress tells curl to accept and unpack any compression the other server sends, Brotli included, and there is no setting to turn that off. The unpacking happens inside curl, before WordPress sees anything. So if WordPress fetches an address from an attacker’s server, that server can answer with a booby-trapped Brotli response.

The routes on a typical site:

  • Pingbacks through xmlrpc.php. Anyone can send one, no login needed, and WordPress then fetches the address they give. On a default install this is open. It’s the route the public test uses.
  • Link previews (oEmbed) when someone pastes a link into a post. This needs a Contributor account or higher.
  • Feeds your site reads, for example in an RSS widget.
  • Plugins that fetch an address a visitor gives them: link previews, image or URL importers, webhook checks, avatar proxies.

A firewall plugin can’t see this attack. The request to your site looks normal, and the harmful part arrives in the answer from the attacker’s server, which curl unpacks before any plugin runs.

How serious is it for WordPress?

  • Crashing the site: shown. A public test published on 27 October uses a pingback to kill a server worker or pin it at 100% CPU, with a payload under 100 bytes. Repeated, that can take a site offline.
  • Taking over the site: not shown. The public code-execution exploits target Node.js and Bun, not PHP. Patchstack found no public chain against PHP as of 30 October.
  • Hacked WordPress sites: none confirmed publicly as of 1 November 2026.

So for now it’s mainly a way to knock sites offline. Patch it this week, but it doesn’t mean your site has been hacked.

Check your server

On shared or managed hosting, you can’t check this yourself. Ask support: “Is the October 2026 Brotli security update (CVE-2026-111497) installed, and has PHP been restarted since?”

With SSH access, check the installed package:

# Debian / Ubuntu
dpkg -l 'libbrotli*'

# AlmaLinux / Rocky / RHEL / CloudLinux
rpm -q brotli

Compare the version with the fixed one for your system:

SystemFixed package
Debian 121.0.9-2+deb12u1
Debian 131.1.0-2+deb13u1
Ubuntu 22.041.0.9-2ubuntu0.1
Ubuntu 24.041.1.0-2ubuntu0.1
Ubuntu 26.041.2.0-3ubuntu0.1
AlmaLinux 8brotli-1.0.6-5.el8_10
AlmaLinux 9brotli-1.0.9-10.el9_8.1
AlmaLinux 10brotli-1.1.0-8.el10_2.1
Windows (PHP’s own builds)8.5.12-1, 8.4.27-1, 8.3.36-1, 8.2.35-1
Don’t go by the version PHP reports. Debian and Ubuntu fix the existing package without changing its main version number, so php -r 'echo curl_version()["brotli_version"];' still says 1.1.0 on a patched Debian 13 server. Only the full package version above tells you. For example, 1.1.0-2+b7 is vulnerable and 1.1.0-2+deb13u1 is fixed.

Running WordPress in Docker? The official wordpress image still installed the vulnerable package on 30 October. Upgrade libbrotli1 in your own image until the base image is rebuilt.

On Windows (IIS, XAMPP, WAMP), PHP includes its own Brotli, so the fix is PHP’s rebuilt 26 October package. The free Moatline Malware Scanner checks this on Windows servers and warns you when the old build is still in place.

Fix it

  1. Install the update.
    # Debian / Ubuntu
    apt-get update && apt-get install --only-upgrade libbrotli1
    
    # AlmaLinux / Rocky / RHEL
    dnf upgrade --refresh brotli
  2. Restart PHP and the web server, or reboot. Running PHP-FPM workers keep the old library in memory until they restart. On Debian and Ubuntu, needrestart lists the services still using it.
  3. Check the package version again against the table.

If you look after several client sites on different hosts, send each host the support question above. Sites on the same server share one Brotli package, so a single update covers them all.

Until the update is in

None of these fix the bug, but they close the doors a WordPress site leaves open:

  1. Turn off pingbacks. This closes the route that needs no login. In the free Moatline Malware Scanner: Protect → Spam & bots → XML-RPC → Block. If you use Jetpack, choose Jetpack-safe, which refuses everything except Jetpack’s own signed requests. Without Moatline, block xmlrpc.php at the server:
    # Apache 2.4 (.htaccess)
    <Files xmlrpc.php>
      Require all denied
    </Files>
    
    # Nginx
    location = /xmlrpc.php { deny all; }
    The common xmlrpc_enabled filter doesn’t stop pingbacks, so don’t rely on it alone.
  2. Optional: stop WordPress unpacking compressed downloads. This covers pingbacks, link previews, feeds and plugins at once. Save it as wp-content/mu-plugins/no-brotli.php and delete it once the server is patched:
    <?php
    // Temporary: stop curl unpacking compressed responses (CVE-2026-111497).
    add_action( 'http_api_curl', function ( $handle ) {
        curl_setopt( $handle, CURLOPT_ENCODING, 'identity' );
        curl_setopt( $handle, CURLOPT_HTTP_CONTENT_DECODING, 0 );
    } );
    Downloads get a little bigger and slower. Test plugin and theme updates after adding it.
  3. Review plugins that fetch links for visitors, such as link preview or importer plugins, and switch off any you don’t need.

Signs of an attack

  • Crashes in the error log: Apache Segmentation fault (11), or PHP-FPM children “exited on signal 11”, sometimes mentioning libbrotlidec.
  • PHP workers stuck at 100% CPU, or pages timing out with no clear cause.
  • Many POST /xmlrpc.php requests in your access log, especially pingbacks pointing at unfamiliar or brand-new domains.

A crash isn’t a break-in. But if your host sees the web server user starting a shell or curl, treat the site as compromised: scan it, check for admins you didn’t create and follow the cleanup steps.

Related: PHP2Shell, the PHP flaw from the same week and WordPress 7.1.4.

Sources: Patchstack, Panelica (fixed packages by system), Sophos and Help Net Security.

Other plugins are being attacked right now too. See the live list of WordPress plugins under active attack.

Don’t want to do this yourself? Our team cleans hacked WordPress sites every week: WordPress malware removal service, from $45, usually done within 24 hours.

Frequently asked questions

Will updating WordPress or my plugins fix this?
No. The bug is in the Brotli library on the server, which WordPress uses through curl. WordPress 7.1.4 doesn’t change it. The fix is your server’s security update for Brotli, plus a restart of PHP.
I’m on shared hosting. What can I do?
Ask your host whether the October 2026 Brotli security update (CVE-2026-111497) is installed and PHP has been restarted since. Meanwhile, turn off XML-RPC pingbacks, which you can do yourself from the WordPress dashboard.
Has any WordPress site been hacked through this?
Not publicly, as of 1 November 2026. A public test crashes WordPress servers through pingbacks, and the code-execution attacks shown so far target Node.js, not PHP. The CISA listing means it is being exploited somewhere, so patch rather than wait.
Why is it called Node2Shell?
The first public code-execution exploits targeted Node.js, which bundles its own copy of Brotli. The same bug sits in every program that uses an unpatched Brotli to unpack data, including curl on most Linux web servers.
Does turning off XML-RPC break anything?
Blocking it stops Jetpack, the WordPress mobile app and old desktop blogging tools. If you use Jetpack, keep XML-RPC on and switch off pingbacks only. Most other sites never use XML-RPC.
My server’s Brotli says 1.1.0. Is that vulnerable?
Not necessarily. Debian and Ubuntu add the fix to their existing 1.1.0 package and only change the end of the package name, so the version PHP reports stays 1.1.0. Check the full package version against the table above.

Scan your site for free

Moatline checks files, the database and page-builder content. Nothing changes unless you click a button.

More guides

All guides →