# CVE-2026-59251: Denial of service via exponential certificate policy tree growth in path validation

Status: published. Published: 2026-07-27. Updated: 2026-11-11.

Allocation of resources without limits in Erlang/OTP public_key certificate path validation allows a remote unauthenticated attacker to cause denial of service by sending a crafted X.509 certificate chain during the TLS handshake.

During RFC 5280 policy processing in public_key:pkix_path_validation/3, the certificate policy tree maintained by pubkey_policy_tree grows without an upper bound. When a certificate chain contains M policies per certificate and K certificates, the tree grows on the order of M^K nodes because pubkey_policy_tree:add_leaves/2 and pubkey_policy_tree:add_leaf_siblings/2 extend the tree per policy per certificate. A modest chain with many policies per certificate is enough to pin BEAM schedulers and exhaust the node's memory, taking down the entire VM. The attacker only needs to be able to present a certificate chain to the victim, which is the normal precondition for a TLS handshake, so exploitation succeeds against any incoming or outgoing TLS connection that validates the peer's chain (the default for SSL/TLS clients and mutual-TLS servers).

This is the same vulnerability class as OpenSSL's X509_verify_cert policy tree DoS.

This vulnerability is associated with program files lib/public_key/src/pubkey_policy_tree.erl and program routines pubkey_policy_tree:add_leaves/2 and pubkey_policy_tree:add_leaf_siblings/2.

This issue affects OTP from OTP 26.2 before OTP 27.3.4.15, OTP 28.5.0.4, and OTP 29.0.4, corresponding to public_key from 1.15 before 1.17.1.5, 1.20.3.4, and 1.21.4.

## Remediation

- fix: The reporting source identifies this reference as a patch. Check the advisory for affected versions and supported release branches. (source: CNA: EEF) — https://github.com/erlang/otp/commit/f8580fc117098c08165f46c26fd0750c5cfb2a90
- fix: The reporting source identifies this reference as a patch. Check the advisory for affected versions and supported release branches. (source: CNA: EEF) — https://github.com/erlang/otp/commit/f04c6bba38de1cf1b1836a7d9a9fbe239bd939e8

## Affected products and versions

- Erlang / OTP (otp): ≥ 26.2; < * (affected, otp); unaffected at 27.3.4.15; unaffected at 28.5.0.4; unaffected at 29.0.4. Source: CNA: EEF
- Erlang / OTP (public_key): ≥ 1.15; < * (affected, otp); unaffected at 1.17.1.5; unaffected at 1.20.3.4; unaffected at 1.21.4. Source: CNA: EEF
- Erlang / OTP (erlang/otp): ≥ 9d1dda7bad5a64b58c10a1554751689e94131a73; < * (affected, git); unaffected at f8580fc117098c08165f46c26fd0750c5cfb2a90; unaffected at f04c6bba38de1cf1b1836a7d9a9fbe239bd939e8. Source: CNA: EEF

## Severity and prioritization

- CVSS 4.0: 8.7 (high); CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:L; source: CNA: EEF

- CISA KEV: No listing in collected sources

- EPSS: 0.32% as of 2026-11-10; percentile 25.07%

- SSVC: exploitation none; automatable yes; technical impact partial; source ADP: CISA-ADP

- Weaknesses: CWE-770

## Exploit evidence

No exploit evidence in collected sources. This is not proof of no exploitation.

## References

- https://github.com/erlang/otp/security/advisories/GHSA-622p-qfh6-c352 (CNA: EEF; vendor-advisory, related)

- https://cna.erlef.org/cves/CVE-2026-59251.html (CNA: EEF; related)

- https://osv.dev/vulnerability/EEF-CVE-2026-59251 (CNA: EEF; related)

- https://www.erlang.org/doc/system/versions.html#order-of-versions (CNA: EEF; x_version-scheme)

- https://github.com/erlang/otp/commit/9d1dda7bad5a64b58c10a1554751689e94131a73 (CNA: EEF; related)

- https://github.com/erlang/otp/commit/f8580fc117098c08165f46c26fd0750c5cfb2a90 (CNA: EEF; patch)

- https://github.com/erlang/otp/commit/f04c6bba38de1cf1b1836a7d9a9fbe239bd939e8 (CNA: EEF; patch)

## Provenance

- CNA: EEF: https://www.cve.org/CVERecord?id=CVE-2026-59251; retrieved 2026-11-11; source updated 2026-11-11

- FIRST EPSS: https://api.first.org/data/v1/epss?cve=CVE-2026-59251; retrieved 2026-11-11; source updated Not reported

Revision: 3c82a95f7de40405e2fb335c317bbed7584d1b51866ec98cfd4066f6f345ed27

Canonical: https://y2.dev/cve/CVE-2026-59251

## Agent and API access

Public CVE pages, Markdown, and JSON are free to read without an account or API key.

- Public catalog: https://y2.dev/cve/index.json. Follow nextCursor with the same search, filters, sort, and limit (1–100). A null cursor marks the end.

- WebMCP: search_cve_disclosures, get_cve_disclosure, get_cve_page_markdown, get_y2_cve_access. Available in compatible browsers.

- Cyber API: https://api.y2.dev/api/v2/cyber/cves and https://api.y2.dev/api/v2/cyber/cves/{cveId}.

- Y2 Pro or Elite: create a workspace API key with the intel:cyber scope and send Authorization: Bearer <Y2_API_KEY>. Setup: https://y2.dev/docs/api/create-key.

- x402: Pay per request without an account or API key. Omit Authorization, read the HTTP 402 PAYMENT-REQUIRED challenge, validate its current requirements, and retry with PAYMENT-SIGNATURE through an authorized payment client. These browser tools never make payments. Guide: https://y2.dev/docs/api/x402.

- OpenAPI: https://y2.dev/api/openapi.yaml. Agent access metadata: https://y2.dev/cve/agent.json.

Collected public records only. Check source status for coverage and freshness.