Skip to main content

esaml EUVDEUVD-2026-108051

| CVE-2026-86696 HIGH
Allocation of Resources Without Limits or Throttling (CWE-770)
2026-10-22 EEF GHSA-5rc7-wrfq-2h25
8.2
CVSS 4.0 · Vendor: EEF
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Locate SAML single-logout endpoint
  2. Exploit
    Post unsigned LogoutResponses with unique status URNs
  3. Execution
    Mint permanent atoms via list_to_atom/1
  4. Impact
    Exhaust atom table and crash Erlang node

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V2 - Validation and Business Logic Resource allocation limits
MITRE ATT&CK

1 technique across 1 tactic: Impact

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Exploitation requires the target to deploy esaml as a SAML Service Provider with a reachable single-logout (SLO) endpoint (e.g. the esaml_cowboy validate_logout handler) that routes LogoutResponse messages into esaml_sp:validate_logout_response/2 and esaml:decode_logout_response/1. The key enabling condition is that signature verification is NOT enforced on unsigned LogoutResponse messages, so the attacker does not need any valid IdP signature or credentials; messages with attacker-chosen, previously-unseen StatusCode URN values each create a new permanent atom via list_to_atom/1. The principal LIMITING factor is volume and time: the Erlang VM default atom-table ceiling (~1,048,576 entries) means the attacker must send on the order of a million requests with distinct status values to reach node abort (reflected as AT:P), and sites that raise/lower +t or front the SLO endpoint with rate limiting or WAF controls raise the bar further. Any esaml version from 0.1.0 up to the fix commit be692b5 on an affected fork is in scope.

Impact

This is a pure availability (denial-of-service) issue: the CNA-supplied CVSS 4.0 vector (CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N, base 8.2) shows network reach and no privileges/interaction (PR:N/UI:N), but critically carries AT:P - an attack requirement - and VC:N/VI:N with only VA:H, confirming no confidentiality or integrity exposure. The AT:P is the decisive signal: the Erlang VM atom table caps near ~1,048,576 entries, so the attacker must post on the order of one million distinct unsigned LogoutResponse status values before the node aborts, making this a volumetric effort rather than a single-shot crash. No EPSS score, CISA KEV entry, or public exploit was provided in the input, so exploitation status is 'no public exploit identified at time of analysis' and there is no evidence of active or opportunistic mass exploitation. Net: the 8.2 is legitimate for an unauthenticated network DoS, but it is availability-only against a niche Erlang SAML library and requires sustained high request volume, so it is a real but second-tier priority - patch promptly where esaml acts as an SP, but it is not a drop-everything confidentiality/RCE emergency. Note the CVSS is 4.0 only; no 3.1 vector or EPSS was supplied, so cross-signal comparison is limited to vector-plus-description reasoning.

Exploit ScenarioDerived

An unauthenticated attacker locates an internet-reachable SAML single-logout (SLO) endpoint served by an esaml-based Service Provider and repeatedly posts unsigned LogoutResponse messages, each carrying a different unrecognized StatusCode URN. Because validate_logout_response/2 only verifies a signature when one is present, each message reaches decode_logout_response/1 where status_code_map/1 calls list_to_atom/1 on a fresh URN segment, minting a permanent atom; after roughly a million distinct values the atom table fills and the Erlang node crashes. No public exploit code is identified at time of analysis, but the attack is scriptable and requires no special tooling.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
No patch listed yet 0.4% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Oct 22, 2026

Unauthenticated remote denial of service in the Erlang SAML library esaml (0.1.0 and later) allows an attacker to abort an Erlang node by exhausting its atom table through unsigned LogoutResponse messages posted to a Service Provider's single-logout endpoint. Because esaml_sp:validate_logout_response/2 only verifies a signature when one is present, an unsigned message reaches esaml:decode_logout_response/1, where status_code_map/1 converts each unrecognized StatusCode into a permanent atom with list_to_atom/1 - roughly one million distinct status values (the VM's default atom-table ceiling) are enough to crash the node. The CNA scored this CVSS 4.0 8.2 with the AT:P attack-requirement metric; the practical barrier is volume and time rather than skill, and no public exploit code or confirmed active exploitation was identified at time of analysis.

RemediationAI

Upstream fix available (PR/commit be692b56245071899757afa7ef47e43593d3de96 in dropbox/esaml, handnot2/esaml and arekinath/esaml); a released, tagged esaml version containing it is not independently confirmed, so pin your dependency to a commit at or after be692b5 and verify the resolved revision in rebar.lock or mix.lock. If you cannot patch immediately, the highest-value control is to stop unauthenticated LogoutResponse messages from reaching esaml:decode_logout_response/1: disable the single-logout endpoint entirely if your IdP integration does not require SLO (side effect: IdP-initiated global logout stops working, sessions must expire by timeout), or restrict the SLO path at the reverse proxy/WAF to the known IdP source addresses and reject requests lacking a ds:Signature element (side effect: legitimate unsigned IdP responses, which the library currently tolerates, will be refused - confirm your IdP always signs LogoutResponses). Add per-source rate limiting on the SLO route to make the ~1,000,000-request atom-exhaustion volume impractical, and raise the VM atom ceiling with +t (e.g. +t 2000000) as a stopgap - note this only defers the abort and increases memory footprint, so it must not replace patching. Monitor erlang:system_info(atom_count) against erlang:system_info(atom_limit) and alert on abnormal growth or on spikes of distinct StatusCode values at the SLO endpoint. Refer to https://cna.erlef.org/cves/CVE-2026-86696.html and https://osv.dev/vulnerability/EEF-CVE-2026-86696 for the vendor-tracked fix guidance.

