{"id":"CVE-2026-123872","kind":"vulnerability","aliases":["CVE-2026-123872"],"related":[],"title":"Node.js TLS: client certificate check bypassed by changing servername during renegotiation","description":"A client certificate authentication bypass in Node.js TLS lets a client change the servername during TLS 1.2 renegotiation to reach endpoints it was not authorized for. On a server that applies different client-certificate policies per hostname, for example stricter admin-only client-cert auth on one host and ordinary client-cert auth on another, a client that authenticates for a permitted host can renegotiate the TLS 1.2 connection under a different servername and carry its existing authentication to the protected host, bypassing the stricter policy. This vulnerability affects Node.js 26.x, 24.x, and 22.x.","summary":"Node.js TLS lets a client switch the servername during a TLS 1.2 renegotiation, so an authenticated connection can reach a host with stricter client-certificate rules. An attacker gets access to endpoints it was not authorized for.","severity":"high","cvss":8.1,"epss":null,"exploited":false,"exploited_at":null,"products":[{"name":"node","fixed":["22.23.5","24.22.3","26.13.1"],"affected":">= 22.0.0, < 22.23.5 || >= 24.0.0, < 24.22.3 || >= 26.0.0, < 26.13.1","ecosystem":"vendor"}],"ecosystems":[],"tags":["mutual-tls","node.js","runtime","self-hosted","tls"],"not_affected_if":["no-client-certs","single-policy","tls-1.3-only"],"how_to_check":"- Run node --version; vulnerable if below 22.23.5 (22.x), 24.22.3 (24.x) or 26.13.1 (26.x).\n- Then look for a Node.js TLS server (tls.createServer, https.createServer, server.addContext) that applies different client-certificate policies per hostname (requestCert/rejectUnauthorized, different CA per SNI host). Only TLS 1.2 connections can renegotiate; TLS 1.3 does not support renegotiation.\n- Also check CVE-2026-123867 (same release): a per-host client CA set with addContext and no server certificate falls back to the default CA.","fix":"Upgrade Node.js to 22.23.5 (22.x), 24.22.3 (24.x) or 26.13.1 (26.x). Per the 24.22.3 release notes, the fix stops TLS renegotiation and HelloRetryRequest from changing the SNI, and stops TLS resumption from changing it.","status":"open","published_at":"2026-11-11T19:17:34+00:00","first_seen_at":"2026-11-11T19:28:45+00:00","triaged_at":"2026-11-11T19:29:55+00:00","updated_at":"2026-11-11T19:32:09+00:00","category":"runtime","confidence":0.9,"triage":{"at":"2026-11-11T19:29:55Z","model":"claude-haiku-5-5","output":{"fix":"unknown","reach":"network","title":"Node.js TLS: client certificate check bypassed by changing servername during renegotiation","impact":"high","summary":"Node.js TLS lets a client switch the servername during a TLS 1.2 renegotiation, so an authenticated connection can reach a host with stricter client-certificate rules. An attacker gets access to endpoints it was not authorized for.","audience":"businesses","category":"runtime","nicknames":[],"who_cares":["node.js","tls","mutual-tls"],"confidence":0.6,"fix_status":"unknown","needs_auth":"yes","worst_case":"Client reaches admin-only hosts it should not access","analyst_note":"Confirm the fixed Node.js versions for 22.x, 24.x and 26.x from the nvd entry or the Node.js security release notes; sources did not state a fix.","how_to_check":"- Run `node --version` and compare against the affected lines 22.x, 24.x and 26.x\n- Look for servers using `tls` or `https` with per-hostname client-certificate policies (SNI-based `requestCert` or `rejectUnauthorized` logic)\n- unknown for anything else the sources do not say","plain_action":"","product_name":"","needs_analyst":true,"not_affected_if":["single-policy","no-client-certs"],"who_is_affected":"Only servers running Node.js 22.x, 24.x or 26.x that apply different client-certificate policies to different hostnames on the same TLS setup are exposed. A server with one client-certificate policy for all hostnames, or with no client-certificate auth, is not affected by the bypass described in the sources.","user_interaction":"no","product_ecosystem":"","needs_special_setup":"yes","severity_if_unknown":"high"},"cost_usd":0.000759,"input_tokens":4647,"output_tokens":589,"severity_before":"high"},"analyst_status":"done","analyst_note":"Confirm the fixed Node.js versions for 22.x, 24.x and 26.x from the nvd entry or the Node.js security release notes; sources did not state a fix.","search":"'-123872':14A,17A '-2026':13A,16A '1.2':39B,81C,136C '22':164C '24':161C '26':159C 'access':58B 'admin':107C 'admin-on':106C 'affect':157C 'anoth':123C 'appli':95C 'attack':56B 'auth':112C,121C 'authent':43B,68C,127C,146C 'author':64B,89C 'bypass':6A,69C,151C 'carri':143C 'cert':111C,120C 'certif':4A,53B,67C,99C 'chang':8A,76C 'check':5A 'client':3A,32B,52B,66C,75C,98C,110C,119C,125C 'client-cert':109C,118C 'client-certif':51B,97C 'connect':44B,137C 'cve':12A,15A 'differ':96C,140C 'endpoint':60B,85C 'exampl':104C 'exist':145C 'get':57B 'host':26B,48B,115C,131C,150C 'hostnam':102C 'let':30B,73C 'mutual':20B 'mutual-tl':19B 'node':18A 'node.js':1A,22B,28B,71C,158C 'one':114C 'ordinari':117C 'per':101C 'permit':130C 'polici':100C,154C 'protect':149C 'reach':46B,84C 'renegoti':11A,40B,82C,133C 'rule':54B 'runtim':23B 'self':25B 'self-host':24B 'server':93C 'servernam':9A,35B,78C,141C 'stricter':50B,105C,153C 'switch':33B 'tls':2A,21B,27B,29B,38B,72C,80C,135C 'vulner':156C 'x':160C,162C,165C","nicknames":[],"mitigations":[],"who_affected":"Node.js 22.x, 24.x and 26.x servers that use mutual TLS with different client-certificate policies per hostname (for example an admin-only host and an ordinary host on one listener). A client authenticated for the permitted host can renegotiate under another servername over TLS 1.2 and carry its authentication to the stricter host. Servers with a single client-cert policy or no client certificates can skip it.","tier":"B","verified":{"fix":{"at":"2026-11-11T19:32:09Z","by":"analyst","doc":"https://nodejs.org/en/blog/release/v24.22.3","run_id":3586},"products":{"at":"2026-11-11T19:32:09Z","by":"analyst","doc":"https://nodejs.org/en/blog/release/v24.22.3","run_id":3586}},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"pkeys":["node"],"ptokens":["node"],"labels":["high","mutualtls","nodejs","runtime","selfhosted","tls"],"campaign_type":null,"search_a":"'-123872':14A,17A '-2026':13A,16A 'bypass':6A 'certif':4A 'chang':8A 'check':5A 'client':3A 'cve':12A,15A 'node':18A 'node.js':1A 'renegoti':11A 'servernam':9A 'tls':2A","search_b":"'1.2':39B 'access':58B 'attack':56B 'authent':43B 'author':64B 'certif':53B 'client':32B,52B 'client-certif':51B 'connect':44B 'endpoint':60B 'get':57B 'host':26B,48B 'let':30B 'mutual':20B 'mutual-tl':19B 'node.js':22B,28B 'reach':46B 'renegoti':40B 'rule':54B 'runtim':23B 'self':25B 'self-host':24B 'servernam':35B 'stricter':50B 'switch':33B 'tls':21B,27B,29B,38B","search_c":"'1.2':81C,136C '22':164C '24':161C '26':159C 'admin':107C 'admin-on':106C 'affect':157C 'anoth':123C 'appli':95C 'auth':112C,121C 'authent':68C,127C,146C 'author':89C 'bypass':69C,151C 'carri':143C 'cert':111C,120C 'certif':67C,99C 'chang':76C 'client':66C,75C,98C,110C,119C,125C 'client-cert':109C,118C 'client-certif':97C 'connect':137C 'differ':96C,140C 'endpoint':85C 'exampl':104C 'exist':145C 'host':115C,131C,150C 'hostnam':102C 'let':73C 'node.js':71C,158C 'one':114C 'ordinari':117C 'per':101C 'permit':130C 'polici':100C,154C 'protect':149C 'reach':84C 'renegoti':82C,133C 'server':93C 'servernam':78C,141C 'stricter':105C,153C 'tls':72C,80C,135C 'vulner':156C 'x':160C,162C,165C","cause_entry":null,"cause_path":null,"disclosures_checked_at":null,"first_public_at":"2026-11-03T23:00:00+00:00","kev":null,"cvss_vector":"CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N","cvss_by":"ce714d77-add3-4f53-aff5-83d477b104bb","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-123872","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-123872","severity":null,"published_at":"2026-11-11T19:17:34+00:00","modified_at":"2026-11-11T19:17:34+00:00","first_seen_at":"2026-11-11T19:28:45+00:00","fetched_at":"2026-11-11T19:28:45+00:00","note":null},{"source":"analyst","external_id":"CVE-2026-123872:3586","url":"https://nodejs.org/en/blog/release/v24.22.3","severity":null,"published_at":"2026-11-11T19:32:09+00:00","modified_at":"2026-11-11T19:32:09+00:00","first_seen_at":"2026-11-11T19:32:09+00:00","fetched_at":"2026-11-11T19:32:09+00:00","note":"Fixed versions read on the Node.js Nov 11 2026 security release page and 24.22.3 release notes; no exploitation or PoC seen, X/discussion search skipped (low-profile B). Reporter pimterry.","cites":["https://nodejs.org/en/blog/release/v24.22.3"]}],"documents":[{"id":65753,"url":"https://nodejs.org/en/blog/vulnerability/november-2026-security-releases","title":"Node.js November 11, 2026 Security Releases","kind":"advisory","source":"advisory","publisher":null,"text":"Wednesday, November 11, 2026 Security Releases","published_at":"2026-11-03T23:00:00+00:00","relation":"advisory","confidence":null,"note":null},{"id":128317,"url":"https://nodejs.org/en/blog/release/v24.22.3","title":"Node.js 24.22.3 (LTS)","kind":"release","source":"analyst","publisher":null,"text":null,"published_at":null,"relation":"fix","confidence":null,"note":null}],"disclosures":[],"exploit_sources":[],"notice":"Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai"}