ZeroHour

CVE-2026-55733

PoC moderate

Unbounded atom creation DoS in ueberauth Guardian crashes BEAM nodes via AtomEncoding

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

CVE-2026-55733 is an uncontrolled resource consumption flaw (CWE-770) in the ueberauth Guardian authentication library for Elixir: Guardian.Permissions.AtomEncoding encodes permission scopes by passing each binary in the attacker-supplied scope list to String.to_atom/1 with no allow-list check against the application's defined permission names. Applications that opt into this non-default encoder (via use Guardian.Permissions, encoding: Guardian.Permissions.AtomEncoding) and funnel attacker-influenced strings, such as permission scopes from request bodies or JWT claims, into the encode/3 entry point permanently mint one atom per distinct value, and BEAM atoms are never garbage-collected. Because the Erlang VM's atom table is capped at roughly 1,048,576 entries by default, a modest stream of varied unauthenticated input can exhaust it and crash the BEAM node with a system_limit error, taking down every application running on that node; recovery requires a restart. Only Guardian 2.0.0 through versions before 2.4.1 are affected, and only when the AtomEncoding encoder is explicitly selected, since the default BitwiseEncoding encoder is not affected. A public advisory with a PoC reference exists (GHSA-fjr5-7xrc-hmpj), but there is no confirmed in-the-wild exploitation so far (EPSS 0.3%, not in CISA KEV).

What to do: Upgrade Guardian to 2.4.1 or later. Until then, audit your Guardian configuration for use Guardian.Permissions with encoding: Guardian.Permissions.AtomEncoding and check whether untrusted scope strings reach encode/3; mitigations include switching to the default BitwiseEncoding encoder or validating/allow-listing scope values against your application's known permission names before encoding. Any node that has exhausted its atom table must be restarted to recover.

Affected
ueberauth guardian>= 2.0.0, < 2.4.1
Estimated exposure
moderatelikely thousands of deployments (Guardian has a large Hex install base, but only applications that opt into the non-default AtomEncoding permissions encoder… — Guardian is one of the most widely used authentication packages on Hex, but the vulnerable code path requires explicitly selecting AtomEncoding and routing attacker-controlled scope strings into encode/3, which only a fraction of installs…

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 in ueberauth guardian allows denial of service via unbounded atom creation from attacker-controlled binary input. Guardian.Permissions.AtomEncoding encodes permission scopes by passing arbitrary binaries to String.to_atom/1. When encode/3 in lib/guardian/permissions/atom_encoding.ex is called with a list, each binary entry is handled by the encode_value/3 binary clause, which calls String.to_atom(value) with no allow-list check. The perm_set argument (the application's small, finite set of legitimate permission names) is discarded, so any external string flows straight into atom creation. This encoder is selected with use Guardian.Permissions, encoding: Guardian.Permissions.AtomEncoding and reached through the imported encode/3 entry point. 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 funnels attacker-influenced permission scopes (from a request body, a JWT claim, or other external input) into encode/3 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 with system_limit, taking down every application running on it. The default encoder is Guardian.Permissions.BitwiseEncoding, which is not affected. 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.