ZeroHour

CVE-2026-55734

PoC moderate

DoS via BEAM atom-table exhaustion in ueberauth Guardian (Guardian.Permissions)

CVSS 4.0
6.9 medium
EPSS
<1%p26
Published
()
Modified
AI analysis

CVE-2026-55734 is an allocation-of-resources-without-limits flaw (CWE-770) in the Guardian.Permissions module of the ueberauth guardian Elixir authentication library, affecting versions from 2.0.0 before 2.4.1. The mixin-installed public function encode_permissions!/1 calls String.to_atom(to_string(k)) on every key of the supplied permissions map before any validation runs, and the integer-value clause of do_encode_permissions!/2 short-circuits to encoding without checking the key against the configured permission set, so each unique attacker-chosen key is interned as a fresh BEAM atom. Because atoms are never garbage collected and the BEAM atom table is a fixed-size resource (default roughly 1,048,576 entries), an attacker who can influence a permissions map reaching encode_permissions!/1 or encode_permissions_into_claims!/2 — for example a map read from a request body and passed into token issuance — can mint unbounded atoms, exhaust the table, and crash the entire BEAM node along with every service co-hosted on it. Any Elixir/Erlang application using guardian from 2.0.0 before 2.4.1 that feeds attacker-influenceable data into this encoding path is affected; the sibling decode_permissions/1 is not affected because it skips keys absent from the configured permission set. No exploitation in the wild is currently known (not in CISA KEV; EPSS about 0.3%), but a public advisory with proof-of-concept details exists at GHSA-9qx2-v587-q3gg.

What to do: Upgrade guardian to 2.4.1 or later. Until patched, do not pass attacker-controlled maps directly into encode_permissions!/1 or encode_permissions_into_claims!/2 — validate keys against the configured permission set and cap the number of unique keys first — and monitor atom-table usage (e.g., :erlang.system_info(:atom_count)), since exhaustion takes down the entire BEAM node and all services on it. Note that decode_permissions/1 is unaffected and requires no change.

Affected
ueberauth guardian>= 2.0.0, < 2.4.1
Estimated exposure
moderate≈ thousands of production BEAM applications (order-of-magnitude estimate; no authoritative install counts provided) — No install-count data was supplied; the estimate is based on Guardian's standing as one of the most widely used JWT authentication libraries in the Elixir/Phoenix ecosystem — whose overall production footprint is on the order of thousands…

Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.

Description

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.

Vendors
ueberauth
Products
guardian
Weakness
CWE-770
Vector
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

In the news

No ingested article mentions this CVE yet.