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/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
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
Lifecycle Timeline
2DescriptionCVE.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.
AnalysisAI
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.
Technical ContextAI
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.
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.
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
Same technique Denial Of Service
View allShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-51917