{"id":"CVE-2026-120423","kind":"vulnerability","aliases":["CVE-2026-120423"],"related":[],"title":"undici: fetch skips subresource integrity checks on tab-separated digests","description":"undici is an HTTP client for Node.js. In versions 7.15.0 through 7.30.1 and 8.0.0 through 8.12.3, fetch verifies Subresource Integrity metadata by splitting the integrity string on a single space, but the SRI grammar separates metadata by ASCII whitespace, which also includes the horizontal tab. An integrity value whose digest is preceded by a tab or other ASCII whitespace is parsed as a single unrecognized token and skipped, and when no recognized algorithm remains undici treats the integrity list as empty and accepts the response, so a server returning a body different from the pinned digest passes the check. An application that pins a response with a valid but whitespace-surrounded SRI value receives attacker-controlled bytes with no integrity error, and the attacker needs only to control the response body, not the integrity metadata. The issue is fixed in undici 7.30.2 and 8.12.4, and users should upgrade to one of those versions or later. As a workaround, supply SRI integrity metadata without surrounding whitespace, using a single space to separate multiple digests.","summary":"undici's fetch splits Subresource Integrity metadata only on a single space, so a digest preceded by a tab or other whitespace is ignored and the check passes. An attacker who controls the response body can therefore deliver bytes that differ from the pinned digest without an integrity error.","severity":"medium","cvss":5.9,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["fetch","node.js","package","undici"],"not_affected_if":["clean-sri-metadata","no-integrity-option"],"how_to_check":"- Run `npm ls undici` to find installed undici versions in the project tree.\n- Look for calls to `fetch` that pass an `integrity` option with a value containing tabs or other leading or trailing whitespace.","fix":"- undici `7.30.2`\n- undici `8.12.4`\n- Workaround from the description: supply SRI integrity metadata without surrounding whitespace, separating multiple digests with a single space.","status":"open","published_at":"2026-11-06T10:16:36+00:00","first_seen_at":"2026-11-06T10:40:56+00:00","triaged_at":"2026-11-06T10:41:21+00:00","updated_at":"2026-11-06T10:41:21+00:00","category":"package","confidence":0.8,"triage":{"at":"2026-11-06T10:41:21Z","model":"claude-haiku-5-5","output":{"fix":"- undici `7.30.2`\n- undici `8.12.4`\n- Workaround from the description: supply SRI integrity metadata without surrounding whitespace, separating multiple digests with a single space.","reach":"network","title":"undici: fetch skips subresource integrity checks on tab-separated digests","impact":"medium","summary":"undici's fetch splits Subresource Integrity metadata only on a single space, so a digest preceded by a tab or other whitespace is ignored and the check passes. An attacker who controls the response body can therefore deliver bytes that differ from the pinned digest without an integrity error.","audience":"developers","category":"package","nicknames":[],"who_cares":["node.js","undici","fetch"],"confidence":0.8,"fix_status":"available","needs_auth":"no","worst_case":"attacker-controlled response bytes accepted despite pinned digest","analyst_note":"","how_to_check":"- Run `npm ls undici` to find installed undici versions in the project tree.\n- Look for calls to `fetch` that pass an `integrity` option with a value containing tabs or other leading or trailing whitespace.","plain_action":"","needs_analyst":false,"not_affected_if":["no-integrity-option","clean-sri-metadata"],"who_is_affected":"Applications using undici's fetch with Subresource Integrity values to pin response bodies are exposed when the integrity string has whitespace around the digest, such as a leading tab. Applications that do not use the integrity option, or that pin with clean single-space metadata, are not affected by this flaw.","user_interaction":"no","needs_special_setup":"yes","severity_if_unknown":"medium"},"cost_usd":0.000732,"input_tokens":4476,"output_tokens":569,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-120423':14A,17A '-2026':13A,16A '7.15.0':80C '7.30.1':82C '7.30.2':214C '8.0.0':84C '8.12.3':86C '8.12.4':216C 'accept':153C 'algorithm':143C 'also':111C 'applic':171C 'ascii':108C,128C 'attack':51B,187C,196C 'attacker-control':186C 'bodi':56B,161C,203C 'byte':60B,189C 'check':6A,48B,169C 'client':75C 'control':53B,188C,200C 'cve':12A,15A 'deliv':59B 'differ':62B,162C 'digest':11A,36B,66B,120C,166C,245C 'empti':151C 'error':70B,193C 'fetch':2A,18B,24B,87C 'fix':211C 'grammar':104C 'horizont':114C 'http':74C 'ignor':45B 'includ':112C 'integr':5A,27B,69B,90C,95C,117C,148C,192C,206C,233C 'issu':209C 'later':227C 'list':149C 'metadata':28B,91C,106C,207C,234C 'multipl':244C 'need':197C 'node.js':19B,77C 'one':222C 'packag':20B 'pars':131C 'pass':49B,167C 'pin':65B,165C,173C 'preced':37B,122C 'receiv':185C 'recogn':142C 'remain':144C 'respons':55B,155C,175C,202C 'return':159C 'separ':10A,105C,243C 'server':158C 'singl':32B,99C,134C,240C 'skip':3A,138C 'space':33B,100C,241C 'split':25B,93C 'sri':103C,183C,232C 'string':96C 'subresourc':4A,26B,89C 'suppli':231C 'surround':182C,236C 'tab':9A,40B,115C,125C 'tab-separ':8A 'therefor':58B 'token':136C 'treat':146C 'undici':1A,21B,22B,71C,145C,213C 'unrecogn':135C 'upgrad':220C 'use':238C 'user':218C 'valid':178C 'valu':118C,184C 'verifi':88C 'version':79C,225C 'whitespac':43B,109C,129C,181C,237C 'whitespace-surround':180C 'whose':119C 'without':67B,235C 'workaround':230C","nicknames":[],"mitigations":[],"who_affected":"Applications using undici's fetch with Subresource Integrity values to pin response bodies are exposed when the integrity string has whitespace around the digest, such as a leading tab. Applications that do not use the integrity option, or that pin with clean single-space metadata, are not affected by this flaw.","tier":"C","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"pkeys":[],"ptokens":[],"labels":["fetch","medium","nodejs","package","undici"],"campaign_type":null,"search_a":"'-120423':14A,17A '-2026':13A,16A 'check':6A 'cve':12A,15A 'digest':11A 'fetch':2A 'integr':5A 'separ':10A 'skip':3A 'subresourc':4A 'tab':9A 'tab-separ':8A 'undici':1A","search_b":"'attack':51B 'bodi':56B 'byte':60B 'check':48B 'control':53B 'deliv':59B 'differ':62B 'digest':36B,66B 'error':70B 'fetch':18B,24B 'ignor':45B 'integr':27B,69B 'metadata':28B 'node.js':19B 'packag':20B 'pass':49B 'pin':65B 'preced':37B 'respons':55B 'singl':32B 'space':33B 'split':25B 'subresourc':26B 'tab':40B 'therefor':58B 'undici':21B,22B 'whitespac':43B 'without':67B","search_c":"'7.15.0':80C '7.30.1':82C '7.30.2':214C '8.0.0':84C '8.12.3':86C '8.12.4':216C 'accept':153C 'algorithm':143C 'also':111C 'applic':171C 'ascii':108C,128C 'attack':187C,196C 'attacker-control':186C 'bodi':161C,203C 'byte':189C 'check':169C 'client':75C 'control':188C,200C 'differ':162C 'digest':120C,166C,245C 'empti':151C 'error':193C 'fetch':87C 'fix':211C 'grammar':104C 'horizont':114C 'http':74C 'includ':112C 'integr':90C,95C,117C,148C,192C,206C,233C 'issu':209C 'later':227C 'list':149C 'metadata':91C,106C,207C,234C 'multipl':244C 'need':197C 'node.js':77C 'one':222C 'pars':131C 'pass':167C 'pin':165C,173C 'preced':122C 'receiv':185C 'recogn':142C 'remain':144C 'respons':155C,175C,202C 'return':159C 'separ':105C,243C 'server':158C 'singl':99C,134C,240C 'skip':138C 'space':100C,241C 'split':93C 'sri':103C,183C,232C 'string':96C 'subresourc':89C 'suppli':231C 'surround':182C,236C 'tab':115C,125C 'token':136C 'treat':146C 'undici':71C,145C,213C 'unrecogn':135C 'upgrad':220C 'use':238C 'user':218C 'valid':178C 'valu':118C,184C 'verifi':88C 'version':79C,225C 'whitespac':109C,129C,181C,237C 'whitespace-surround':180C 'whose':119C 'without':235C 'workaround':230C","first_public_at":"2026-11-05T10:27:40+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N","cvss_by":"ce714d77-add3-4f53-aff5-83d477b104bb","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-120423","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-120423","severity":null,"published_at":"2026-11-06T10:16:36+00:00","modified_at":"2026-11-06T10:16:36+00:00","first_seen_at":"2026-11-06T10:40:56+00:00","fetched_at":"2026-11-06T10:40:56+00:00","note":null}],"documents":[{"id":85513,"url":"https://github.com/nodejs/undici/security/advisories/GHSA-r4pc-4jcp-7pqc","title":"Vendor advisory: github.com","kind":"vendor","source":"nvd","publisher":"vendor","text":null,"published_at":"2026-11-05T10:27:40+00:00","relation":"advisory","confidence":null,"note":"Vendor advisory: github.com"}],"exploit_sources":[],"notice":"Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai"}