Affected VersionsENISA

esaml be692b56245071899757afa7ef47e43593d3de96 <*
esaml 0.1.0 <*

Affects your stack

Find out whether the stacks and servers you run are on an affected version.

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

esaml is a pure-Erlang SAML 2.0 toolkit (with esaml_cowboy providing Plug/Cowboy HTTP handlers) used by Service Providers and Identity Providers. The root cause is CWE-770 (Allocation of Resources Without Limits or Throttling): Erlang atoms are globally interned, never garbage-collected, and capped by the emulator's atom table (default ceiling ≈1,048,576 entries, tunable via the +t flag). In src/esaml.erl, status_code_map/1 takes the last colon-separated segment of an unrecognized SAML StatusCode URN and interns it via list_to_atom/1, so every distinct attacker-chosen value permanently consumes one atom slot. The reachability path is the single-logout flow: esaml_cowboy:validate_logout/2 parses the SAMLResponse query parameter and hands it to esaml_sp:validate_logout_response/2, whose previous logic checked the signature only when SP#esaml_sp.idp_signs_envelopes was set and otherwise returned {error, cannot_validate} in some branches - the updated code in commit be692b5 makes signature verification conditional on the presence of /samlp:LogoutResponse/ds:Signature, so unsigned responses are processed. The same commit also hardens related parsing paths (deflate handling in esaml_binding, namespace registration for xmldsig in esaml_sp, and cowboy_req state threading in esaml_cowboy:validate_logout/2), which is relevant because the atom-minting bug is reached through the logout-response decoding chain. Once the atom table is full, the VM aborts and every process on the node is lost; the flaw is purely availability-affecting (VC:N/VI:N/VA:H) with no data exposure or integrity impact.

Know when Esaml gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (EEF) PRIMARY 8.2 HIGH
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
vuln.today AI 5.9 MEDIUM

PR:N/UI:N since unsigned messages need no auth; AC:H because exhausting the ~1M-entry atom table demands a large volume of distinct requests; impact is availability-only (A:H, C:N/I:N).

3.1 AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H
4.0 AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N

Primary rating from Vendor (EEF).

CVSS VectorVendor: EEF

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
Present
Privileges Required
None
User Interaction
None
Vulnerable system: Confidentiality
None
Vulnerable system: Integrity
None
Vulnerable system: Availability
High
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

DescriptionCVE.org

Allocation of Resources Without Limits or Throttling vulnerability in esaml in dropbox esaml allows an unauthenticated attacker to exhaust the Erlang VM atom table and crash the node via unsigned LogoutResponse messages.

esaml:status_code_map/1 in src/esaml.erl maps any StatusCode value it does not recognize to an atom with list_to_atom/1 on the last colon-separated segment of the URN. esaml_sp:validate_logout_response/2 verifies a signature only when the message carries one, so an unsigned LogoutResponse posted to the single-logout endpoint reaches esaml:decode_logout_response/1 and mints one permanent atom per distinct status value. Atoms are never reclaimed and the VM caps the atom table at about one million entries, so an attacker who posts that many distinct values aborts the node.

This issue affects esaml: from 0.1.0 onward.

Executive ViewAI

Why It Matters

The Erlang SAML library esaml (0.1.0 and later) carries a denial-of-service flaw that can abort the Erlang node hosting a SAML Service Provider, taking down single sign-on for every application that depends on it. The weakness sits on a network-reachable single-logout endpoint and degrades availability of authentication infrastructure rather than exposing credentials or data, and no public exploit has been identified at time of analysis, though the barrier to abuse is sustained message volume rather than specialised skill. Leadership should care because a successful attempt converts a library-level defect into a broad, user-visible authentication outage whose recovery depends on restarting critical identity infrastructure.

Business Impact: High
Compensating Controls

No vendor-released patch identified at time of analysis. Interim mitigations: rate-limit and enforce signatures on the single-logout endpoint at a reverse proxy or WAF, reject unsigned LogoutResponse messages before they reach esaml's decoder, monitor Erlang atom-table growth and node restarts for early detection, and raise the VM atom-table ceiling (+t) as a temporary buffer only.

Threat Intelligence Overview

EPSS Score
0.4%
Top 63% exploitable
Prevalence
Low
niche Erlang/Elixir SAML SP library, limited to Erlang deployments
Social Media
1
Sightings
Data Quality
5 sources
Confidence: Medium

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS 0.4%
Patch available No
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation· derived
None
System Exposure· derived
Open
Automatable· derived
Yes
Human Impact
High

Priority Score

41
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +41
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy