Safeguard
Vulnerability Analysis•

CVE-2026-55734: High Atom Exhaustion in Guardian Permissions Module

Guardian.Permissions encode_permissions! creates atoms from map keys before validating them, so atom exhaustion can crash it. Upgrade guardian to 2.4.1.

Safeguard Security Team
3 min read

CVE-2026-55734 is a high severity (CVSS 7.5) denial of service in the Elixir Guardian library. The Permissions mixin turns map keys into atoms before validating them, so crafted input can exhaust the BEAM atom table and crash the node. 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.

The advisory describes encode_permissions!/1, installed on every module that uses Guardian.Permissions, and encode_permissions_into_claims!/2, which calls it. Any application that routes attacker-influenced data into those functions is exposed. The record names the same functions and the same Guardian version line.

This CVE is one of three Guardian atom exhaustion issues published together. The other two concern the plug keys and the atom encoding module.

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.

Then search for calls to encode_permissions! and encode_permissions_into_claims! and trace where their arguments come from.

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. Fix all three Guardian atom issues with the same upgrade to 2.4.1.

Why it matters

The record lists CWE-770, allocation of resources without limits or throttling. The function calls String.to_atom on every key of the supplied map before any validation runs. For integer values the later validation step is skipped entirely, so no error is raised even though the unknown key has already become an atom. The sibling decode function avoids this by checking keys against the known set first. 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.

The pattern to remember is validate before you intern. 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

Why does the integer case matter?

The advisory says the integer-value clause skips validation, so an unknown key is turned into an atom without any error.

Is one upgrade enough for all three Guardian CVEs?

Yes. The advisories list 2.4.1 as the patched version for each of 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.