Brotli out-of-bounds write CVE-2026-111497 (CVSS 9.2) added to CISA KEV; reachable on stock WordPress via xmlrpc.php pingback
Matéria consolidada. Reúne 2 matérias que o Tifon tinha publicado separadamente sobre a mesma história. A IA reescreveu o relatório com o que as 2 fontes trouxeram em 31/10/2026 00:08; os links antigos trazem para cá.
Fontes: patchstack.com ↗ gbhackers.com ↗
CVE-2026-111497 is an out-of-bounds write in Google's Brotli decoder (CVSS 9.2) that affects Brotli 1.0.3–1.2.0 and was fixed on 21 October 2026 in 1.0.10, 1.1.1 and 1.2.1. CISA added it to the KEV catalog on 27 October with a federal deadline of 10 November (patchstack.com). Cloudflare had already shipped two emergency WAF detection rules on 25 October, in Log mode by default (gbhackers.com). Patchstack (30 October) shows the flaw is reachable on default WordPress installs via an unauthenticated pingback.ping call to xmlrpc.php, even though WordPress does not ship Brotli (patchstack.com). Public tooling reliably causes denial of service from a sub-100-byte payload. Working RCE chains exist only against specific non-PIE Node.js/Bun builds, not PHP/Apache/FPM (patchstack.com).
Entenda a falha
A vulnerabilidade
CVE-2026-111497 is an out-of-bounds write in Google's Brotli decoder (CVSS 9.2) affecting Brotli 1.0.3 through 1.2.0, fixed on 21 October 2026 in 1.0.10, 1.1.1 and 1.2.1. On stock WordPress it is reachable without authentication: a pingback.ping POST to xmlrpc.php makes WordPress fetch an attacker URL, and the attacker's server answers with a malformed Brotli body that libcurl decodes. The reliable outcome is denial of service (killed or CPU-pinned workers); memory disclosure and code execution are harder. CISA added it to KEV on 27 October with a 10 November deadline.
Como funciona
A pingback.ping request to xmlrpc.php carries a source URL, and pingback_ping() fetches it with wp_safe_remote_get(), through WP_Http and the Requests cURL transport. That transport sets CURLOPT_ENCODING to an empty string, so libcurl accepts any compression. The attacker's server replies with Content-Encoding: br and a malformed stream, which libcurl decompresses inside curl_exec() before any PHP code sees the body. At that step the decoder writes past the end of its buffer into adjacent heap memory, and the worker crashes or hangs.
Por que é vulnerável
The root cause is an out-of-bounds write in the Brotli decoder when handling a malformed stream. It is exposed in WordPress because the cURL transport always asks libcurl to decode any compression (decompress => false does not change that), and because the reject_unsafe_urls SSRF filter in wp_safe_remote_get() only checks internal IPs and ports, never Content-Encoding. The xmlrpc_enabled filter gates only authenticated methods, so pingback stays reachable. The payload arrives in the response, so WAFs inspecting the request cannot see it. The articles do not detail the code change in the fix.
Onde está
The flaw is in the Brotli decoder (libbrotlidec), reached via libcurl; on the WordPress side the route runs through pingback_ping(), wp_safe_remote_get() and the Requests cURL transport constructor setting CURLOPT_ENCODING. No fixing commit is named.
Como foi descoberta
The articles do not say who found the flaw or how it was reported. They state that Google assigned the CVE and scored it 9.2, the fix was released on 21 October 2026, and CISA added it to KEV on 27 October, which indicates exploitation. Cloudflare shipped WAF detection rules on 25 October without giving severity or exploitation details. Patchstack published its WordPress exposure analysis on 30 October, and a lab write-up on 27 October demonstrated the pingback path.
PoC pública
Public proofs of concept are circulating. For the WordPress path, a lab published on 27 October drives the bug through pingback and shows a worker killed outright or pinned at 100% CPU by a payload under a hundred bytes; its author says no code execution is included and blind remote RCE is not established. Working shells exist against specific non-PIE Node.js and Bun builds, relying on fixed offsets, but not against PHP behind Apache or FPM. Denial of service is trivially reproducible, so patch urgently; RCE against PHP is not public but could be built per build.
Explicação gerada por IA a partir da matéria e dos artigos, em 31/10/2026 00:23.
Detalhes técnicos
- The attack path: an attacker sends a
pingback.pingPOST, WordPress fetches an attacker-controlled URL, and the attacker's server replies with a malformed Brotli body that libcurl decompresses insidecurl_exec()before any PHP code sees it (patchstack.com). - WordPress's bundled Requests cURL transport sets
CURLOPT_ENCODINGto an empty string on every handle, so libcurl accepts any compression.decompress => falsedoes not prevent this (patchstack.com). pingback.pingis in the default XML-RPC method map and needs no authentication.pingback_ping()useswp_safe_remote_get(), whosereject_unsafe_urlsSSRF filter never inspectsContent-Encoding. The commonxmlrpc_enabledfilter gates only authenticated methods, so pingback stays reachable (patchstack.com).- Other reachable paths include oEmbed, feeds, and plugins that fetch visitor-supplied URLs, such as link previews, importers, webhook verifiers and avatar proxies (patchstack.com).
- WAFs cannot detect the WordPress attack because the malicious payload arrives in the server's response, not the inbound request (patchstack.com).
- Cloudflare rule suffix …ca706f3c matches requests with
Content-Encoding: br(a Brotli-encoded request body). It does not matchAccept-Encoding: br, and Cloudflare's Brotli response-compression settings are unchanged (gbhackers.com). - Cloudflare rule suffix …402fe5bb matches requests to the
/_next/imageendpoint used for Next.js image optimization, covering legitimate and malicious image requests alike (gbhackers.com). - Both Cloudflare rules also match legitimate traffic, so a match does not confirm an exploitation attempt (gbhackers.com).
- Host indicators: Apache
AH00051: child pid N exit signal Segmentation fault (11), PHP-FPM children exiting on signal 11, core dumps withlibbrotlidec.soin the backtrace, pinned workers, and outbound responses withContent-Encoding: br(patchstack.com).
Remediação
- Update Brotli to 1.0.10, 1.1.1 or 1.2.1, or apply the distribution
libbrotli1security update. Debian/Ubuntu backport fixes, so version strings still read 1.1.0. Check the package revision:1.1.0-2+b7is vulnerable,1.1.0-2+deb13u1is patched (patchstack.com). wordpress:lateststill installs a vulnerablelibbrotli1, so upgrade the package in your own Docker layer (patchstack.com).- Mitigation via mu-plugin: hook
http_api_curl, setCURLOPT_ENCODINGtoidentityandCURLOPT_HTTP_CONTENT_DECODINGto 0 (patchstack.com). - Unset
pingback.pingandpingback.extensions.getPingbacksvia thexmlrpc_methodsfilter, and/or denyxmlrpc.phpat Apache/nginx (patchstack.com). - Audit plugins that fetch user-supplied URLs and route outbound HTTP through an allowlisting proxy (patchstack.com).
- Before switching the Cloudflare rules to Block, review analytics for matches. Existing ruleset-level overrides set to Block apply immediately on deployment regardless of the Log default, so review them first or use rule-specific Log overrides. Blocking the Next.js rule may stop optimized images from loading (gbhackers.com).
Relatos divergentes
- Exploitation status: the Cloudflare announcement (gbhackers.com, 26 October) gave no severity score, affected versions or evidence of active exploitation. The later Patchstack analysis (patchstack.com, 30 October) supplies the CVSS 9.2 score, the affected and fixed versions, and the CISA KEV listing of 27 October, which indicates exploitation. Treat the later, more detailed report as authoritative.
Linha do tempo
-
CVE-2026-111497: Brotli out-of-bounds write reachable from stock WordPress via xmlrpc.php pingback
ler a análise desta fonte ocultar
Patchstack details how CVE-2026-111497, an out-of-bounds write in Google's Brotli decoder (CVSS 9.2), is reachable on default WordPress installs even though WordPress does not ship Brotli. An unauthenticated
pingback.pingPOST toxmlrpc.phpmakes WordPress fetch an attacker-controlled URL; the attacker's server replies with a malformed Brotli-compressed body that libcurl decompresses insidecurl_exec()before any PHP code sees it. The flaw affects Brotli 1.0.3–1.2.0, fixed on 21 October 2026 in 1.0.10, 1.1.1 and 1.2.1; CISA added it to the KEV catalog on 27 October with a federal deadline of 10 November. Public tooling reliably achieves denial of service (crashed or 100%-CPU-pinned workers from a sub-100-byte payload); working RCE chains exist only against specific non-PIE Node.js/Bun builds, not PHP/Apache/FPM. WAFs cannot detect the attack because the malicious payload arrives in the server's response, not the inbound request.Technical Details
- WordPress's bundled Requests cURL transport sets
CURLOPT_ENCODINGto an empty string on every handle, instructing libcurl to accept and unpack any compression;decompress => falsedoes not prevent this. pingback.pingis in the default XML-RPC method map and requires no authentication;pingback_ping()fetches the supplied source URL withwp_safe_remote_get(), whosereject_unsafe_urlsSSRF filter never inspectsContent-Encoding.- The common
xmlrpc_enabledfilter only gates authenticated methods and leaves pingback reachable; only edge blocking or unregistering the method closes the route. - Other reachable paths include oEmbed, feeds, and any plugin fetching visitor-supplied URLs (link previews, importers, webhook verifiers, avatar proxies).
- Host indicators: Apache
AH00051: child pid N exit signal Segmentation fault (11), PHP-FPM children exiting on signal 11, core dumps withlibbrotlidec.soin the backtrace, pinned workers, and outbound responses withContent-Encoding: br.
Remediation
- Update Brotli to 1.0.10, 1.1.1 or 1.2.1, or apply the distribution
libbrotli1security update; Debian/Ubuntu backport so version strings still read 1.1.0 — check package revision (1.1.0-2+b7vulnerable vs1.1.0-2+deb13u1patched). wordpress:lateststill installs a vulnerablelibbrotli1; upgrade the package in your own Docker layer.- Mitigation via mu-plugin: hook
http_api_curland setCURLOPT_ENCODINGtoidentityandCURLOPT_HTTP_CONTENT_DECODINGto 0. - Unset
pingback.pingandpingback.extensions.getPingbacksvia thexmlrpc_methodsfilter, and/or denyxmlrpc.phpat Apache/nginx. - Audit plugins that fetch user-supplied URLs and route outbound HTTP through an allowlisting proxy.
- WordPress's bundled Requests cURL transport sets
-
Cloudflare ships emergency WAF detection rules in Log mode for Brotli flaw CVE-2026-111497, including Next.js image endpoint
ler a análise desta fonte ocultar
Cloudflare announced an emergency release of its Web Application Firewall (WAF) on October 25, 2026, adding two detection rules for the Brotli vulnerability CVE-2026-111497. The rules sit in the Cloudflare Managed Ruleset and are enabled in Log mode by default, so they give visibility without blocking traffic. Both rules also match legitimate traffic, so a match does not confirm an exploitation attempt. The announcement gives no affected software versions, severity score, exploitation prerequisites, exploit payloads or evidence of active exploitation.
Technical Details
- Rule suffix …ca706f3c matches requests carrying the header
Content-Encoding: br, meaning a Brotli-encoded request body. It does not matchAccept-Encoding: br, and Cloudflare's response-compression settings for Brotli are unchanged. - Rule suffix …402fe5bb matches requests to the
/_next/imageendpoint used for Next.js image optimization. It covers legitimate image requests as well as malicious ones. - Existing ruleset-level action overrides set to Block would apply to the new rules immediately on deployment, regardless of the default Log action. This can cause false positives.
Remediation
- Review analytics for matches before switching either rule to Block.
- Review existing ruleset-level overrides before deployment. For a cautious rollout, use rule-specific Log overrides first.
- Be careful with the Next.js rule: blocking it may stop optimized images from loading.
- Take particular care for applications that accept Brotli request bodies or serve images through Next.js optimization.
- Rule suffix …ca706f3c matches requests carrying the header