Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessIdentify endpoint passing request body to encode_permissions!/1
-
DeliveryCraft permission map with novel string keys and integer values
-
ExploitSend high-volume requests with unique keys
-
ExecutionString.to_atom/1 interns each key as permanent BEAM atom
-
PersistBEAM atom table (≈1M slots) exhausted
-
ImpactVM crashes, all node services unavailable
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 that the target application passes a permissions map containing at least one key with an integer value to encode_permissions!/1 or encode_permissions_into_claims!/2, and that the keys of that map are at least partially controlled by the attacker. The critical enabling condition is the integer-value code path in do_encode_permissions!/2: only keys whose values are integers bypass the existing validation and proceed directly to String.to_atom/1 without an allowlist check. Applications that exclusively pass statically constructed, server-side permission maps with atom or string keys from a known set are not exploitable, because those keys would already exist in the atom table. What limits exploitation: the application must be using the Guardian.Permissions mixin and must have an externally reachable code path that feeds attacker-influenced keys with integer values into encode_permissions!/1; the CVSS 4.0 AT:P metric reflects this prerequisite. The CVSS 4.0 PR:N indicates no authentication is required at the Guardian level once the endpoint is reachable, but the endpoint itself may have its own authentication controls depending on the application. |
| Impact | The provided CVSS 4.0 base score of 6.9 with vector AV:L/AC:L/AT:P/PR:N/UI:N reflects a moderate-severity finding, but the AV:L (local) designation warrants scrutiny: the CVE description explicitly cites a network-accessible path ('a permissions map read from a request body and passed into token issuance via encode_permissions_into_claims!/2'), which would normally map to AV:N. The AT:P (attack requirements present) metric correctly captures the prerequisite that the application must pass externally influenced data to encode_permissions!/1 - not all Guardian deployments will do this. The practical risk therefore depends heavily on whether a given application exposes an endpoint that feeds user-controlled keys into token issuance. Where such an endpoint exists, the attack is straightforward and automatable: any number of unique string keys per request permanently consumes atom slots, and approximately one million unique requests suffice to crash a default-configured BEAM node. The impact is catastrophic for availability (VA:H, SA:H) because the BEAM process model means a single crashed VM takes down every service, GenServer, or Supervisor tree running on that node. No EPSS score is provided; no KEV listing exists. The low attack complexity once the prerequisite is met, the zero-privilege requirement, and the catastrophic blast radius make this a genuine priority for applications that pass user-supplied permission maps into Guardian token issuance, despite the moderate aggregate CVSS score. |
| Exploit ScenarioDerived | An attacker identifies a Phoenix or Plug endpoint that reads a permissions map from the JSON request body and passes it directly into Guardian.encode_permissions_into_claims!/2 during token issuance. The attacker sends a high volume of POST requests, each containing a permissions map with hundreds of previously unseen string keys as the permission-set names. Each unique key causes Guardian to call String.to_atom/1, permanently consuming one BEAM atom-table slot. After roughly one million total unique keys have been submitted - achievable in minutes from a fast client - the BEAM node's atom table is exhausted, the VM crashes with an atom limit error, and the entire application including any background workers, schedulers, and co-hosted services becomes unavailable. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Aug 01, 2026
BEAM atom-table exhaustion in ueberauth Guardian 2.0.0-2.4.0 allows denial of service by crashing the entire Erlang/Elixir node and all co-hosted services. The Guardian.Permissions module's encode_permissions!/1 function, installed on every module that invokes 'use Guardian.Permissions', unconditionally calls String.to_atom/1 on every key of a caller-supplied map before any validation. Because the integer-value clause of do_encode_permissions!/2 short-circuits to encoding without validating keys against the configured permission set, an attacker who can supply a permissions map with novel keys - for example via a request body fed into token issuance - permanently consumes BEAM atom-table slots at a rate bounded only by available request throughput. No public exploit or CISA KEV listing is identified at time of analysis; a vendor-released patch (2.4.1) is available.
RemediationAI
Upgrade ueberauth Guardian to version 2.4.1, which replaces the unsafe String.to_atom/1 call with a validated lookup against @normalized_perms followed by String.to_existing_atom/1, and introduces a PermissionNotFoundError for unrecognized keys. The fix commit is available at https://github.com/ueberauth/guardian/commit/8d4efbfc352d30f5fcfc75a4d69a795b0e472724 and the advisory is at https://github.com/ueberauth/guardian/security/advisories/GHSA-9qx2-v587-q3gg. For teams unable to patch immediately, the most effective compensating control is to audit every call site of encode_permissions!/1 and encode_permissions_into_claims!/2 and ensure that permission maps passed to these functions are constructed exclusively from server-side, allowlisted keys - never from raw user-supplied input. Enforcing an allowlist at the application boundary before the Guardian call eliminates the atom-minting path without requiring Guardian upgrade, but introduces maintenance risk if the allowlist diverges from Guardian's @normalized_perms. As a secondary control, rate-limiting endpoints that trigger token issuance can slow exhaustion but does not prevent it given sufficient time. BEAM-level monitoring of :erlang.system_info(:atom_count) relative to :erlang.system_info(:atom_limit) can provide early warning of table pressure.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Guardian (CPE cpe:2.3:a:ueberauth:guardian) is the dominant authentication/authorization library in the Elixir ecosystem, built on top of the BEAM (Bogdan/Björn's Erlang Abstract Machine). Atoms in Erlang/Elixir are interned string identifiers stored in a VM-global hash table with a hard default ceiling of approximately 1,048,576 entries; critically, atoms are never garbage collected by design, because they serve as stable compile-time and runtime identifiers. The safe API for converting strings to atoms from untrusted input is String.to_existing_atom/1, which raises ArgumentError if the atom does not already exist. The vulnerable code at lib/guardian/permissions.ex used String.to_atom/1 - which unconditionally mints a new atom - before checking the key against @normalized_perms. CWE-770 (Allocation of Resources Without Limits or Throttling) precisely characterizes the root cause: no rate limit, quota, or allowlist gate was applied to a resource (atom slots) that is both finite and non-reclaimable. The fix replaces String.to_atom with a pre-validation check against @normalized_perms followed by the safe String.to_existing_atom, and adds a PermissionNotFoundError raised for unrecognized keys.
Know when Guardian 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
CVSS:4.0/AV:L/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:H
AV:N because description explicitly cites request-body delivery; AC:H and S:C because exploitation requires the application to expose a Guardian permission-map endpoint to user input, and a successful crash takes down the entire BEAM node beyond the vulnerable component.
Primary rating from Vendor (EEF).
CVSS VectorVendor: EEF
DescriptionCVE.org
Allocation of Resources Without Limits or Throttling vulnerability in ueberauth guardian (Guardian.Permissions module) allows a denial of service via BEAM atom-table exhaustion.
This vulnerability is associated with program file lib/guardian/permissions.ex and program routines 'Elixir.Guardian.Permissions':encode_permissions!/1, 'Elixir.Guardian.Permissions':encode_permissions_into_claims!/2, 'Elixir.Guardian.Permissions':do_encode_permissions!/2.
The Guardian.Permissions mixin installs a public encode_permissions!/1 function on every module that does use Guardian.Permissions. For each key of the supplied map, encode_permissions!/1 calls String.to_atom(to_string(k)) before any validation runs. The integer-value clause of do_encode_permissions!/2 then short-circuits straight to encoding without validating the key against the configured permission set, so a key with an integer value is interned as a fresh atom with no exception raised. Atoms are never garbage collected and the BEAM atom table is a fixed-size resource (default roughly 1,048,576 entries), so each unique attacker-chosen key permanently consumes one slot. An attacker who can influence a permission map that reaches encode_permissions!/1 (for example a permissions map read from a request body and passed into token issuance via encode_permissions_into_claims!/2) can mint an unbounded number of atoms and exhaust the atom table, crashing the entire BEAM node and every service running on it. The sibling decode_permissions/1 is not affected because it skips keys absent from the configured permission set.
This issue affects guardian: from 2.0.0 before 2.4.1.
Threat Intelligence Overview
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.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.
OS command injection in Guardian language-system lets unauthenticated remote attackers run arbitrary shell commands by i
Remote code execution in Guardian language-system allows unauthenticated attackers to run arbitrary OS commands by injec
Unauthenticated SQL injection in Guardian Language System lets remote attackers manipulate the backend database by injec
Error-based SQL injection in Guardian Language-System allows a network-accessible authenticated attacker to extract the
SQL injection in Guardian Language-System's designer.php (line 124) allows attackers to extract, modify, or destroy the
Error-based SQL injection in Guardian language-system's subtitles.php exposes full database contents to low-privileged a
Error-based SQL injection in Guardian Language-System exposes the full database to low-privileged authenticated attacker
Error-based SQL injection in Guardian language-system's text_file.php exposes the full database to extraction via a triv
SQL injection in Guardian language-system's media.php endpoint allows low-privilege authenticated attackers to extract t
Nozomi Networks OS before 19.0.4 allows /#/network?tab=network_node_list.html CSV Injection. Rated high severity (CVSS 7
Nozomi Guardian before 19.0.4 allows attackers to achieve stored XSS (in the web front end) by leveraging the ability to
A SQL Injection vulnerability in Nozomi Networks Guardian and CMC, due to improper input validation in certain fields us
EUVD-2026-51917
NVD
CVE.org
EPSS
Vulnrichment
GitHub
VulDB
Exploit-DB