---
id: "CVE-2026-105270"
kind: "vulnerability"
aliases: ["CVE-2026-105270"]
title: "esaml: crafted SAMLResponse exhausts Erlang atom table and crashes node"
severity: "high"
cvss: 8.7
epss: 0.00344
exploited: false
status: "open"
category: "package"
products: [{"name": "esaml", "fixed": [], "affected": ">= 0.1.0", "ecosystem": "hex"}]
ecosystems: ["hex"]
tags: ["denial-of-service", "elixir", "erlang", "esaml", "package", "saml-sso"]
not_affected_if: ["esaml-not-used", "no-saml-endpoints", "saml-endpoints-not-public"]
published_at: "2026-10-22T07:16:40+00:00"
first_seen_at: "2026-10-23T21:57:30+00:00"
updated_at: "2026-10-24T07:15:52+00:00"
sources: [{"source": "nvd", "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-105270", "first_seen_at": "2026-10-23T21:57:30+00:00"}, {"source": "analyst", "url": null, "first_seen_at": "2026-10-23T23:44:13+00:00"}, {"source": "epss", "url": "https://api.first.org/data/v1/epss?cve=CVE-2026-105270", "first_seen_at": "2026-10-24T07:15:52+00:00"}]
---

# esaml: crafted SAMLResponse exhausts Erlang atom table and crashes node

esaml (Erlang SAML SP library, forks dropbox, arekinath and handnot2) parses the unauthenticated SAMLResponse with xmerl_scan:string/2 in esaml_binding:decode_response/2, before any signature check. xmerl turns every element, attribute and prefix name into a permanent atom. A document of about 33 KB with 10,000 distinct names adds 10,000 atoms, and a few dozen requests reach the roughly 1M atom limit and abort the BEAM node. The ACS and single-logout endpoints in esaml_cowboy are both reachable. Credit: Quinn Wilton. CVSS 4.0 8.7, CWE-770. The CNA lists no fix and no workaround.

_Summary, check and fix written by a model from the sources; labelled as such._

## Affected

- hex:esaml affected >= 0.1.0 fixed ?

## How to check

Check whether esaml is a dependency: grep esaml in rebar.lock or mix.lock, or run rebar3 tree / mix deps.tree. Every version from 0.1.0 up is affected, including 4.6.0, the latest on Hex. You are exposed if a public route calls esaml_cowboy:validate_assertion/2 or validate_logout/2, or esaml_binding:decode_response/2, on unauthenticated requests.

## Fix

No patched release is published yet (unknown). Watch the Hex advisory page and the esaml repos for a fix. Mitigations are my suggestion, not from the vendor. Rate-limit and size-limit the ACS and SLO endpoints, or put them behind a WAF. Run the node with a higher +t atom limit and a supervisor or heartbeat that restarts it. Pre-parse with a safe parser, such as one that does not create atoms, before calling esaml. Monitor erlang:system_info(atom_count).

## Timeline

- 2026-10-23T21:57:30+00:00 nvd https://nvd.nist.gov/vuln/detail/CVE-2026-105270
- 2026-10-23T23:44:13+00:00 analyst — Read EEF CNA advisory and Hex advisory page: no fixed release published as of 2026-10-22; Hex latest 4.6.0 (Jan 2024) is flagged vulnerable. No public exploitation seen; the advisory describes a PoC recipe but links no code. Did not search social posts.
- 2026-10-24T07:15:52+00:00 epss https://api.first.org/data/v1/epss?cve=CVE-2026-105270

## Documents

- [advisory] EEF CNA: CVE-2026-105270 esaml atom table exhaustion https://cna.erlef.org/cves/CVE-2026-105270.html
- [advisory] Hex advisories for esaml https://hex.pm/packages/esaml/advisories

## From the sources

Allocation of Resources Without Limits or Throttling vulnerability in esaml_binding in dropbox esaml allows an unauthenticated attacker to exhaust the Erlang VM atom table and crash the node via a crafted SAMLResponse.

esaml_binding:decode_response/2 parses the decoded SAMLResponse with xmerl_scan:string/2, which interns every element name, attribute name, and namespace prefix it reads as a permanent atom. The SAML consume (ACS) and single-logout endpoints call it on unauthenticated requests before any signature check, so one well-formed document with thousands of distinct names mints thousands of atoms while staying inside the 128 KB request body limit. Atoms are never reclaimed and the VM caps the atom table at about one million entries, so a few dozen requests abort the node.

This issue affects esaml: from 0.1.0 onward.

---

_Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai_
