Skip to content
Heist/ feed
High

Filtering an :atom attribute with unsafe_to_atom? can exhaust the BEAM atom table in Ash

Type: advisorySource: Official CVE List1 source record

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.

Announced Group revision 1
Original source ↗

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
Read the original announcement