{"id":3520,"date":"2026-10-28T12:17:51","date_gmt":"2026-10-28T19:17:51","guid":{"rendered":"https:\/\/cyber.mag212.com\/?p=3520"},"modified":"2026-10-30T13:19:24","modified_gmt":"2026-10-30T20:19:24","slug":"cve-2026-111497-nodejs-brotli-vulnerability","status":"publish","type":"post","link":"https:\/\/cyber.mag212.com\/fr\/cve-2026-111497-nodejs-brotli-vulnerability\/","title":{"rendered":"CVE-2026-111497\u00a0: La faille Brotli de Node.js dans CISA KEV, expliqu\u00e9e, avec versions corrig\u00e9es et v\u00e9rifications"},"content":{"rendered":"<p class=\"wp-block-paragraph\"><strong>MAG212 CYBER | Critical CVEs | October 28, 2026<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>CVE-2026-111497<\/strong> is a memory-corruption flaw in the Brotli decompressor that ships inside Node.js. Malformed compressed input can make the decoder write past an eight-byte internal buffer, which can crash a process, leak memory or, under the right conditions, lead to code execution. Node.js fixed it on 21 October 2026, and CISA added it to its Known Exploited Vulnerabilities (KEV) catalog on 27 October with a 10 November deadline for US federal agencies. Red Hat calls it <strong>&#8220;node2shell&#8221;<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Key facts<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Item<\/th><th>Detail<\/th><\/tr><\/thead><tbody><tr><td><strong>CVE<\/strong><\/td><td>CVE-2026-111497<\/td><\/tr><tr><td><strong>Component<\/strong><\/td><td>Brotli decoder bundled with Node.js (<code data-no-translation=\"\">node:zlib<\/code>); upstream Google Brotli library<\/td><\/tr><tr><td><strong>Weakness<\/strong><\/td><td>CWE-787 out-of-bounds write; CWE-252 unchecked return value<\/td><\/tr><tr><td><strong>Gravit\u00e9<\/strong><\/td><td>CVSS v4 9.2 Critical (Google, the issuing CNA); CVSS v3.1 8.1 Important (Red Hat, <code data-no-translation=\"\">AV:N\/AC:H\/PR:N\/UI:N\/S:U\/C:H\/I:H\/A:H<\/code>); &#8220;High&#8221; (Node.js)<\/td><\/tr><tr><td><strong>Affected<\/strong><\/td><td>Node.js 22.x, 24.x, 26.x; Brotli 1.0.3 through 1.2.0<\/td><\/tr><tr><td><strong>Fixed<\/strong><\/td><td>Node.js <strong>22.23.4<\/strong>, <strong>24.22.1<\/strong>, <strong>26.12.1<\/strong>; Brotli <strong>1.0.10<\/strong>, <strong>1.1.1<\/strong>, <strong>1.2.1<\/strong><\/td><\/tr><tr><td><strong>End-of-life<\/strong><\/td><td>Node.js 20.x and older receive no fix<\/td><\/tr><tr><td><strong>CISA KEV<\/strong><\/td><td>Added 27 October 2026; federal due date 10 November 2026 (as reported)<\/td><\/tr><tr><td><strong>Credit<\/strong><\/td><td>OpenAI Codex Security (Khai Tran, Sylvie Mayer)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">What went wrong<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The Node.js advisory explains the root cause precisely: an invalid block switch in a Brotli stream &#8220;was reported as a temporary need for more input instead of a permanent format error&#8221;. The streaming decoder treated a fatal error as &#8220;send me more data&#8221;, kept appending incoming bytes, and those bytes landed beyond an eight-byte internal buffer in native memory.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"\/wp-content\/uploads\/2026\/10\/nodejs-brotli-cve-2026-111497-attack-path.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1825\" height=\"278\" src=\"\/wp-content\/uploads\/2026\/10\/nodejs-brotli-cve-2026-111497-attack-path.png\" alt=\"Attack path for CVE-2026-111497 from untrusted Brotli input to a heap write\" class=\"wp-image-3512\" srcset=\"https:\/\/cyber.mag212.com\/wp-content\/uploads\/2026\/10\/nodejs-brotli-cve-2026-111497-attack-path.png 1825w, https:\/\/cyber.mag212.com\/wp-content\/uploads\/2026\/10\/nodejs-brotli-cve-2026-111497-attack-path-300x46.png 300w, https:\/\/cyber.mag212.com\/wp-content\/uploads\/2026\/10\/nodejs-brotli-cve-2026-111497-attack-path-1024x156.png 1024w, https:\/\/cyber.mag212.com\/wp-content\/uploads\/2026\/10\/nodejs-brotli-cve-2026-111497-attack-path-768x117.png 768w, https:\/\/cyber.mag212.com\/wp-content\/uploads\/2026\/10\/nodejs-brotli-cve-2026-111497-attack-path-1536x234.png 1536w\" sizes=\"auto, (max-width: 1825px) 100vw, 1825px\" \/><\/a><figcaption class=\"wp-element-caption\">From untrusted compressed bytes to a heap write. A conceptual sequence, not a captured attack.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">How serious is it in practice?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The score depends on who you ask, and that tells you something. Google rates it 9.2 because it is reachable over the network without authentication. Red Hat rates it 8.1 with <strong>high attack complexity<\/strong>, because reliable code execution needs specific heap conditions and platform hardening gets in the way.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The public proof-of-concept released on 22 October reached code execution only on a deliberately weakened build; on standard builds it caused a crash and a limited memory leak. Observed exploitation is small so far: Previdian logged one attempt on 27 October, and ELLIO tracked one source targeting Node 24.22.0, the last unpatched 24.x release. CISA&#8217;s KEV listing means you should treat it as urgent anyway. Crashes alone can take down services.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Is your application exposed?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The vulnerable direction is <strong>decoding attacker-supplied Brotli data<\/strong>. A server that only <em>sends<\/em> Brotli-compressed responses is not exposed by that. Look for these paths:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Entry point<\/th><th>Reported by<\/th><\/tr><\/thead><tbody><tr><td><code data-no-translation=\"\">zlib.brotliDecompress()<\/code> \/ <code data-no-translation=\"\">brotliDecompressSync()<\/code><\/td><td>Red Hat<\/td><\/tr><tr><td><code data-no-translation=\"\">zlib.createBrotliDecompress()<\/code> streams<\/td><td>Red Hat<\/td><\/tr><tr><td><code data-no-translation=\"\">fetch()<\/code> \/ undici decoding <code data-no-translation=\"\">Content-Encoding: br<\/code> responses<\/td><td>Red Hat, The Hacker News<\/td><\/tr><tr><td>Express 5 default body parsing of <code data-no-translation=\"\">Content-Encoding: br<\/code> requests<\/td><td>Sysdig, via The Hacker News<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The bug is in Google&#8217;s Brotli library itself, so it also reaches beyond Node. Rapid7 and Red Hat list Bun, the Python <code data-no-translation=\"\">brotli<\/code> and <code data-no-translation=\"\">brotlicffi<\/code> packages, .NET, Envoy and Istio, brotli4j, Firefox, Thunderbird and RHEL 7 through 10 among affected software.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How to check your Node.js runtimes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Run these read-only commands <strong>inside each container or service<\/strong>, not just on your workstation. The Node binary in your shell may differ from the one a running worker uses.<\/p>\n\n\n\n<pre class=\"wp-block-code has-text-color has-background\" style=\"border-radius:6px;color:#cfe3f5;background-color:#0d1626;font-size:13px\" data-no-translation=\"\"><code data-no-translation=\"\">node -p \"process.version + ' brotli ' + process.versions.brotli\"\nnode -p \"process.config.variables.node_shared_brotli\"\n# if true, Node links the system Brotli library: patch it too\nldconfig -p | grep -i brotli\nrpm -q libbrotli 2&gt;\/dev\/null || dpkg -l 'libbrotli*'<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">On Ubuntu 22.04 and later, RHEL 10, and Node 22 on RHEL 8 and 9, Node uses the operating system&#8217;s Brotli library. In those environments, <strong>updating Node alone is not enough<\/strong>: update the OS package as well.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How to fix CVE-2026-111497<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Upgrade Node.js<\/strong> to 22.23.4, 24.22.1, 26.12.1 or later. If you are on Node 20 or older, upgrade to a supported line; no fix exists for end-of-life versions.<\/li>\n\n\n\n<li><strong>Rebuild container images<\/strong> from patched base images and redeploy every replica. Track the image digest, not just the tag.<\/li>\n\n\n\n<li><strong>Restart long-lived processes<\/strong>, including background workers, scheduled jobs, CI runners and build agents.<\/li>\n\n\n\n<li><strong>Patch the OS Brotli package<\/strong> where Node uses the shared library, and update other affected runtimes (Bun, Python brotli, Envoy).<\/li>\n\n\n\n<li><strong>Don&#8217;t forget bundled runtimes<\/strong> in Electron apps and Node single-executable applications.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Close the ticket only when the <strong>running<\/strong> process reports a fixed version, every replica has restarted, and normal application tests pass.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Temporary mitigation if you can&#8217;t patch today<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Node.js publishes no workaround; upgrading is the only complete fix. Red Hat suggests rejecting or stripping <code data-no-translation=\"\">Content-Encoding: br<\/code> at the proxy for endpoints that don&#8217;t need compressed request bodies:<\/p>\n\n\n\n<pre class=\"wp-block-code has-text-color has-background\" style=\"border-radius:6px;color:#cfe3f5;background-color:#0d1626;font-size:13px\" data-no-translation=\"\"><code data-no-translation=\"\"># nginx: reject Brotli-encoded request bodies\nif ($http_content_encoding ~* \"br\") {\n    return 415;\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Test this against legitimate clients first. It protects inbound requests only; it does nothing for outbound <code data-no-translation=\"\">fetch()<\/code> calls that decode untrusted responses. Vercel deployed equivalent inbound firewall rules for its customers on 21 October.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How to spot attacks<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">There are no vendor-published detection rules yet. A practical signal is <strong>crash loops on unpatched runtimes<\/strong>: Node processes exiting with <code data-no-translation=\"\">SIGSEGV<\/code>, <code data-no-translation=\"\">SIGABRT<\/code> or allocator errors such as <code data-no-translation=\"\">free(): invalid<\/code>, shortly after requests carrying <code data-no-translation=\"\">Content-Encoding: br<\/code>. Pair container restart data with proxy logs that capture the request header.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The same release fixed nine more CVEs<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The 21 October security release fixed 10 CVEs in total. Besides the Brotli flaw, it addressed high-severity issues in DNS NUL-byte handling (CVE-2026-105482) and TLS IP address matching (CVE-2026-105483, CVE-2026-106069), plus medium and low-severity fixes for HTTP keep-alive, certificate handling, random number entropy in snapshots and the Permission Model. It also distrusted compromised eMudhra intermediate certificates and updated undici, c-ares, OpenSSL and SQLite. That&#8217;s one more reason to take the update rather than a narrow workaround.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Frequently asked questions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Which Node.js versions fix CVE-2026-111497?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Node.js 22.23.4, 24.22.1 and 26.12.1, or later versions in those lines.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Is CVE-2026-111497 being exploited?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">CISA added it to KEV on 27 October 2026, citing active exploitation. Publicly observed activity is limited to a handful of honeypot attempts, with no confirmed compromises reported as of 28 October.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Am I affected if my server only compresses responses with Brotli?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Compressing outgoing responses doesn&#8217;t trigger the bug. Exposure comes from decompressing untrusted Brotli data, such as request bodies or responses from untrusted servers.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Does upgrading Node.js fix it everywhere?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Not always. Where Node links the system Brotli library, and in other runtimes like Bun or Python, you must update those components too.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sources<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/nodejs.org\/en\/blog\/vulnerability\/october-2026-security-releases\" target=\"_blank\" rel=\"noreferrer noopener\">Node.js: October 2026 security releases<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/access.redhat.com\/security\/cve\/CVE-2026-111497\" target=\"_blank\" rel=\"noreferrer noopener\">Red Hat: CVE-2026-111497<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.rapid7.com\/blog\/post\/etr-cve-2026-111497-critical-out-of-bounds-write-in-the-node-js-brotli-decoder\/\" target=\"_blank\" rel=\"noreferrer noopener\">Rapid7: Critical out-of-bounds write in the Node.js Brotli decoder<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/thehackernews.com\/2026\/10\/adobe-commerce-polyshell-attacks-breach.html\" target=\"_blank\" rel=\"noreferrer noopener\">The Hacker News: PolyShell attacks and Brotli exploit traffic (28 Oct 2026)<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/google\/brotli\/releases\" target=\"_blank\" rel=\"noreferrer noopener\">Google Brotli releases<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.cisa.gov\/known-exploited-vulnerabilities-catalog\" target=\"_blank\" rel=\"noreferrer noopener\">CISA Known Exploited Vulnerabilities catalog<\/a><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">This article expands the Brotli feature from the <a href=\"https:\/\/cyber.mag212.com\/fr\/when-trust-becomes-access-mag212-cyber-october-28-2026\/\">MAG212 CYBER October 28, 2026 Intelligence Edition<\/a>. Score other vulnerabilities with our free <a href=\"https:\/\/cyber.mag212.com\/fr\/cvss-calculator\/\">Calculatrice CVSS 3.1<\/a>, or read <a href=\"https:\/\/cyber.mag212.com\/fr\/cve-cvss\/\">Explication des syst\u00e8mes CVE et CVSS<\/a>.<\/p>\n\n\n\n<div class=\"wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/cyber.mag212.com\/wp-content\/uploads\/2026\/10\/MAG212-CYBER-2026-10-28-When-Trust-Becomes-Access.pdf\">Read the full magazine (PDF) \u2192<\/a><\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading mag212-related\">Related coverage on MAG212 CYBER<\/h2>\n\n\n\n<ul class=\"wp-block-list mag212-related-list\">\n<li><a href=\"https:\/\/cyber.mag212.com\/fr\/when-trust-becomes-access-mag212-cyber-october-28-2026\/\">When Trust Becomes Access: Brotli, Tailscale, Magento, Oracle EBS and SkyW4lker<\/a><\/li>\n\n\n<li><a href=\"https:\/\/cyber.mag212.com\/fr\/shell-week-php2shell-node2shell-and-the-race-between-the-leak-and-the-patch\/\">Shell Week: PHP2Shell, Node2Shell and the Race Between the Leak and the Patch<\/a><\/li>\n\n\n<li><a href=\"https:\/\/cyber.mag212.com\/fr\/tailscale-ssh-vulnerabilities-ts-2026-014-tailworm\/\">Vuln\u00e9rabilit\u00e9s SSH de Tailscale TS-2026-014 \u00e0 017 (\u201c\u00a0Tailworm\u00a0\u201d)\u00a0: Corrections apport\u00e9es dans la version\u00a01.104.4 et mesures de s\u00e9curit\u00e9<\/a><\/li>\n\n\n<li><a href=\"https:\/\/cyber.mag212.com\/fr\/cve-2026-101767-oracle-ebs-vulnerability\/\">CVE-2026-101767\u00a0: Une faille dans Oracle E-Business Suite permet \u00e0 une seule requ\u00eate HTTP d\u2019atteindre la base de donn\u00e9es et l\u2019h\u00f4te.<\/a><\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>CVE-2026-111497 is an out-of-bounds write in the Brotli decoder bundled with Node.js 22, 24 and 26. CISA added it to KEV on October 27, 2026. Here are the fixed versions, how attacks reach the decoder, how to check your runtimes and how to reduce exposure.<\/p>","protected":false},"author":1,"featured_media":3511,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[19,14],"tags":[68,62,82,93,107,106],"class_list":["post-3520","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-critical-cves","category-vulnerabilities","tag-brotli","tag-cisa-kev","tag-cve-2026-111497","tag-node-js","tag-patch-management","tag-vulnerabilities"],"_links":{"self":[{"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/posts\/3520","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/comments?post=3520"}],"version-history":[{"count":2,"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/posts\/3520\/revisions"}],"predecessor-version":[{"id":3659,"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/posts\/3520\/revisions\/3659"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/media\/3511"}],"wp:attachment":[{"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/media?parent=3520"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/categories?post=3520"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cyber.mag212.com\/fr\/wp-json\/wp\/v2\/tags?post=3520"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}