{"id":"CVE-2026-117666","kind":"vulnerability","aliases":["CVE-2026-117666"],"related":[],"title":"ssl_verify_fun: partial wildcard certificates impersonate TLS peers in hostname checks","description":"Improper Validation of Certificate with Host Mismatch vulnerability in deadtrickster ssl_verify_fun allows an adversary in the middle to impersonate a TLS peer via a certificate that carries a partial-label wildcard. try_match_wildcard/4 in src/ssl_verify_hostname.erl anchors only the text before and after the * of an identifier such as f*.example.net, so the wildcard also consumes dots and the certificate is accepted for f.evil.example.net. RFC 6125 confines a wildcard to the left-most label. The same matcher lets *.168.1.1 match the IP literal 192.168.1.1. Whole-label wildcards are matched correctly.\n\nErlang/OTP 20.0 and later check the hostname in ssl before a user verify_fun sees valid_peer, so a client that keeps server_name_indication set rejects the mismatch regardless. Exposed are clients that disable SNI, servers that verify client certificate hostnames with this library, and direct callers of verify_cert_hostname/2.\n\nThis issue affects ssl_verify_fun: from 1.0.1 before 1.1.8.","summary":"ssl_verify_fun is an Erlang library that checks TLS certificate hostnames. A partial-label wildcard such as f*.example.net wrongly matches names like f.evil.example.net, so an attacker in the middle can impersonate a TLS peer.","severity":"critical","cvss":9.1,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["erlang","package","rebar3","ssl_verify_fun","tls"],"not_affected_if":["default-config","no-client-cert-hostname-check","sni-enabled-client"],"how_to_check":"- Look for the `ssl_verify_fun` dependency in your Erlang project's lock file or `rebar.lock`, and note its version.\n- Check whether clients disable SNI or servers verify client certificate hostnames with this library.\n- Check whether your code calls `verify_cert_hostname/2` directly.","fix":"- `ssl_verify_fun` `1.1.8` or later (fixed in versions from `1.0.1` before `1.1.8`)","status":"open","published_at":"2026-10-30T21:16:51+00:00","first_seen_at":"2026-10-30T21:25:52+00:00","triaged_at":"2026-10-30T21:26:28+00:00","updated_at":"2026-10-30T21:26:28+00:00","category":"package","confidence":0.8,"triage":{"at":"2026-10-30T21:26:28Z","model":"claude-haiku-5-5","output":{"fix":"- `ssl_verify_fun` `1.1.8` or later (fixed in versions from `1.0.1` before `1.1.8`)","reach":"network","title":"ssl_verify_fun: partial wildcard certificates impersonate TLS peers in hostname checks","impact":"high","summary":"ssl_verify_fun is an Erlang library that checks TLS certificate hostnames. A partial-label wildcard such as f*.example.net wrongly matches names like f.evil.example.net, so an attacker in the middle can impersonate a TLS peer.","audience":"developers","category":"package","nicknames":[],"who_cares":["erlang","ssl_verify_fun","tls","rebar3"],"confidence":0.8,"fix_status":"available","needs_auth":"no","worst_case":"attacker impersonates a TLS peer via a crafted wildcard certificate","analyst_note":"Confirm from the NVD entry or the upstream advisory whether a fix version beyond 1.1.8 exists and the exact affected range for non-SNI configurations.","how_to_check":"- Look for the `ssl_verify_fun` dependency in your Erlang project's lock file or `rebar.lock`, and note its version.\n- Check whether clients disable SNI or servers verify client certificate hostnames with this library.\n- Check whether your code calls `verify_cert_hostname/2` directly.","plain_action":"","needs_analyst":true,"not_affected_if":["default-config","sni-enabled-client","no-client-cert-hostname-check"],"who_is_affected":"Exposed are Erlang clients that disable SNI, servers that verify client certificate hostnames with this library, and code that calls verify_cert_hostname/2 directly. Erlang/OTP 20.0 and later check the hostname in ssl before the user verify_fun runs, so clients that keep server_name_indication set are protected regardless.","user_interaction":"no","needs_special_setup":"yes","severity_if_unknown":"critical"},"cost_usd":0.000781,"input_tokens":4409,"output_tokens":681,"severity_before":"critical"},"analyst_status":null,"analyst_note":null,"search":"'-117666':15A,18A '-2026':14A,17A '1.0.1':217C '1.1.8':219C '168.1.1':145C '192.168.1.1':150C '20.0':159C '6125':131C 'accept':127C 'adversari':78C 'affect':212C 'allow':76C 'also':120C 'anchor':102C 'attack':54B 'caller':205C 'carri':91C 'cert':208C 'certif':6A,36B,66C,89C,125C,198C 'check':12A,34B,162C 'client':177C,190C,197C 'confin':132C 'consum':121C 'correct':157C 'cve':13A,16A 'deadtrickst':72C 'direct':204C 'disabl':192C 'dot':122C 'erlang':19B,31B 'erlang/otp':158C 'example.net':46B,116C 'expos':188C 'f':45B,115C 'f.evil.example.net':51B,129C 'fun':3A,24B,28B,75C,171C,215C 'host':68C 'hostnam':11A,37B,164C,199C 'hostname/2':209C 'identifi':112C 'imperson':7A,59B,83C 'improp':63C 'indic':182C 'ip':148C 'issu':211C 'keep':179C 'label':41B,95C,140C,153C 'later':161C 'left':138C 'left-most':137C 'let':144C 'librari':32B,202C 'like':50B 'liter':149C 'match':48B,98C,146C,156C 'matcher':143C 'middl':57B,81C 'mismatch':69C,186C 'name':49B,181C 'packag':20B 'partial':4A,40B,94C 'partial-label':39B,93C 'peer':9A,62B,86C,174C 'rebar3':21B 'regardless':187C 'reject':184C 'rfc':130C 'see':172C 'server':180C,194C 'set':183C 'sni':193C 'src/ssl_verify_hostname.erl':101C 'ssl':1A,22B,26B,73C,166C,213C 'text':105C 'tls':8A,25B,35B,61B,85C 'tri':97C 'user':169C 'valid':64C,173C 'verifi':2A,23B,27B,74C,170C,196C,207C,214C 'via':87C 'vulner':70C 'whole':152C 'whole-label':151C 'wildcard':5A,42B,96C,119C,134C,154C 'wildcard/4':99C 'wrong':47B","nicknames":[],"mitigations":[],"who_affected":"Exposed are Erlang clients that disable SNI, servers that verify client certificate hostnames with this library, and code that calls verify_cert_hostname/2 directly. Erlang/OTP 20.0 and later check the hostname in ssl before the user verify_fun runs, so clients that keep server_name_indication set are protected regardless.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"first_public_at":"2026-10-30T21:16:51+00:00","kev":null,"cvss_vector":"CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:N/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":"6b3ad84c-e1a6-4bf7-a703-f496b71e49db","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-117666","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-117666","severity":null,"published_at":"2026-10-30T21:16:51+00:00","modified_at":"2026-10-30T21:16:51+00:00","first_seen_at":"2026-10-30T21:25:52+00:00","fetched_at":"2026-10-30T21:25: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"}