Filtering an :atom attribute with unsafe_to_atom? can exhaust the BEAM atom table in Ash
Ash stores :atom-typed attributes as strings and compares them as strings. When such an attribute is referenced in a filter, the comparison value is coerced through Ash.Type.Atom. Because the type defined no coerce/2 callback, coercion fell back to the default (cast_input/2), which calls String.to_atom/1 when the attribute is configured with the unsafe_to_atom?: true constraint. Filtering such an attribute with attacker-controlled strings therefore interned a new, permanent atom for every distinct value. Atoms are never garbage collected and the BEAM caps the atom table, so an actor who can supply filter values for a public, filterable :atom attribute declared with unsafe_to_atom?: true can exhaust the atom table and crash the node (denial of service). AshPaperTrail is a notable example: its version resources expose a public, filterable version_action_name atom attribute with unsafe_to_atom?: true by default. The fix adds a coerce/2 to Ash.Type.Atom that never interns atoms — a comparison value is left as a string, since the type is stored and compared as a string. Setting the attribute from action input (cast_input/2, which still honors unsafe_to_atom?) is unchanged. This issue affects ash: from 3.5.1 before 3.34.3.
CVE-2026-94201
Primary source · Revision 1
Imported from structured advisory data. Source references identify upstream records or fields; verify affected versions and your deployed configuration.
Security context
Source reference: cve:CVE-2026-94201
ash
Source reference: /containers/cna/affected/0/product
- Affected versions
- Not stated in this record
- Fixed versions
- Not stated in this record
- Prerequisites
- Not stated in this record
ash
Source reference: /containers/cna/affected/1/product
- Affected versions
- Not stated in this record
- Fixed versions
- Not stated in this record
- Prerequisites
- Not stated in this record
Structured affected-version data
Original package identities and version rules from this source.
[
{
"cpes": [
"cpe:2.3:a:ash-project:ash:*:*:*:*:*:*:*:*"
],
"repo": "https://github.com/ash-project/ash",
"vendor": "ash-project",
"modules": [
"'Elixir.Ash.Type.Atom'"
],
"product": "ash",
"versions": [
{
"status": "affected",
"version": "3.5.1",
"lessThan": "3.34.3",
"versionType": "semver"
}
],
"packageURL": "pkg:hex/ash",
"packageName": "ash",
"programFiles": [
"lib/ash/type/atom.ex"
],
"collectionURL": "https://repo.hex.pm",
"defaultStatus": "unaffected",
"programRoutines": [
{
"name": "'Elixir.Ash.Type.Atom':cast_value/2"
}
]
},
{
"cpes": [
"cpe:2.3:a:ash-project:ash:*:*:*:*:*:*:*:*"
],
"repo": "https://github.com/ash-project/ash",
"vendor": "ash-project",
"modules": [
"'Elixir.Ash.Type.Atom'"
],
"product": "ash",
"versions": [
{
"status": "affected",
"version": "2970ba3bd5d36d6ad04c731ac87385375d457147",
"lessThan": "5282f3f513053628cdd1bf2236ea22d975d934d4",
"versionType": "git"
}
],
"packageURL": "pkg:github/ash-project/ash",
"packageName": "ash-project/ash",
"programFiles": [
"lib/ash/type/atom.ex"
],
"collectionURL": "https://github.com",
"defaultStatus": "unaffected",
"programRoutines": [
{
"name": "'Elixir.Ash.Type.Atom':cast_value/2"
}
]
}
]- Related CVEs
- CVE-2026-94201
Source reference:
/cveMetadata/cveId
Publisher severity
high
Source reference: /containers/cna/metrics
- Event
- #9292 · Revision 1
- Added to Heist Feed
- Publisher date