Katalog CVE

CVE-2026-94201

WysokieCVSS 8.2
Opublikowano: Zaktualizowano: Przetłumaczono: NVD NIST

Prawdopodobieństwo exploitacji (EPSS)

Niskie ryzyko
0.30%

Percentyl 21 - wyżej niż 21% wszystkich znanych CVE

Streszczenie

Ash przechowuje atrybuty typu :atom jako ciągi znaków i porównuje je jako ciągi. Gdy taki atrybut jest używany w filtrze, wartość porównania jest przekształcana przez Ash.Type.Atom. Ponieważ typ nie definiował wywołania zwrotnego coerce/2, przekształcenie spadało do domyślnego (cast_input/2), które wywołuje String.to_atom/1, gdy atrybut jest skonfigurowany z ograniczeniem unsafe_to_atom?: true. Filtrowanie takiego atrybutu za pomocą ciągów kontrolowanych przez atakującego powodowało internowanie nowego, trwałego atomu dla każdej odrębnej wartości. Atomy nigdy nie są usuwane przez garbage collector, a BEAM ogranicza tabelę atomów, więc aktor mogący dostarczać wartości filtrów dla publicznego, filtrowalnego atrybutu :atom zadeklarowanego z unsafe_to_atom?: true może wyczerpać tabelę atomów i spowodować awarię węzła (odmowa usługi). AshPaperTrail jest godnym uwagi przykładem: jego zasoby wersji domyślnie udostępniają publiczny, filtrowalny atrybut atomowy version_action_name z unsafe_to_atom?: true. Poprawka dodaje coerce/2 do Ash.Type.Atom, które nigdy nie internowuje atomów — wartość porównania pozostaje ciągiem, ponieważ typ jest przechowywany i porównywany jako ciąg. Ustawianie atrybutu z danych wejściowych akcji (cast_input/2, które nadal respektuje unsafe_to_atom?) pozostaje bez zmian. Problem dotyczy ash: od 3.5.1 przed 3.34.3.

Ocena ryzyka

Atakujący może wyczerpać tabelę atomów i spowodować awarię węzła BEAM, prowadząc do odmowy usługi dla aplikacji korzystającej z Ash.

Rekomendacja

Należy zaktualizować bibliotekę Ash do wersji 3.34.3 lub nowszej, która zawiera poprawkę.

Inne podatności w Ash

Zobacz wszystkie
Oryginalny opis (angielski, źródło NVD)

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.

Dane podatności pochodzą z NVD (NIST) · CISA KEV · EPSS