{"id":"CVE-2026-117666","title":"ssl_verify_fun: partial-label wildcard certificate matches hostnames across a label boundary","summary":"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…","severity":"critical","cvss":9.1,"cvssVector":"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","cvssSource":"cna","cwe":["CWE-297"],"vendor":"deadtrickster","product":"ssl_verify_fun","affected":["ssl_verify_fun >= 1.0.1 < 1.1.8","deadtrickster/ssl_verify_fun.erl >= a49ca56923356c7a3981692b23c42ef32c2990e0 < ca34031299cd2e0c98794c0da4ba556b94e39aad"],"ssvc":{"exploitation":"none","automatable":"no","technicalImpact":"total","timestamp":"2026-11-06T16:02:35.597989Z"},"published":"2026-10-30","updated":"2026-11-06","sourceUpdated":"2026-11-06T16:02:49.781Z","source":"CVEORG","sourceUrl":"https://www.cve.org/CVERecord?id=CVE-2026-117666","references":[{"url":"https://github.com/deadtrickster/ssl_verify_fun.erl/security/advisories/GHSA-7gw2-hphm-c5px","label":"ssl_verify_fun: partial-label wildcard certificate matches hostnames across a label boundary"},{"url":"https://cna.erlef.org/cves/CVE-2026-117666.html","label":"EEF CNA record for CVE-2026-117666"},{"url":"https://osv.dev/vulnerability/EEF-CVE-2026-117666","label":"OSV record EEF-CVE-2026-117666"},{"url":"https://github.com/deadtrickster/ssl_verify_fun.erl/pull/33","label":"Do not let partial-label wildcards match across label boundaries (ssl_verify_fun.erl pull request #33)"},{"url":"https://github.com/deadtrickster/ssl_verify_fun.erl/commit/a49ca56923356c7a3981692b23c42ef32c2990e0","label":"Introducing commit a49ca56 in deadtrickster/ssl_verify_fun.erl"},{"url":"https://github.com/deadtrickster/ssl_verify_fun.erl/commit/ca34031299cd2e0c98794c0da4ba556b94e39aad","label":"Fix commit ca34031 in deadtrickster/ssl_verify_fun.erl"}],"tags":["cve.org"],"epss":0.0019,"epssPercentile":0.08667,"ingestedAt":"2026-11-05T16:24:31.460Z","slug":"CVE-2026-117666","body":"## Overview\n\nImproper 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.\n\n## Affected\n\n- `ssl_verify_fun >= 1.0.1 < 1.1.8`\n- `deadtrickster/ssl_verify_fun.erl >= a49ca56923356c7a3981692b23c42ef32c2990e0 < ca34031299cd2e0c98794c0da4ba556b94e39aad`\n\n## Remediation\n\nRefer to the linked advisories for vendor-supplied fixes and affected version ranges.\n\n### Workarounds\n\nOn Erlang/OTP 21 or later, keep server_name_indication set to the target hostname and pass {customize_hostname_check, [{match_fun, public_key:pkix_verify_hostname_match_fun(https)}]} in the ssl options. The hostname check in ssl then rejects the mismatch before ssl_verify_fun runs, and legitimate wildcard certificates continue to match. hackney and tls_certificate_check already set both options.","depth":"midnight","depthScore":50,"depthScoreParts":{"impact":50.1,"likelihood":0,"exploitation":0,"ransomware":0},"changes":[]}