{ "dataType": "CVE_RECORD", "dataVersion": "5.2", "cveMetadata": { "cveId": "CVE-2026-117666", "assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db", "state": "PUBLISHED", "assignerShortName": "EEF", "dateReserved": "2026-10-30T10:00:01.681Z", "datePublished": "2026-10-30T20:22:16.466Z", "dateUpdated": "2026-10-30T20:22:16.466Z" }, "containers": { "cna": { "affected": [ { "collectionURL": "https://repo.hex.pm", "cpes": [ "cpe:2.3:a:deadtrickster:ssl_verify_fun:*:*:*:*:*:*:*:*" ], "defaultStatus": "unaffected", "modules": [ "ssl_verify_hostname" ], "packageName": "ssl_verify_fun", "packageURL": "pkg:hex/ssl_verify_fun", "product": "ssl_verify_fun", "programFiles": [ "src/ssl_verify_hostname.erl" ], "programRoutines": [ { "name": "ssl_verify_hostname:try_match_wildcard/4" }, { "name": "ssl_verify_hostname:try_match_hostname/2" }, { "name": "ssl_verify_hostname:verify_cert_hostname/2" }, { "name": "ssl_verify_hostname:verify_fun/3" } ], "repo": "https://github.com/deadtrickster/ssl_verify_fun.erl", "vendor": "deadtrickster", "versions": [ { "lessThan": "1.1.8", "status": "affected", "version": "1.0.1", "versionType": "semver" } ] }, { "collectionURL": "https://github.com", "cpes": [ "cpe:2.3:a:deadtrickster:ssl_verify_fun:*:*:*:*:*:*:*:*" ], "defaultStatus": "unaffected", "modules": [ "ssl_verify_hostname" ], "packageName": "deadtrickster/ssl_verify_fun.erl", "packageURL": "pkg:github/deadtrickster/ssl_verify_fun.erl", "product": "ssl_verify_fun", "programFiles": [ "src/ssl_verify_hostname.erl" ], "programRoutines": [ { "name": "ssl_verify_hostname:try_match_wildcard/4" }, { "name": "ssl_verify_hostname:try_match_hostname/2" }, { "name": "ssl_verify_hostname:verify_cert_hostname/2" }, { "name": "ssl_verify_hostname:verify_fun/3" } ], "repo": "https://github.com/deadtrickster/ssl_verify_fun.erl", "vendor": "deadtrickster", "versions": [ { "lessThan": "ca34031299cd2e0c98794c0da4ba556b94e39aad", "status": "affected", "version": "a49ca56923356c7a3981692b23c42ef32c2990e0", "versionType": "git" } ] } ], "configurations": [ { "lang": "en", "supportingMedia": [ { "base64": false, "type": "text/html", "value": "

ssl_verify_fun decides the outcome only where it is the sole hostname check. Erlang/OTP 20.0 and later verify the hostname in ssl before the user verify_fun is called with valid_peer, as long as server_name_indication is a hostname or the connection was upgraded from a socket. A deployment is exposed when it sets {server_name_indication, disable}, when a TLS server uses ssl_verify_hostname:verify_fun/3 to verify client certificates, when it calls ssl_verify_hostname:verify_cert_hostname/2 directly, or when it runs Erlang/OTP older than 20.0. The attacker also needs a certificate with a partial-label wildcard from a CA the client trusts, which the CA/Browser Forum Baseline Requirements do not allow, so the realistic exposure is private PKI.

" }, { "base64": false, "type": "text/markdown", "value": "ssl_verify_fun decides the outcome only where it is the sole hostname check. Erlang/OTP 20.0 and later verify the hostname in `ssl` before the user `verify_fun` is called with `valid_peer`, as long as `server_name_indication` is a hostname or the connection was upgraded from a socket. A deployment is exposed when it sets `{server_name_indication, disable}`, when a TLS server uses `ssl_verify_hostname:verify_fun/3` to verify client certificates, when it calls `ssl_verify_hostname:verify_cert_hostname/2` directly, or when it runs Erlang/OTP older than 20.0. The attacker also needs a certificate with a partial-label wildcard from a CA the client trusts, which the CA/Browser Forum Baseline Requirements do not allow, so the realistic exposure is private PKI." } ], "value": "ssl_verify_fun decides the outcome only where it is the sole hostname check. Erlang/OTP 20.0 and later verify the hostname in ssl before the user verify_fun is called with valid_peer, as long as server_name_indication is a hostname or the connection was upgraded from a socket. A deployment is exposed when it sets {server_name_indication, disable}, when a TLS server uses ssl_verify_hostname:verify_fun/3 to verify client certificates, when it calls ssl_verify_hostname:verify_cert_hostname/2 directly, or when it runs Erlang/OTP older than 20.0. The attacker also needs a certificate with a partial-label wildcard from a CA the client trusts, which the CA/Browser Forum Baseline Requirements do not allow, so the realistic exposure is private PKI." } ], "cpeApplicability": [ { "nodes": [ { "cpeMatch": [ { "criteria": "cpe:2.3:a:deadtrickster:ssl_verify_fun:*:*:*:*:*:*:*:*", "versionEndExcluding": "1.1.8", "versionStartIncluding": "1.0.1", "vulnerable": true } ], "negate": false, "operator": "OR" } ], "operator": "AND" } ], "credits": [ { "lang": "en", "type": "finder", "value": "Andrew Moore" }, { "lang": "en", "type": "finder", "value": "Martin Karrer" }, { "lang": "en", "type": "reporter", "value": "Andrew Moore" }, { "lang": "en", "type": "remediation developer", "value": "Martin Karrer" }, { "lang": "en", "type": "remediation developer", "value": "deadtrickster" }, { "lang": "en", "type": "coordinator", "value": "Jonatan Männchen / EEF" } ], "dateAssigned": "2026-10-30T10:26:35.000Z", "descriptions": [ { "lang": "en", "supportingMedia": [ { "base64": false, "type": "text/html", "value": "

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

Erlang/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

This issue affects ssl_verify_fun: from 1.0.1 before 1.1.8.

" }, { "base64": false, "type": "text/markdown", "value": "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." } ], "value": "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." } ], "impacts": [ { "capecId": "CAPEC-94", "descriptions": [ { "lang": "en", "supportingMedia": [ { "base64": false, "type": "text/html", "value": "

A holder of a certificate for f*.example.net from a CA the client trusts can impersonate any host named f.<label>.example.net to a client that relies on ssl_verify_fun alone for hostname verification, and read or alter the traffic of that connection.

" }, { "base64": false, "type": "text/markdown", "value": "A holder of a certificate for `f*.example.net` from a CA the client trusts can impersonate any host named `f.