Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
ReconSend HTTP requests with unique key-parameter values
-
DeliveryGuardian.Plug routes key to Guardian.Plug.Keys.base_key/1
-
ExploitString.to_atom/1 interns one permanent atom per unique value
-
InstallRepeated requests fill BEAM atom table to ~1,048,576 limit
-
C2BEAM runtime raises out-of-atoms error
-
ExecuteNode process crashes
-
ImpactAll co-hosted applications denied service
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 application to pass an attacker-influenced binary as the key argument to any of the following functions: Guardian.Plug.current_token/2, Guardian.Plug.current_claims/2, Guardian.Plug.current_resource/2, or directly to Guardian.Plug.Keys.base_key/1, token_key/1, claims_key/1, or resource_key/1. The attacker-influenced value must vary across requests - sending the same key repeatedly has no effect because atoms are only interned once. Applications that use exclusively static, compile-time atom literals for the key parameter (the idiomatic default, e.g., key: :default) are not exploitable. No authentication is required: an unauthenticated HTTP endpoint is sufficient provided it routes request data into a Guardian key. The CVSS 4.0 AT:P metric confirms a specific application-level configuration prerequisite must be present; default Guardian deployments using only literal keys are not affected. |
| Impact | The provided CVSS 4.0 score of 6.9 with vector AV:L/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:H assigns a local attack vector, which is somewhat conservative relative to the described exploitation path: the attack is delivered via network HTTP requests, not local access. The AT:P (Attack Requirements: Present) correctly captures the prerequisite - the application must route user-controlled data into a Guardian key parameter. The VA:H and SA:H metrics reflect the full-node crash impact accurately, since BEAM node termination denies service to all co-hosted applications simultaneously. No EPSS data was provided. There is no CISA KEV listing and no confirmed public exploit code, which lowers urgency for environments where user input never reaches Guardian key functions. However, multi-tenant Phoenix applications or any service using dynamic key selection are genuinely at risk: the attack is not gated by authentication (PR:N), requires no special tooling beyond an HTTP client, and produces a full, unrecoverable node crash rather than a degraded-service condition. The discrepancy between AV:L in the provided vector and the network-delivered attack path described in the advisory warrants verification with the vendor, though AT:P constrains real-world exploitability regardless of attack vector classification. |
| Exploit ScenarioDerived | An attacker targeting a multi-tenant Phoenix application that derives the Guardian key from the HTTP request's tenant subdomain or X-Tenant-ID header sends a rapid stream of HTTP GET requests, each carrying a unique, previously unseen tenant string. Each distinct request causes Guardian.Plug.Keys.base_key/1 to call String.to_atom/1, permanently interning one new atom. After exhausting the remaining atom table capacity - which may require far fewer than 1,048,576 requests depending on existing atom usage - the BEAM runtime raises an out-of-atoms error, the node process terminates, and every application sharing that VM instance becomes immediately unavailable. No exploit code is required beyond a standard HTTP load tool with randomized header values. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Aug 01, 2026
Unbounded atom creation in Guardian.Plug.Keys allows any attacker who can route arbitrary string values through Guardian's key derivation functions to permanently exhaust the BEAM virtual machine's atom table, crashing the entire BEAM node and denying service to every application co-hosted on it. All guardian releases from 0.1.0 through 2.4.0 are affected whenever an application passes attacker-influenced data - a tenant identifier, HTTP header, or similar request value - as the key parameter to Guardian.Plug.current_token/2, current_claims/2, current_resource/2, or directly to Guardian.Plug.Keys functions. No public exploit code has been identified at time of analysis, though the attack mechanism is mechanically trivial given that it requires only a stream of distinct HTTP requests to a single vulnerable endpoint.
RemediationAI
Upgrade guardian to version 2.4.1 or later; the fix is delivered at commit 2952657e42e6341a67e6aaad09d8f0b40ae917cb and replaces all unsafe String.to_atom/1 calls on read paths with String.to_existing_atom/1. If an immediate upgrade is not feasible, audit every call site of Guardian.Plug.current_token/2, current_claims/2, current_resource/2, and any direct invocations of Guardian.Plug.Keys functions: ensure the key argument is always a hard-coded atom literal (e.g., :default, :admin) and never a variable derived from request data. As a targeted compensating control, add an explicit allowlist validation at application boundaries that restricts Guardian key values to a finite set of known atoms before they reach any Guardian function - for example, pattern-matching on an enumerated set of tenant identifiers and rejecting unknown values with a 400 or 404 response. This prevents atom creation without requiring an application rewrite. Note that this control must be applied at every entry point consistently; missing a single call site restores exposure. Vendor advisory: https://github.com/ueberauth/guardian/security/advisories/GHSA-xqch-c77q-rgh5.
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
The root cause is CWE-770 (Allocation of Resources Without Limits or Throttling) in the BEAM virtual machine's atom interning model. In Elixir and Erlang, atoms are interned strings stored in a process-global table with a default hard cap of approximately 1,048,576 entries; once allocated, atoms are never garbage collected. Guardian.Plug.Keys (lib/guardian/plug/keys.ex) used String.to_atom/1 unconditionally in base_key/1, claims_key/1, resource_key/1, token_key/1, and key_from_other/1 to convert caller-supplied strings into the atom-keyed identifiers required by Plug.Conn private storage. Because the public API declared String.t() as a valid argument type, passing a string - including one derived from request data - was documented, intended usage. Higher-level entry points such as Guardian.Plug.current_token(conn, key: key) threaded the caller-supplied key directly into these atom-creating functions without any validation. The fix at commit 2952657e replaces String.to_atom/1 with String.to_existing_atom/1 on all read paths (returning nil for unknown atoms rather than interning new ones), introduces bang variants (token_key!/1, claims_key!/1, resource_key!/1) that intern atoms only from developer-controlled write paths, and switches session and cookie name derivation to pure string helpers that require no atom at all. Affected CPE: cpe:2.3:a:ueberauth:guardian:*:*:*:*:*:*:*:*.
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
Network-delivered via HTTP but requires application to route user input to Guardian key functions (AC:H); BEAM node crash affects all co-hosted apps, changing scope (S:C); no confidentiality or integrity impact.
Primary rating from Vendor (EEF).
CVSS VectorVendor: EEF
DescriptionCVE.org
Allocation of Resources Without Limits or Throttling in ueberauth guardian allows denial of service via unbounded atom creation from attacker-influenced binary input.
Guardian.Plug.Keys derives connection and session namespace keys by passing arbitrary binaries to String.to_atom/1. base_key/1 in lib/guardian/plug/keys.ex converts any binary into the atom :"guardian_<input>", and the derived helpers claims_key/1, resource_key/1, and token_key/1 create a second atom on top of that. key_from_other/1 likewise converts a regex-captured binary through String.to_atom/1. The public specs advertise String.t() as a valid argument, so passing a string is documented usage, and higher-level entry points such as Guardian.Plug.current_token(conn, key: key) thread the caller-supplied key straight into these functions.
String.to_atom/1 creates a brand-new atom for every previously unseen binary, atoms are never garbage collected, and the BEAM atom table is fixed at roughly 1,048,576 entries by default. An application that routes attacker-influenced data (a tenant identifier, header, or other request input) into a Guardian key therefore mints one permanent atom per distinct value. A modest stream of varied, unauthenticated input permanently consumes the atom table and crashes the BEAM node, taking down every application running on it.
This issue affects guardian: from 0.1.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-51915
NVD
CVE.org
EPSS
Vulnrichment
GitHub
VulDB
Exploit-DB