---
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'
---

## Overview

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.

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.

This issue affects ssl_verify_fun: from 1.0.1 before 1.1.8.

## Affected

- `ssl_verify_fun >= 1.0.1 < 1.1.8`
- `deadtrickster/ssl_verify_fun.erl >= a49ca56923356c7a3981692b23c42ef32c2990e0 < ca34031299cd2e0c98794c0da4ba556b94e39aad`

## Remediation

Refer to the linked advisories for vendor-supplied fixes and affected version ranges.

### Workarounds

On 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.
