{"id":"CVE-2026-109869","kind":"vulnerability","aliases":["CVE-2026-109869","GHSA-xjj6-f33q-929c"],"related":[],"title":"undici vulnerable to Denial of Service via unhandled error on excessive content-encodings","description":"### Impact\n\nundici's `fetch()` crashes the Node.js process when a malicious server returns a response with more than five content codings and closes the connection before sending the body. undici rejects such responses (a content-encoding limit), but it created the internal response stream before that check and returned without attaching an error listener or aborting the request. The early close then surfaces a content-length mismatch on that orphaned internal stream, which Node.js treats as an unhandled `error` and terminates the process. A remote, unauthenticated server can trigger this with a single response, even when the application correctly catches the `fetch()` rejection. undici 6.x, 7.x, and 8.x are affected.\n\n### Patches\n\nUpgrade to `6.29.1`, `7.30.1`, or `8.12.2`. undici now validates the content-encoding chain before creating the internal body stream and aborts the response when the limit is exceeded, so no error can surface on an orphaned stream.\n\n### Workarounds\n\nNone.","summary":"undici's fetch() crashes the Node.js process when a remote server sends a response with more than five content codings and closes the connection before the body. An attacker who controls or can impersonate an HTTP server the application fetches from can take the process down with one response.","severity":"high","cvss":7.5,"epss":0.00343,"exploited":false,"exploited_at":null,"products":[{"name":"undici","fixed":["6.29.1"],"affected":">= 6.23.0, < 6.29.1","ecosystem":"npm"},{"name":"undici","fixed":["7.30.1"],"affected":">= 7.18.0, < 7.30.1","ecosystem":"npm"},{"name":"undici","fixed":["8.12.2"],"affected":">= 8.0.0, < 8.12.2","ecosystem":"npm"},{"name":"nodejs undici","fixed":["6.29.1"],"affected":">= 6.23.0, < 6.29.1","ecosystem":"vendor"},{"name":"nodejs undici","fixed":["7.30.1"],"affected":">= 7.18.0, < 7.30.1","ecosystem":"vendor"},{"name":"nodejs undici","fixed":["8.12.2"],"affected":">= 8.0.0, < 8.12.2","ecosystem":"vendor"}],"ecosystems":["npm","vendor"],"tags":["cwe-248","cwe-459","fetch","node.js","npm","package","server-side","undici"],"not_affected_if":["only-trusted-upstreams","version-outside-affected-range"],"how_to_check":"- Run `npm ls undici` in the project and check whether the resolved version falls in 6.23.0 to below 6.29.1, 7.18.0 to below 7.30.1, or 8.0.0 to below 8.12.2.\n- Check the Node.js bundled undici version with `node -p process.versions.undici` if the application relies on global fetch.","fix":"- Upgrade the undici package to `6.29.1`, `7.30.1`, or `8.12.2` matching the major line in use.\n- Upgrade Node.js to a release that bundles a fixed undici if global fetch is used without a direct undici dependency.","status":"open","published_at":"2026-10-15T19:17:21+00:00","first_seen_at":"2026-10-23T22:15:56+00:00","triaged_at":"2026-10-25T03:25:24+00:00","updated_at":"2026-10-25T03:25:24+00:00","category":"package","confidence":0.85,"triage":{"at":"2026-10-25T03:25:24Z","model":"claude-haiku-5-5","output":{"fix":"- Upgrade the undici package to `6.29.1`, `7.30.1`, or `8.12.2` matching the major line in use.\n- Upgrade Node.js to a release that bundles a fixed undici if global fetch is used without a direct undici dependency.","reach":"internet","title":"undici: a malicious server response crashes Node.js fetch() callers","impact":"medium","summary":"undici's fetch() crashes the Node.js process when a remote server sends a response with more than five content codings and closes the connection before the body. An attacker who controls or can impersonate an HTTP server the application fetches from can take the process down with one response.","category":"package","nicknames":[],"who_cares":["node.js","undici","npm","fetch","server-side"],"confidence":0.85,"needs_auth":"no","worst_case":"Remote server crashes the Node.js process with one response","analyst_note":"","how_to_check":"- Run `npm ls undici` in the project and check whether the resolved version falls in 6.23.0 to below 6.29.1, 7.18.0 to below 7.30.1, or 8.0.0 to below 8.12.2.\n- Check the Node.js bundled undici version with `node -p process.versions.undici` if the application relies on global fetch.","needs_analyst":false,"not_affected_if":["version-outside-affected-range","only-trusted-upstreams"],"who_is_affected":"Any Node.js application that calls fetch() or uses undici directly against servers it does not fully control, such as third-party APIs, webhooks targets, or user-supplied URLs. Applications that only call trusted internal services with fixed, controlled responses are much less exposed. Teams that pin a pre-6.23.0 or post-fixed version can skip it.","user_interaction":"no","needs_special_setup":"no","severity_if_unknown":"high"},"cost_usd":0.000691,"input_tokens":3804,"output_tokens":622,"severity_before":"high"},"analyst_status":null,"analyst_note":null,"search":"'-109869':17A,25A '-2026':16A,24A '-248':36B '-459':38B '6':202C '6.29.1':214C '7':204C '7.30.1':215C '8':207C '8.12.2':217C '929c':22A 'abort':152C,233C 'affect':210C 'applic':85B,195C 'attach':147C 'attack':75B 'bodi':73B,124C,230C 'catch':197C 'chain':225C 'check':143C 'close':68B,118C,157C 'code':66B,116C 'connect':70B,120C 'content':13A,65B,115C,131C,162C,223C 'content-encod':12A,130C,222C 'content-length':161C 'control':77B 'correct':196C 'crash':50B,100C 'creat':136C,227C 'cve':15A,23A 'cwe':35B,37B 'denial':4A 'earli':156C 'encod':14A,132C,224C 'error':9A,149C,176C,243C 'even':192C 'exceed':240C 'excess':11A 'f33q':21A 'fetch':39B,49B,86B,99C,199C 'five':64B,114C 'ghsa':19A 'ghsa-xjj6-f33q-929c':18A 'http':82B 'impact':96C 'imperson':80B 'intern':138C,168C,229C 'length':163C 'limit':133C,238C 'listen':150C 'malici':106C 'mismatch':164C 'node.js':40B,52B,102C,171C 'nodejs':29A,31A,33A 'none':251C 'npm':41B 'one':94B 'orphan':167C,248C 'packag':42B 'patch':211C 'process':53B,91B,103C,180C 'reject':126C,200C 'remot':56B,182C 'request':154C 'respons':60B,95B,110C,128C,139C,191C,235C 'return':108C,145C 'send':58B,122C 'server':44B,57B,83B,107C,184C 'server-sid':43B 'servic':6A 'side':45B 'singl':190C 'stream':140C,169C,231C,249C 'surfac':159C,245C 'take':89B 'termin':178C 'treat':172C 'trigger':186C 'unauthent':183C 'undici':1A,26A,27A,28A,30A,32A,34A,46B,47B,97C,125C,201C,218C 'unhandl':8A,175C 'upgrad':212C 'valid':220C 'via':7A 'vulner':2A 'without':146C 'workaround':250C 'x':203C,205C,208C 'xjj6':20A","nicknames":[],"mitigations":[],"who_affected":"Any Node.js application that calls fetch() or uses undici directly against servers it does not fully control, such as third-party APIs, webhooks targets, or user-supplied URLs. Applications that only call trusted internal services with fixed, controlled responses are much less exposed. Teams that pin a pre-6.23.0 or post-fixed version can skip it.","tier":"B","verified":{},"analyst_revisit_at":null,"first_public_at":"2026-10-15T19:17:21+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","cvss_by":"GitHub","poc_count":0,"sources":[{"source":"ghsa","external_id":"GHSA-xjj6-f33q-929c","url":"https://github.com/advisories/GHSA-xjj6-f33q-929c","severity":"high","published_at":"2026-10-23T22:14:31+00:00","modified_at":"2026-10-23T22:14:32+00:00","first_seen_at":"2026-10-23T22:15:56+00:00","fetched_at":"2026-10-23T22:22:36+00:00","note":null},{"source":"nvd","external_id":"CVE-2026-109869","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-109869","severity":null,"published_at":"2026-10-15T19:17:21+00:00","modified_at":"2026-10-19T20:45:20+00:00","first_seen_at":"2026-10-23T23:44:52+00:00","fetched_at":"2026-10-23T23:44:52+00:00","note":null}],"documents":[],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}