Safeguard
Vulnerability Analysis•

CVE-2026-55733: High Atom Exhaustion in Guardian Permissions Encoding

Guardian.Permissions.AtomEncoding creates atoms from permission strings without an allowlist, allowing atom table exhaustion. Upgrade guardian to 2.4.1.

Safeguard Security Team
3 min read

CVE-2026-55733 is a high severity (CVSS 7.5) denial of service in the Elixir Guardian library. The optional AtomEncoding permission encoder converts permission strings into atoms with no allowlist check, so varied input can exhaust the BEAM atom table. Upgrade guardian to 2.4.1.

What's affected

  • guardian (Hex package): versions 2.0.0 up to but not including 2.4.1. Fixed in 2.4.1.

Only applications that opt in to the encoder are exposed: those using use Guardian.Permissions, encoding: Guardian.Permissions.AtomEncoding and passing it permission scopes from outside the application, such as a request body or a token claim.

The record and advisory agree on the versions and the High rating.

How to check if you're exposed

For an Elixir project, print the resolved version:

mix deps | grep -A2 guardian

You can also search the lockfile:

grep guardian mix.lock

Then search your code for the entry points named above and see whether any attacker-influenced value can reach them.

The key question is whether you chose the atom encoding. Search for AtomEncoding in your code. If you use the default encoding, this particular entry point is not in play.

What to do now

  1. Update the guardian package to 2.4.1 or later and rebuild your release.
  2. Never pass raw request data, header values or token claims into functions that create atoms. Map input to a fixed set of known values first.
  3. Add monitoring for BEAM atom count so growth is noticed before the node crashes.
  4. Remember that a crash takes down every application on the node, so consider isolating critical services.
  5. Validate permission scopes against your known permission set before encoding them.

Why it matters

The record lists CWE-770, allocation of resources without limits or throttling. In the encoder, the function that handles each permission value receives the application's finite set of legitimate permission names but ignores it, so any string flows into atom creation. Atoms on the BEAM are never garbage collected, and the atom table has a fixed default limit of about 1,048,576 entries. Each previously unseen string converted with String.to_atom/1 adds a permanent entry. An attacker who can send enough distinct values fills the table, and the runtime aborts, taking every application on the node with it.

An allowlist of the application's own permission names was available in the function and not used. The fix is to enforce it. The record does not mark this CVE as known exploited.

Try it yourself

Click through it at your own pace, or open it full screen.

Quick check

Does the default encoding have this problem?

The advisory describes the optional AtomEncoding encoder. Search your code to see which encoding you chose.

What does the fix change?

Version 2.4.1 is the fixed release. Upgrade, and also validate external permission values before encoding them.

Sources

Last reviewed: 18 October 2026.

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.