{"id":"CVE-2026-111497","kind":"vulnerability","aliases":["CVE-2026-111497"],"related":[],"title":"Brotli: crafted compressed stream overflows buffer, enables remote code execution","description":"Brotli vulnerability (CVE-2026-111497) — Patch the Planet\n\nCVE-2026-111497 · Updated October 23, 2026\n\n# Brotli decoder vulnerability\n\nCrafted Brotli-compressed data can corrupt memory and allow remote code execution in affected software, including Node.js, Bun, and deployments of Envoy Proxy or Istio configured for Brotli decompression.\n\nFixes are available. Update affected deployments now. If you cannot patch immediately, disable Brotli decompression of untrusted data until the update is deployed.\n\n## Start patching\n\nUpdate to a listed fixed version or a later patched release in the same branch, then restart or redeploy.\n\nFixed releases · Reviewed October 23, 2026\n\n| Project | Patch status | Fixed versions |\n| --- | --- | --- |\n| Node.js | Patch available | 22.23.4 · 24.22.1 · 26.12.1 Use a supported release line. |\n| Bun | Patch available | 1.4.4 Includes Brotli 1.2.1. |\n| Envoy Proxy | Patch available | 1.40.0 · 1.39.3 · 1.38.6 · 1.37.8 1.36.12 also includes the fix, but 1.36 is unsupported. Use a supported branch. |\n| Istio | Patch available | 1.29.9 · 1.30.6 · 1.31.2 1.29 is end of life; move to a supported line. |\n| Google Brotli (upstream) | Patch available | 1.0.10 · 1.1.1 · 1.2.1 Choose the fixed release for your library branch. |\n\n## Who is affected\n\nAny application that passes attacker-controlled data to an affected Google Brotli decoder may be exposed. This includes compressed HTTP request bodies, responses fetched from untrusted servers, and compressed files. The bug can cause crashes, disclose memory, or allow code execution.\n\nCheck web services, background workers, tools that bundle Node.js or Bun, and deployments of Envoy Proxy or Istio configured to decompress Brotli.\n\nOther software to check\n\n- Embedded runtimes: apps such as Electron-based desktop tools can include multiple Brotli copies. Check both Chromium and Node.js; a fixed browser component does not establish that the embedded Node.js runtime is fixed.\n- Native clients and bindings: check the decoder loaded by curl/libcurl, Python and Java bindings, and other native libraries. Bundled wheels and static binaries may need their own update or rebuild.\n- File processing: include font decoders and data-file readers that use Brotli. Exposure is not limited to HTTP traffic.\n\nUsing Brotli only to compress outgoing data does not by itself establish exposure to this decoder flaw.\n\n## Disable Brotli decoding until you can patch\n\nYou can keep other compression enabled. Disable Brotli decoding of untrusted data while allowing gzip, deflate, or other supported codecs. Apply this to every decoding path; if your stack cannot block Brotli separately, disable automatic decompression or pause that path until patched.\n\n- Incoming requests: reject requests with `Content-Encoding: br` before any proxy, middleware, or body parser decompresses them. Cover direct-to-origin and alternate routes.\n- Fetched responses: disable automatic Brotli decompression in HTTP clients. Reject Brotli responses before decoding; if your client cannot do this, pause the affected fetch or use a patched client. Removing `br` from `Accept-Encoding` alone does not stop a server from sending it.\n- In Envoy Proxy and Istio, disable Brotli decompressor filters for both requests and responses. Disabling a filter can pass compressed data onward, so protect downstream decoders too.\n- Files and other inputs: pause untrusted Brotli processing until the decoder is patched.\n\nTurning off Brotli response compression on a CDN or web server does not disable request or client-side decompression. Request-size limits and WAF rules alone do not cover every decoding path.\n\nExpress: reject Brotli, keep gzip and deflate\n\nAllow only uncompressed, gzip, or deflate request bodies before any parser runs. Keep automatic decompression enabled for those permitted encodings.\n\nExpress request encoding guard\n\nCopy\n\n```\n// Register before every body parser or decompression middleware.\napp.use((req, res, next) => {\n  const encoding = (req.get('Content-Encoding') || 'identity')\n    .trim().toLowerCase();\n\n  if (!['identity', 'gzip', 'deflate'].includes(encoding)) {\n    return res.status(415).send(\n      'Use gzip, deflate, or an uncompressed request body.'\n    );\n  }\n  next();\n});\n\n// Keep your existing parser options and register routes afterward.\napp.use(express.json());\napp.use(express.urlencoded({ extended: true }));\n```\n\nPlace this guard before all JSON, form, raw, text, and route-specific parsers. It rejects Brotli, unknown encodings, and stacked encodings such as `gzip, br` with HTTP 415. A proxy that decodes requests first needs its own mitigation.\n\nIf you cannot enforce the guard before decoding, set `inflate: false` on every existing body parser as a fallback. That rejects all compressed request bodies, including gzip and deflate.\n\nExpress body-parser options ↗\n\nNext.js: disable built-in image optimization until Node.js is patched\n\nIf you cannot update Node.js immediately, set `images.unoptimized` globally. This stops the built-in image optimizer from fetching and decoding remote images. Merge this setting into your existing configuration, then rebuild and redeploy:\n\nNext.js image optimization workaround\n\nCopy\n\n```\n// next.config.js: retain your other settings.\nmodule.exports = {\n  images: {\n    // Retain your existing images settings here.\n    unoptimized: true,\n  },\n};\n```\n\nImages are served directly from their source URLs. Verify that requests to `/_next/image` no longer run the optimizer. This does not protect other server-side fetches, custom image loaders, or other Brotli decoders.\n\nNext.js unoptimized image option ↗\n\nDisable only the Brotli decompressor in Envoy Proxy and Istio\n\nRemove the HTTP decompressor filter whose `decompressor_library` uses the Brotli type. Keep separate gzip and zstd decompressor filters. Alternatively, disable both directions in that existing Brotli filter:\n\nEnvoy Proxy Brotli decompressor settings\n\nCopy\n\n```\n# Inside the existing Brotli decompressor's typed_config.\n# Leave separate gzip / zstd decompressor filters enabled.\nrequest_direction_config:\n  common_config:\n    enabled:\n      default_value: false\nresponse_direction_config:\n  common_config:\n    enabled:\n      default_value: false\n```\n\nReplace the existing direction settings and remove any `runtime_key` from these two `enabled` fields; a runtime override can otherwise re-enable Brotli. An omitted direction defaults to enabled.\n\nFor Istio: edit the original `EnvoyFilter` patch that inserts the Brotli filter. Remove that insertion or apply the settings above to it. Do not remove every filter named `envoy.filters.http.decompressor`; gzip and zstd can share that name.\n\nA disabled or removed filter passes encoded bytes onward. Reject Brotli before any remaining vulnerable application or client decoder. Verify the effective configuration on every affected gateway and sidecar, and test that permitted compression still works.\n\nEnvoy Proxy decompressor settings ↗ Envoy Proxy runtime flags ↗ Istio EnvoyFilter reference ↗\n\nPython HTTP client: accept gzip and deflate, reject Brotli\n\nWith urllib3, leave the body unread and undecoded until you have checked its encoding. This example allows uncompressed, gzip, and deflate responses, and rejects Brotli even if the server ignores `Accept-Encoding`.\n\nPython urllib3 response encoding guard\n\nCopy\n\n```\nimport urllib3\n\nhttp = urllib3.PoolManager()\nresponse = http.request(\n    \"GET\", url,\n    headers={\"Accept-Encoding\": \"gzip, deflate\"},\n    preload_content=False,\n    decode_content=False,\n    redirect=False,\n    retries=False,\n    timeout=10.0,\n)\ntry:\n    encoding = response.headers.get(\"Content-Encoding\", \"identity\")\n    if encoding.strip().lower() not in {\"identity\", \"gzip\", \"deflate\"}:\n        raise ValueError(\"Unsupported response content encoding\")\n    data = response.read(decode_content=True)\nfinally:\n    response.close()\n    response.release_conn()\n```\n\nKeep redirects and retries disabled for this example. If you add them, apply the same check to every response before reading its body. Retain your application’s response-size limits when adapting the example.\n\nFor other HTTP clients, use a documented raw-response mode or a Brotli-specific decoder switch. Checking headers after a normal `fetch()` or automatic body read can be too late.\n\nurllib3 response decoding options ↗\n\n## Restart and verify every deployment\n\n1. Update runtime and image pins. Rebuild containers and executables that embed the affected runtime.\n2. Restart or redeploy every service, worker, scheduled job, and replica using the old build.\n3. Check the running binary or image against the vendor’s fixed release. Confirm temporary blocks reject Brotli before decoding, and test that permitted gzip or other compression still works.\n\n## References and credit\n\nCVE-2026-111497 ↗ Node.js security advisory ↗ Bun 1.4.4 release notes ↗ Bun 1.4.4 Brotli dependency ↗ Brotli 1.2.1 release ↗ Envoy Proxy releases ↗ Envoy Proxy 1.36.12 (unsupported branch) ↗ Envoy Proxy 1.40.0 Brotli dependency ↗ Istio security advisory ↗\n\nThe Node.js advisory credits Khai Tran and Sylvie Mayer of OpenAI Codex Security for reporting this vulnerability, and mcollina and aduh95 for the fix.\n\n### Acknowledgments\n\nWe thank the Google Brotli, Node.js, Envoy Proxy, and Istio maintainers for their work on fixes and security releases, and the OpenJS Foundation for helping coordinate the response. Special thanks to Matteo Collina, Antoine du Hamel, Rafael Gonzaga, Ulises Gascón, Robin Ginn, Yan Avlasov, and Petr McAllister for working with us to protect downstream users.","summary":"Google's Brotli decoder, used by Node.js, Bun, Python bindings and proxies, overflows a memory buffer when it reads a crafted compressed stream. An attacker who can send compressed data to an affected service can corrupt memory, crash it, read memory, or run code.","severity":"critical","cvss":9.2,"epss":0.0048,"exploited":false,"exploited_at":null,"products":[{"name":"brotli","fixed":["1.0.10","1.1.1","1.2.1"],"affected":">= 1.0.3, < 1.0.10; >= 1.1.0, < 1.1.1; >= 1.2.0, < 1.2.1","ecosystem":"vendor"},{"name":"node","fixed":["22.23.4","24.22.1","26.12.1"],"affected":"22.x < 22.23.4; 24.x < 24.22.1; 26.x < 26.12.1; EOL lines (25.x, 23.x, <=20.x) unfixed","ecosystem":"npm"},{"name":"Brotli","fixed":["1.2.1"],"affected":"<= 1.2.0","ecosystem":"pypi"},{"name":"brotlicffi","fixed":["1.2.1.0"],"affected":"<= 1.2.0.x","ecosystem":"pypi"},{"name":"bun","fixed":["1.4.4"],"affected":"< 1.4.4","ecosystem":"npm"}],"ecosystems":["npm","pypi","vendor"],"tags":["brotli","bun","cloudflare","docker","envoy","express","http-compression","istio","lab-disclosure","node.js","openai","package","poc-public","pypi","python","self-hosted"],"not_affected_if":["brotli-decoding-disabled","compress-outgoing-only","patched-versions"],"how_to_check":"- Run `node --version` and `bun --version`, then compare against the fixed versions below.\n- Run `pip show Brotli` and `pip show brotlicffi`, and check bundled wheels and static binaries.\n- Look for `Content-Encoding: br` handling in web servers, body parsers, HTTP clients and Envoy or Istio Brotli decompressor filters.","fix":"- Node.js: move to `22.23.4`, `24.22.1` or `26.12.1`; lines 25.x, 23.x and 20.x or older have no fix, so move to a supported line.\n- Bun: move to `1.4.4` or later.\n- Brotli library: `1.0.10`, `1.1.1` or `1.2.1` for its branch; Python `Brotli` `1.2.1` and `brotlicffi` `1.2.1.0`.\n- Envoy Proxy `1.40.0`, `1.39.3`, `1.38.6` or `1.37.8`; Istio `1.29.9`, `1.30.6` or `1.31.2`. Until patched, reject `Content-Encoding: br` before any decoder runs.","status":"open","published_at":"2026-10-22T14:17:37+00:00","first_seen_at":"2026-10-23T21:57:31+00:00","triaged_at":"2026-10-24T17:49:40+00:00","updated_at":"2026-10-25T01:23:50+00:00","category":"package","confidence":0.8,"triage":{"at":"2026-10-24T17:49:39Z","model":"claude-haiku-5-5","output":{"fix":"- Node.js: move to `22.23.4`, `24.22.1` or `26.12.1`; lines 25.x, 23.x and 20.x or older have no fix, so move to a supported line.\n- Bun: move to `1.4.4` or later.\n- Brotli library: `1.0.10`, `1.1.1` or `1.2.1` for its branch; Python `Brotli` `1.2.1` and `brotlicffi` `1.2.1.0`.\n- Envoy Proxy `1.40.0`, `1.39.3`, `1.38.6` or `1.37.8`; Istio `1.29.9`, `1.30.6` or `1.31.2`. Until patched, reject `Content-Encoding: br` before any decoder runs.","reach":"internet","title":"Brotli: crafted compressed stream overflows buffer, enables remote code execution","impact":"high","summary":"Google's Brotli decoder, used by Node.js, Bun, Python bindings and proxies, overflows a memory buffer when it reads a crafted compressed stream. An attacker who can send compressed data to an affected service can corrupt memory, crash it, read memory, or run code.","category":"package","nicknames":["Node2Shell","Broccoli2Shell"],"who_cares":["node.js","bun","python","express","envoy","istio"],"confidence":0.8,"needs_auth":"no","worst_case":"attacker runs code on server via crafted compressed input","analyst_note":"","how_to_check":"- Run `node --version` and `bun --version`, then compare against the fixed versions below.\n- Run `pip show Brotli` and `pip show brotlicffi`, and check bundled wheels and static binaries.\n- Look for `Content-Encoding: br` handling in web servers, body parsers, HTTP clients and Envoy or Istio Brotli decompressor filters.","needs_analyst":false,"not_affected_if":["compress-outgoing-only","brotli-decoding-disabled","patched-versions"],"who_is_affected":"Any application that passes attacker-controlled data to an affected Brotli decoder is exposed, including compressed HTTP request bodies, responses fetched from untrusted servers, and compressed files. Check web services, workers, tools that bundle Node.js or Bun, and Envoy or Istio deployments that decompress Brotli. Systems that only compress outgoing data, or that never decode untrusted Brotli, do not establish exposure by that alone.","user_interaction":"no","needs_special_setup":"no","severity_if_unknown":"critical"},"cost_usd":0.001715,"input_tokens":7657,"output_tokens":1898,"severity_before":"critical"},"analyst_status":"done","analyst_note":"Check NVD and upstream Brotli advisory for which apps bundle the library and a reliable way to detect the bundled version.","search":"'-111497':13A,16A,97C,103C '-2026':12A,15A,96C,102C '1.0.10':256C '1.1.1':257C '1.2.1':213C,258C '1.29':241C '1.29.9':238C '1.30.6':239C '1.31.2':240C '1.36':228C '1.36.12':222C '1.37.8':221C '1.38.6':220C '1.39.3':219C '1.4.4':210C '1.40.0':218C '2026':107C,190C '22.23.4':199C '23':106C,189C '24.22.1':200C '26.12.1':201C 'accept':547C 'accept-encod':546C 'affect':81B,125C,145C,269C,280C,536C 'allow':120C,309C,459C,639C 'alon':549C,625C 'also':223C 'altern':512C 'app':340C 'app.use':672C 'appli':466C 'applic':271C 'attack':73B,275C 'attacker-control':274C 'automat':480C,517C,652C 'avail':143C,198C,209C,217C,237C,255C 'background':315C 'base':345C 'binari':394C 'bind':58B,375C,385C 'block':476C 'bodi':292C,502C,646C,667C 'br':496C,544C 'branch':180C,234C,266C 'broccoli2shell':17A 'brot':1A,25B,51B,93C,108C,113C,139C,154C,212C,252C,282C,333C,351C,414C,423C,440C,453C,477C,518C,524C,564C,591C,600C,634C 'brotli':20A,22A 'brotli-compress':112C 'brotlicffi':23A 'browser':360C 'buffer':6A,64B 'bug':302C 'bun':24A,26B,56B,129C,207C,322C 'bundl':319C,390C 'cannot':150C,475C,531C 'caus':304C 'cdn':605C 'check':312C,337C,353C,376C 'choos':259C 'chromium':355C 'client':373C,522C,530C,542C,615C 'client-sid':614C 'cloudflar':27B 'code':9A,92B,122C,310C 'codec':465C 'compon':361C 'compress':3A,33B,70B,77B,114C,289C,299C,426C,450C,577C,602C 'configur':137C,330C 'const':676C 'content':494C 'content-encod':493C 'control':276C 'copi':352C,663C 'corrupt':84B,117C 'cover':506C,628C 'craft':2A,69B,111C 'crash':86B,305C 'curl/libcurl':381C 'cve':11A,14A,95C,101C 'data':78B,115C,158C,277C,409C,428C,457C,578C 'data-fil':408C 'decod':52B,109C,283C,378C,406C,437C,441C,454C,470C,527C,583C,595C,630C 'decompress':140C,155C,332C,481C,504C,519C,617C,653C,670C 'decompressor':565C 'deflat':461C,638C,644C 'deploy':131C,146C,163C,324C 'desktop':346C 'direct':508C 'direct-to-origin':507C 'disabl':153C,439C,452C,479C,516C,563C,572C,611C 'disclos':306C 'disclosur':37B 'docker':28B 'downstream':582C 'electron':344C 'electron-bas':343C 'embed':338C,367C 'enabl':7A,451C,654C 'encod':495C,548C,658C,661C,677C 'end':243C 'envoy':29B,133C,214C,326C,559C 'establish':364C,433C 'everi':469C,629C,666C 'execut':10A,123C,311C 'expos':286C 'exposur':415C,434C 'express':30B,632C,659C 'fetch':294C,514C,537C 'file':300C,402C,410C,585C 'filter':566C,574C 'fix':141C,170C,185C,194C,226C,261C,359C,371C 'flaw':438C 'font':405C 'googl':49B,251C,281C 'guard':662C 'gzip':460C,636C,642C 'host':48B 'http':32B,290C,420C,521C 'http-compress':31B 'http2shell':18A 'immedi':152C 'includ':127C,211C,224C,288C,349C,404C 'incom':488C 'input':588C 'istio':34B,136C,235C,329C,562C 'java':384C 'keep':448C,635C,651C 'lab':36B 'lab-disclosur':35B 'later':174C 'librari':265C,389C 'life':245C 'limit':418C,621C 'line':206C,250C 'list':169C 'load':379C 'may':284C,395C 'memori':63B,85B,89B,118C,307C 'middlewar':500C,671C 'move':246C 'multipl':350C 'nativ':372C,388C 'need':396C 'next':675C 'node':21A 'node.js':38B,55B,128C,196C,320C,357C,368C 'node2shell':19A 'octob':105C,188C 'onward':579C 'openai':39B 'origin':510C 'outgo':427C 'overflow':5A,61B 'packag':40B 'parser':503C,649C,668C 'pass':273C,576C 'patch':98C,151C,165C,175C,192C,197C,208C,216C,236C,254C,445C,487C,541C,597C 'path':471C,485C,631C 'paus':483C,534C,589C 'permit':657C 'planet':100C 'poc':42B 'poc-publ':41B 'process':403C,592C 'project':191C 'protect':581C 'proxi':60B,134C,215C,327C,499C,560C 'public':43B 'pypi':44B 'python':45B,57B,382C 'read':67B,88B 'reader':411C 'rebuild':401C 'redeploy':184C 'regist':664C 'reject':490C,523C,633C 'releas':176C,186C,205C,262C 'remot':8A,121C 'remov':543C 'req':673C 'request':291C,489C,491C,569C,612C,619C,645C,660C 'request-s':618C 'res':674C 'respons':293C,515C,525C,571C,601C 'restart':182C 'review':187C 'rout':513C 'rule':624C 'run':91B,650C 'runtim':339C,369C 'self':47B 'self-host':46B 'send':76B,556C 'separ':478C 'server':297C,554C,608C 'servic':82B,314C 'side':616C 'size':620C 'softwar':126C,335C 'stack':474C 'start':164C 'static':393C 'status':193C 'stop':552C 'stream':4A,71B 'support':204C,233C,249C,464C 'tool':317C,347C 'traffic':421C 'turn':598C 'uncompress':641C 'unsupport':230C 'untrust':157C,296C,456C,590C 'updat':104C,144C,161C,166C,399C 'upstream':253C 'use':53B,202C,231C,413C,422C,539C 'version':171C,195C 'vulner':94C,110C 'waf':623C 'web':313C,607C 'wheel':391C 'worker':316C","nicknames":["Broccoli2Shell","HTTP2Shell","Node2Shell"],"mitigations":[{"kind":"workaround","scope":"Incoming HTTP requests at proxies, middleware and body parsers","since":null,"covers":"Requests with Content-Encoding: br rejected before any proxy, middleware, or body parser decompresses them, including direct-to-origin and alternate routes","limits":"Does not cover a proxy that decodes requests first unless it is also guarded, or non-HTTP decoding paths","source":"https://patchtheplanet.org/brotli","vendor":"Team","seen_at":"2026-10-24T17:49:53Z","confidence":0.9,"source_title":"OpenAI: Brotli vulnerability (CVE-2026-111497)","customer_action":"Reject requests with Content-Encoding: br before any decoding while keeping gzip, deflate, or other supported codecs enabled"},{"kind":"workaround","scope":"HTTP clients fetching untrusted responses","since":null,"covers":"Brotli responses rejected before decoding when the client supports checking the encoding first","limits":"Removing br from Accept-Encoding alone does not stop a server from sending Brotli; checks after an automatic body read can be too late","source":"https://patchtheplanet.org/brotli","vendor":"Team","seen_at":"2026-10-24T17:49:53Z","confidence":0.9,"source_title":"OpenAI: Brotli vulnerability (CVE-2026-111497)","customer_action":"Disable automatic Brotli decompression in HTTP clients, or pause the affected fetch, or use a patched client"},{"kind":"workaround","scope":"Express 4/5 request bodies","since":null,"covers":"Request bodies with Content-Encoding other than identity, gzip, or deflate (including stacked encodings such as gzip, br) return HTTP 415 before body parsers run","limits":"A proxy that decodes requests first needs its own mitigation; falls back to inflate: false, which also rejects gzip and deflate","source":"https://patchtheplanet.org/brotli","vendor":"Team","seen_at":"2026-10-24T17:49:53Z","confidence":0.9,"source_title":"OpenAI: Brotli vulnerability (CVE-2026-111497)","customer_action":"Register the encoding guard middleware before every JSON, form, raw, text, and route-specific body parser"},{"kind":"workaround","scope":"Next.js on unpatched Node.js","since":null,"covers":"Built-in image optimizer no longer fetches and decodes remote images when images.unoptimized is set globally","limits":"Does not protect other server-side fetches, custom image loaders, or other Brotli decoders","source":"https://patchtheplanet.org/brotli","vendor":"Team","seen_at":"2026-10-24T17:49:53Z","confidence":0.85,"source_title":"OpenAI: Brotli vulnerability (CVE-2026-111497)","customer_action":"Set images.unoptimized: true in next.config.js, rebuild and redeploy, and verify /_next/image no longer runs the optimizer"},{"kind":"workaround","scope":"Envoy Proxy and Istio","since":null,"covers":"Brotli decompressor filter disabled for request and response directions, so Brotli is not decoded at the gateway or sidecar","limits":"A disabled filter passes encoded bytes onward, so downstream decoders stay exposed unless they reject Brotli; runtime_key overrides can re-enable it","source":"https://patchtheplanet.org/brotli","vendor":"Team","seen_at":"2026-10-24T17:49:53Z","confidence":0.85,"source_title":"OpenAI: Brotli vulnerability (CVE-2026-111497)","customer_action":"Remove the Brotli decompressor filter or set both direction enabled defaults to false with no runtime_key, keep gzip and zstd filters, and verify the effective configuration on every gateway and sidecar"},{"kind":"workaround","scope":"Python urllib3 HTTP client","since":null,"covers":"Responses with Content-Encoding other than identity, gzip, or deflate are rejected before the body is read or decoded","limits":"Applies only to the example request path; other HTTP clients need a raw-response mode or a Brotli-specific switch","source":"https://patchtheplanet.org/brotli","vendor":"Team","seen_at":"2026-10-24T17:49:53Z","confidence":0.85,"source_title":"OpenAI: Brotli vulnerability (CVE-2026-111497)","customer_action":"Use preload_content=False and decode_content=False, check the Content-Encoding header, and only then read the body with decode_content=True"},{"kind":"waf-rule","scope":null,"since":"2026-10-25","covers":"Requests proxied through Cloudflare Managed Ruleset covered by rule ...ca706f3c, which matches HTTP requests declaring Brotli request-body encoding (Content-Encoding: br), and rule ...402fe5bb, which matches requests to the Next.js image optimization endpoint /_next/image.","limits":"Both rules default to the Log action, so matching requests are not blocked unless the customer changes the action; the Brotli rule does not match Accept-Encoding: br and no coverage is stated for non-proxied paths; blocking the Next.js rule may disrupt legitimate image optimization traffic.","source":"https://developers.cloudflare.com/changelog/post/2026-10-25-emergency-waf-release/","vendor":"Cloudflare","seen_at":"2026-10-25T01:12:22Z","sources":["https://developers.cloudflare.com/changelog/post/2026-10-25-emergency-waf-release/"],"confidence":0.9,"source_title":"WAF Release - 2026-10-25 - Emergency - Cloudflare Managed Ruleset · Changelog","customer_action":"Review existing ruleset-level Block overrides before deployment; switch the Brotli rule to Block if blocking is wanted, and change the Next.js rule to Block only if blocking is acceptable given image delivery impact."}],"who_affected":"Any application that passes attacker-controlled data to an affected Brotli decoder is exposed, including compressed HTTP request bodies, responses fetched from untrusted servers, and compressed files. Check web services, workers, tools that bundle Node.js or Bun, and Envoy or Istio deployments that decompress Brotli. Systems that only compress outgoing data, or that never decode untrusted Brotli, do not establish exposure by that alone.","tier":"A","verified":{},"analyst_revisit_at":null,"first_public_at":"2026-10-21T23:58:43+00:00","kev":null,"cvss_vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","cvss_by":"cve-coordination@google.com","poc_count":7,"sources":[{"source":"nvd","external_id":"CVE-2026-111497","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-111497","severity":null,"published_at":"2026-10-22T14:17:37+00:00","modified_at":"2026-10-23T22:16:55+00:00","first_seen_at":"2026-10-23T21:57:31+00:00","fetched_at":"2026-10-23T22:29:02+00:00","note":null},{"source":"analyst","external_id":"CVE-2026-111497:302","url":null,"severity":null,"published_at":"2026-10-23T22:49:07+00:00","modified_at":"2026-10-23T22:49:07+00:00","first_seen_at":"2026-10-23T22:49:07+00:00","fetched_at":"2026-10-23T22:49:07+00:00","note":"Primary: Google CVE record/brotli releases v1.2.1/1.1.1/1.0.10 and Node.js Oct 21 advisory (rated high; CVE record CVSS4 9.2). Real-world exposure is mostly via Node.js, Python Brotli and Bun. No in-the-wild exploitation reported as of Oct 22-23. Aikido says a PoC appeared Oct 22 (first only against a weakened build, then reported RCE on unmodified Node 24.22.0, unreliable), but I could not find a primary link, so none is saved. OX Security warns against running unverified PoC/patch scripts. Python and Bun details come from Aikido and OpenSourceMalware, not from a PyPI or Bun primary page; Bun issue oven-sh/bun#46352 unread. Severity kept critical per the CVE record."},{"source":"lab","external_id":"https://patchtheplanet.org/brotli#CVE-2026-111497","url":"https://patchtheplanet.org/brotli","severity":null,"published_at":"2026-10-23T00:00:00+00:00","modified_at":null,"first_seen_at":"2026-10-24T00:12:39+00:00","fetched_at":"2026-10-24T04:47:15+00:00","note":"OpenAI: Brotli vulnerability (CVE-2026-111497)"},{"source":"github-poc","external_id":"mahumadad/CVE-2026-111497-assessment","url":"https://github.com/mahumadad/CVE-2026-111497-assessment","severity":null,"published_at":"2026-10-24T03:17:24+00:00","modified_at":null,"first_seen_at":"2026-10-24T03:31:37+00:00","fetched_at":"2026-10-24T03:31:37+00:00","note":null},{"source":"epss","external_id":"CVE-2026-111497","url":"https://api.first.org/data/v1/epss?cve=CVE-2026-111497","severity":null,"published_at":null,"modified_at":null,"first_seen_at":"2026-10-24T07:15:51+00:00","fetched_at":"2026-10-24T07:15:51+00:00","note":null},{"source":"github-poc","external_id":"googlesky/CVE-2026-111497","url":"https://github.com/googlesky/CVE-2026-111497","severity":null,"published_at":"2026-10-24T07:11:16+00:00","modified_at":null,"first_seen_at":"2026-10-24T07:18:28+00:00","fetched_at":"2026-10-24T07:18:28+00:00","note":null},{"source":"github-poc","external_id":"pt-act/node2shell-cve-2026-111497","url":"https://github.com/pt-act/node2shell-cve-2026-111497","severity":null,"published_at":"2026-10-24T10:02:46+00:00","modified_at":null,"first_seen_at":"2026-10-24T10:05:10+00:00","fetched_at":"2026-10-24T10:05:10+00:00","note":null},{"source":"github-poc","external_id":"s1ko/poc-cve-2026-111497","url":"https://github.com/s1ko/poc-cve-2026-111497","severity":null,"published_at":"2026-10-24T10:43:18+00:00","modified_at":null,"first_seen_at":"2026-10-24T10:50:41+00:00","fetched_at":"2026-10-24T10:50:41+00:00","note":null},{"source":"github-poc","external_id":"tc4dy/CVE-2026-111497-Toolkit","url":"https://github.com/tc4dy/CVE-2026-111497-Toolkit","severity":null,"published_at":"2026-10-24T15:09:54+00:00","modified_at":null,"first_seen_at":"2026-10-24T15:23:20+00:00","fetched_at":"2026-10-24T15:23:20+00:00","note":null},{"source":"github-poc","external_id":"mnk-works/cve-2026-111497-rce-checker","url":"https://github.com/mnk-works/cve-2026-111497-rce-checker","severity":null,"published_at":"2026-10-24T22:05:21+00:00","modified_at":null,"first_seen_at":"2026-10-24T22:31:28+00:00","fetched_at":"2026-10-24T22:31:28+00:00","note":null},{"source":"github-poc","external_id":"syrex1013/CVE-2026-111497-node2shell","url":"https://github.com/syrex1013/CVE-2026-111497-node2shell","severity":null,"published_at":"2026-10-24T23:03:18+00:00","modified_at":null,"first_seen_at":"2026-10-24T23:16:44+00:00","fetched_at":"2026-10-24T23:16:44+00:00","note":null},{"source":"lab","external_id":"https://developers.cloudflare.com/changelog/post/2026-10-25-emergency-waf-release/#CVE-2026-111497","url":"https://developers.cloudflare.com/changelog/post/2026-10-25-emergency-waf-release/","severity":null,"published_at":"2026-10-25T00:00:00+00:00","modified_at":null,"first_seen_at":"2026-10-25T01:12:28+00:00","fetched_at":"2026-10-25T01:12:28+00:00","note":"Cloudflare: WAF Release - 2026-10-25 - Emergency - Cloudflare Managed Ruleset · Changelog"}],"documents":[{"id":670,"url":"https://news.ycombinator.com/item?id=50189292","title":"Node.js Brotli RCE (CVE-2026-111497)","kind":"post","source":"hackernews","text":"Node.js Brotli RCE (CVE-2026-111497)\nhttps://vercel.com/kb/bulletin/node-js-security-advisory\n\n23 points, 0 comments on Hacker News","published_at":"2026-10-21T23:58:43+00:00","relation":"discussion","confidence":null,"note":null},{"id":534,"url":"https://news.ycombinator.com/item?id=50203180","title":"Node2Shell: Node.js Brotli vulnerability allows remote code execution","kind":"post","source":"hackernews","text":"Node2Shell: Node.js Brotli vulnerability allows remote code execution\nhttps://www.aikido.dev/blog/node2shell-nodejs-brotli-rce-cve-2026-111497\n\n14 points, 1 comments on Hacker News","published_at":"2026-10-23T00:54:32+00:00","relation":"discussion","confidence":null,"note":null},{"id":669,"url":"https://news.ycombinator.com/item?id=50192733","title":"Node.js security advisory: Brotli decoder RCE (CVE-2026-111497)","kind":"post","source":"hackernews","text":"Node.js security advisory: Brotli decoder RCE (CVE-2026-111497)\nhttps://vercel.com/kb/bulletin/node-js-security-advisory\n\n17 points, 3 comments on Hacker News","published_at":"2026-10-22T08:27:26+00:00","relation":"discussion","confidence":null,"note":null},{"id":1615,"url":"https://github.com/google/brotli/releases","title":"google/brotli releases: v1.2.1, v1.1.1, v1.0.10","kind":"release","source":"analyst","text":null,"published_at":null,"relation":"fix","confidence":null,"note":null},{"id":1616,"url":"https://nodejs.org/en/blog/vulnerability/october-2026-security-releases","title":"Node.js October 21, 2026 Security Releases","kind":"advisory","source":"analyst","text":null,"published_at":null,"relation":"advisory","confidence":null,"note":null},{"id":1617,"url":"https://www.aikido.dev/blog/node2shell-nodejs-brotli-rce-cve-2026-111497","title":"Node2Shell: Node.js Brotli vulnerability allows remote code execution","kind":"blog","source":"analyst","text":null,"published_at":null,"relation":"describes","confidence":null,"note":null},{"id":1618,"url":"https://opensourcemalware.com/blog/node2shell-affects-python","title":"Python Packages Vulnerable to Node2Shell","kind":"blog","source":"analyst","text":null,"published_at":null,"relation":"describes","confidence":null,"note":null},{"id":1619,"url":"https://vercel.com/kb/bulletin/node-js-security-advisory","title":"Vercel: Node.js security advisory, Brotli decoder RCE","kind":"vendor","source":"analyst","text":null,"published_at":null,"relation":"mitigation","confidence":null,"note":null},{"id":1620,"url":"https://security-tracker.debian.org/tracker/CVE-2026-111497","title":"Debian security tracker CVE-2026-111497","kind":"other","source":"analyst","text":null,"published_at":null,"relation":"mentions","confidence":null,"note":null},{"id":1621,"url":"https://www.cve.org/CVERecord?id=CVE-2026-111497","title":"CVE Record CVE-2026-111497 (Google CNA)","kind":"advisory","source":"analyst","text":null,"published_at":null,"relation":"advisory","confidence":null,"note":null},{"id":1622,"url":"https://x.com/AikidoSecurity/status/2113759110625906950","title":null,"kind":"post","source":"analyst","text":"@AikidoSecurity (Aikido, 20728 followers) · likes 41 reposts 12\nEvolving threat: CVE-2026-111497, previously known to affect Node.js (node2shell) and Python has evolved into \"HTTP2Shell.\" A significant blast radius. This vulnerability leaves many libraries and applications using HTTP vulnerable to pre-auth RCE via Brotli decompression.","published_at":"2026-10-23T00:00:00+00:00","relation":"discussion","confidence":null,"note":null},{"id":532,"url":"https://news.ycombinator.com/item?id=50204501","title":"Node2Shell: From Brotli Data to Remote Code Execution","kind":"post","source":"hackernews","text":"Node2Shell: From Brotli Data to Remote Code Execution\nhttps://nodejs.org/en/blog/vulnerability/october-2026-security-releases\n\n4 points, 0 comments on Hacker News","published_at":"2026-10-23T04:26:13+00:00","relation":"discussion","confidence":null,"note":null},{"id":2480,"url":"https://patchtheplanet.org/brotli","title":"OpenAI: Brotli vulnerability (CVE-2026-111497)","kind":"advisory","source":"lab","text":"Brotli vulnerability (CVE-2026-111497) — Patch the Planet\n\nCVE-2026-111497 · Updated October 23, 2026\n\n# Brotli decoder vulnerability\n\nCrafted Brotli-compressed data can corrupt memory and allow remote code execution in affected software, including Node.js, Bun, and deployments of Envoy Proxy or Istio configured for Brotli decompression.\n\nFixes are available. Update affected deployments now. If you cannot patch immediately, disable Brotli decompression of untrusted data until the update is deployed.\n\n## Start patching\n\nUpdate to a listed fixed version or a later patched release in the same branch, then restart or redeploy.\n\nFixed releases · Reviewed October 23, 2026\n\n| Project | Patch status | Fixed versions |\n| --- | --- | --- |\n| Node.js | Patch available | 22.23.4 · 24.22.1 · 26.12.1 Use a supported release line. |\n| Bun | Patch available | 1.4.4 Includes Brotli 1.2.1. |\n| Envoy Proxy | Patch available | 1.40.0 · 1.39.3 · 1.38.6 · 1.37.8 1.36.12 also includes the fix, but 1.36 is unsupported. Use a supported branch. |\n| Istio | Patch available | 1.29.9 · 1.30.6 · 1.31.2 1.29 is end of life; move to a supported line. |\n| Google Brotli (upstream) | Patch available | 1.0.10 · 1.1.1 · 1.2.1 Choose the fixed release for your library branch. |\n\n## Who is affected\n\nAny application that passes attacker-controlled data to an affected Google Brotli decoder may be exposed. This includes compressed HTTP request bodies, responses fetched from untrusted servers, and compressed files. The bug can cause crashes, disclose memory, or allow code execution.\n\nCheck web services, background workers, tools that bundle Node.js or Bun, and deployments of Envoy Proxy or Istio configured to decompress Brotli.\n\nOther software to check\n\n- Embedded runtimes: apps such as Electron-based desktop tools can include multiple Brotli copies. Check both Chromium and Node.js; a fixed browser component does not establish that the embedded Node.js runtime is fixed.\n- Native clients and bindings: check the decoder loaded by curl/libcurl, Python and Java bindings, and other native libraries. Bundled wheels and static binaries may need their own update or rebuild.\n- File processing: include font decoders and data-file readers that use Brotli. Exposure is not limited to HTTP traffic.\n\nUsing Brotli only to compress outgoing data does not by itself establish exposure to this decoder flaw.\n\n## Disable Brotli decoding until you can patch\n\nYou can keep other compression enabled. Disable Brotli decoding of untrusted data while allowing gzip, deflate, or other supported codecs. Apply this to every decoding path; if your stack cannot block Brotli separately, disable automatic decompression or pause that path until patched.\n\n- Incoming requests: reject requests with `Content-Encoding: br` before any proxy, middleware, or body parser decompresses them. Cover direct-to-origin and alternate routes.\n- Fetched responses: disable automatic Brotli decompression in HTTP clients. Reject Brotli responses before decoding; if your client cannot do this, pause the affected fetch or use a patched client. Removing `br` from `Accept-Encoding` alone does not stop a server from sending it.\n- In Envoy Proxy and Istio, disable Brotli decompressor filters for both requests and responses. Disabling a filter can pass compressed data onward, so protect downstream decoders too.\n- Files and other inputs: pause untrusted Brotli processing until the decoder is patched.\n\nTurning off Brotli response compression on a CDN or web server does not disable request or client-side decompression. Request-size limits and WAF rules alone do not cover every decoding path.\n\nExpress: reject Brotli, keep gzip and deflate\n\nAllow only uncompressed, gzip, or deflate request bodies before any parser runs. Keep automatic decompression enabled for those permitted encodings.\n\nExpress request encoding guard\n\nCopy\n\n```\n// Register before every body parser or decompression middleware.\napp.use((req, res, next) => {\n  const encoding = (req.get('Content-Encoding') || 'identity')\n    .trim().toLowerCase();\n\n  if (!['identity', 'gzip', 'deflate'].includes(encoding)) {\n    return res.status(415).send(\n      'Use gzip, deflate, or an uncompressed request body.'\n    );\n  }\n  next();\n});\n\n// Keep your existing parser options and register routes afterward.\napp.use(express.json());\napp.use(express.urlencoded({ extended: true }));\n```\n\nPlace this guard before all JSON, form, raw, text, and route-specific parsers. It rejects Brotli, unknown encodings, and stacked encodings such as `gzip, br` with HTTP 415. A proxy that decodes requests first needs its own mitigation.\n\nIf you cannot enforce the guard before decoding, set `inflate: false` on every existing body parser as a fallback. That rejects all compressed request bodies, including gzip and deflate.\n\nExpress body-parser options ↗\n\nNext.js: disable built-in image optimization until Node.js is patched\n\nIf you cannot update Node.js immediately, set `images.unoptimized` globally. This stops the built-in image optimizer from fetching and decoding remote images. Merge this setting into your existing configuration, then rebuild and redeploy:\n\nNext.js image optimization workaround\n\nCopy\n\n```\n// next.config.js: retain your other settings.\nmodule.exports = {\n  images: {\n    // Retain your existing images settings here.\n    unoptimized: true,\n  },\n};\n```\n\nImages are served directly from their source URLs. Verify that requests to `/_next/image` no longer run the optimizer. This does not protect other server-side fetches, custom image loaders, or other Brotli decoders.\n\nNext.js unoptimized image option ↗\n\nDisable only the Brotli decompressor in Envoy Proxy and Istio\n\nRemove the HTTP decompressor filter whose `decompressor_library` uses the Brotli type. Keep separate gzip and zstd decompressor filters. Alternatively, disable both directions in that existing Brotli filter:\n\nEnvoy Proxy Brotli decompressor settings\n\nCopy\n\n```\n# Inside the existing Brotli decompressor's typed_config.\n# Leave separate gzip / zstd decompressor filters enabled.\nrequest_direction_config:\n  common_config:\n    enabled:\n      default_value: false\nresponse_direction_config:\n  common_config:\n    enabled:\n      default_value: false\n```\n\nReplace the existing direction settings and remove any `runtime_key` from these two `enabled` fields; a runtime override can otherwise re-enable Brotli. An omitted direction defaults to enabled.\n\nFor Istio: edit the original `EnvoyFilter` patch that inserts the Brotli filter. Remove that insertion or apply the settings above to it. Do not remove every filter named `envoy.filters.http.decompressor`; gzip and zstd can share that name.\n\nA disabled or removed filter passes encoded bytes onward. Reject Brotli before any remaining vulnerable application or client decoder. Verify the effective configuration on every affected gateway and sidecar, and test that permitted compression still works.\n\nEnvoy Proxy decompressor settings ↗ Envoy Proxy runtime flags ↗ Istio EnvoyFilter reference ↗\n\nPython HTTP client: accept gzip and deflate, reject Brotli\n\nWith urllib3, leave the body unread and undecoded until you have checked its encoding. This example allows uncompressed, gzip, and deflate responses, and rejects Brotli even if the server ignores `Accept-Encoding`.\n\nPython urllib3 response encoding guard\n\nCopy\n\n```\nimport urllib3\n\nhttp = urllib3.PoolManager()\nresponse = http.request(\n    \"GET\", url,\n    headers={\"Accept-Encoding\": \"gzip, deflate\"},\n    preload_content=False,\n    decode_content=False,\n    redirect=False,\n    retries=False,\n    timeout=10.0,\n)\ntry:\n    encoding = response.headers.get(\"Content-Encoding\", \"identity\")\n    if encoding.strip().lower() not in {\"identity\", \"gzip\", \"deflate\"}:\n        raise ValueError(\"Unsupported response content encoding\")\n    data = response.read(decode_content=True)\nfinally:\n    response.close()\n    response.release_conn()\n```\n\nKeep redirects and retries disabled for this example. If you add them, apply the same check to every response before reading its body. Retain your application’s response-size limits when adapting the example.\n\nFor other HTTP clients, use a documented raw-response mode or a Brotli-specific decoder switch. Checking headers after a normal `fetch()` or automatic body read can be too late.\n\nurllib3 response decoding options ↗\n\n## Restart and verify every deployment\n\n1. Update runtime and image pins. Rebuild containers and executables that embed the affected runtime.\n2. Restart or redeploy every service, worker, scheduled job, and replica using the old build.\n3. Check the running binary or image against the vendor’s fixed release. Confirm temporary blocks reject Brotli before decoding, and test that permitted gzip or other compression still works.\n\n## References and credit\n\nCVE-2026-111497 ↗ Node.js security advisory ↗ Bun 1.4.4 release notes ↗ Bun 1.4.4 Brotli dependency ↗ Brotli 1.2.1 release ↗ Envoy Proxy releases ↗ Envoy Proxy 1.36.12 (unsupported branch) ↗ Envoy Proxy 1.40.0 Brotli dependency ↗ Istio security advisory ↗\n\nThe Node.js advisory credits Khai Tran and Sylvie Mayer of OpenAI Codex Security for reporting this vulnerability, and mcollina and aduh95 for the fix.\n\n### Acknowledgments\n\nWe thank the Google Brotli, Node.js, Envoy Proxy, and Istio maintainers for their work on fixes and security releases, and the OpenJS Foundation for helping coordinate the response. Special thanks to Matteo Collina, Antoine du Hamel, Rafael Gonzaga, Ulises Gascón, Robin Ginn, Yan Avlasov, and Petr McAllister for working with us to protect downstream users.","published_at":"2026-10-23T00:00:00+00:00","relation":"advisory","confidence":null,"note":"OpenAI disclosure page"},{"id":2677,"url":"https://github.com/mahumadad/CVE-2026-111497-assessment","title":"mahumadad/CVE-2026-111497-assessment","kind":"poc","source":"github","text":"Defensive assessment toolkit for CVE-2026-111497 (Brotli OOB write): ecosystem scanner, Python outbound PoC, canary server, CDN amplification analysis, framework defense matrix\n\nstars 0","published_at":"2026-10-24T03:17:24+00:00","relation":"poc","confidence":null,"note":"0 stars"},{"id":2707,"url":"https://github.com/googlesky/CVE-2026-111497","title":"googlesky/CVE-2026-111497","kind":"poc","source":"github","text":"PoC, Docker lab, and technical report for CVE-2026-111497 (Node2Shell) — Node.js Brotli decoder invalid block-switch OOB write; validated errno differential and weaponized remote DoS, RCE analysis included.\n\nstars 0","published_at":"2026-10-24T07:11:16+00:00","relation":"poc","confidence":null,"note":"0 stars"},{"id":2714,"url":"https://news.ycombinator.com/item?id=50219177","title":"Node2Shell evolves to HTTP2Shell, blast radius affects many HTTP libs and apps","kind":"post","source":"hackernews","text":"Node2Shell evolves to HTTP2Shell, blast radius affects many HTTP libs and apps\nhttps://www.aikido.dev/blog/python-packages-vulnerable-node2shell-brotli-cve-2026-111497\n\n1 points, 0 comments on Hacker News","published_at":"2026-10-24T08:06:39+00:00","relation":"discussion","confidence":null,"note":"1 points, 0 comments"},{"id":2722,"url":"https://x.com/TheHackersNews/status/2113916077923303786","title":"@TheHackersNews: ‼️ Alert -  Critical Brotli flaw behind #Node2Shell RCE goes far beyond Node.js.","kind":"post","source":"x","text":"‼️ Alert -  Critical Brotli flaw behind #Node2Shell RCE goes far beyond Node.js.\n\nBun, Python Brotli packages, Envoy, Istio and other widely used software are also affected by the same CVE-2026-111497 memory-corruption vulnerability.\n\nRead full details ↓ https://t.co/H5YLRc19Zw\n\nlikes 17 reposts 6","published_at":"2026-10-24T08:50:42+00:00","relation":"discussion","confidence":null,"note":"@TheHackersNews"},{"id":2726,"url":"https://github.com/pt-act/node2shell-cve-2026-111497","title":"pt-act/node2shell-cve-2026-111497","kind":"poc","source":"github","text":"Node2Shell / HTTP2Shell (CVE-2026-111497) exposure-audit kit — read-only scanner + agent prompts. macOS bash 3.2 / Linux portable.\n\nstars 0","published_at":"2026-10-24T10:02:46+00:00","relation":"poc","confidence":null,"note":"0 stars"},{"id":2732,"url":"https://github.com/s1ko/poc-cve-2026-111497","title":"s1ko/poc-cve-2026-111497","kind":"poc","source":"github","text":"CVE-2026-111497 (Node2Shell): deteccion del decoder Brotli vulnerable en Python y Node por el codigo de error real del decoder, con laboratorio HTTP local\n\nstars 0","published_at":"2026-10-24T10:43:18+00:00","relation":"poc","confidence":null,"note":"0 stars"},{"id":2763,"url":"https://news.ycombinator.com/item?id=50221110","title":"Broccoli2Shell: Brotli decoder RCE (CVE-2026-111497) in Node.js, Python and more","kind":"post","source":"hackernews","text":"Broccoli2Shell: Brotli decoder RCE (CVE-2026-111497) in Node.js, Python and more\nhttps://broccoli2shell.com/\n\n1 points, 0 comments on Hacker News","published_at":"2026-10-24T13:36:59+00:00","relation":"discussion","confidence":null,"note":"1 points, 0 comments"},{"id":2784,"url":"https://github.com/tc4dy/CVE-2026-111497-Toolkit","title":"tc4dy/CVE-2026-111497-Toolkit","kind":"poc","source":"github","text":"CVE-2026-111497 – Node.js Brotli Decoder OOB Write (CVSS 9.2) | Red/Blue Team suite for unpatched Node.js 22.x, 24.x, 26.x. 2 tools: Full Exploit (patch detection, remote DoS, Brotli bomb, lab RCE), Blue Team Checker (errno differential, version fingerprint, WAF detection, reporting) Only Use Ethically Only <3\n\nstars 0","published_at":"2026-10-24T15:09:54+00:00","relation":"poc","confidence":null,"note":"0 stars"},{"id":3010,"url":"https://github.com/mnk-works/cve-2026-111497-rce-checker","title":"mnk-works/cve-2026-111497-rce-checker","kind":"poc","source":"github","text":"Lab-only exact-profile RCE/DoS validator for CVE-2026-111497; refuses non-loopback targets\n\nstars 0","published_at":"2026-10-24T22:05:21+00:00","relation":"poc","confidence":null,"note":"0 stars"},{"id":3016,"url":"https://github.com/syrex1013/CVE-2026-111497-node2shell","title":"syrex1013/CVE-2026-111497-node2shell","kind":"poc","source":"github","text":"CVE-2026-111497 Node2Shell — Node.js Brotli OOB Write RCE PoC (CVSS 9.2)\n\nstars 0","published_at":"2026-10-24T23:03:18+00:00","relation":"poc","confidence":null,"note":"0 stars"},{"id":3042,"url":"https://developers.cloudflare.com/changelog/post/2026-10-25-emergency-waf-release/","title":"Cloudflare: WAF Release - 2026-10-25 - Emergency - Cloudflare Managed Ruleset · Changelog","kind":"advisory","source":"lab","text":"WAF Release - 2026-10-25 - Emergency - Cloudflare Managed Ruleset · Changelog\n\n# Changelog\n\nNew updates and improvements at Cloudflare.\n\nOctober 25, 2026\n\n## WAF Release - 2026-10-25 - Emergency - Cloudflare Managed Ruleset\n\nThis emergency release will add two rules related to the Brotli vulnerability CVE-2026-111497 to the Cloudflare Managed Ruleset. Both rules will be enabled by default with their action set to Log, providing visibility into matching requests so customers can evaluate the impact before choosing to block them.\n\nRule behavior\n\n- Brotli rule: Matches incoming requests that declare Brotli request-body encoding (`Content-Encoding: br`), including legitimate clients submitting Brotli-encoded request bodies. It does not match `Accept-Encoding: br` or affect Cloudflare's Brotli response-compression settings. The rule's default action is Log.\n- Next.js rule: Matches requests to the Next.js image optimization endpoint (`/_next/image`), including legitimate image optimization traffic. The default action is Log and does not block requests. Changing the action to Block may prevent optimized images from loading and disrupt image delivery for applications using this endpoint.\n\nDefault behavior\n\n- Both rules will log matching requests without blocking them when the ruleset defaults are used.\n- Customers will be able to review matches in analytics and configure a blocking action for either rule if desired.\n- Enabling these rules in Log mode provides visibility only; it does not block requests matching these rules.\n\nImportant: Check existing action overrides\n\nIf you have configured a ruleset-level action override that applies Block to these rules, matching requests may be blocked as soon as the rules are deployed, despite their default Log action. This may result in false positives and block legitimate traffic.\n\nReview your existing ruleset overrides before deployment. If you want to evaluate these rules without blocking traffic, configure rule-specific overrides to use Log and review matching requests before switching to Block.\n\n| Ruleset | Rule ID | Legacy Rule ID | Description | Previous Action | New Action | Comments |\n| --- | --- | --- | --- | --- | --- | --- |\n| Cloudflare Managed Ruleset | ...ca706f3c | N/A | Brotli - Request Content-Encoding - CVE:CVE-2026-111497 | N/A | Log | This is a new detection. |\n| Cloudflare Managed Ruleset | ...402fe5bb | N/A | Next.js - Image Optimizer Path - CVE:CVE-2026-111497 | N/A | Log | This is a new detection. |","published_at":"2026-10-25T00:00:00+00:00","relation":"advisory","confidence":null,"note":"Cloudflare disclosure page"}],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}