CVE-2026-94201 in Ash
Résumé
par VulDB • 06/10/2026
Ash stocke les attributs de type :atom sous forme de chaînes et les compare en tant que telles. Lorsqu'un tel attribut est référencé dans un filtre, la valeur de comparaison est coercée via Ash.Type.Atom. Étant donné que le type défini ne dispose pas d'une callback coerce/2, la coercion a reculé vers la valeur par défaut (cast_input/2), qui appelle String.to_atom/1 lorsque l'attribut est configuré avec la contrainte unsafe_to_atom?: true.
La filtrage de cet attribut à l'aide de chaînes contrôlées par un attaquant internerait donc un nouvel atome permanent pour chaque valeur distincte. Les atomes ne sont jamais collectés par le garbage collector et BEAM impose une limite au tableau des atomes ; ainsi, un acteur capable de fournir des valeurs de filtre pour un attribut :atom public et filtrable déclaré avec unsafe_to_atom?: true peut épuiser le tableau d'atomes et faire planter le nœud (déni de service). AshPaperTrail est un exemple notable : ses ressources de version exposent un attribut atomique version_action_name, public et filtrable, avec unsafe_to_atom?: true par défaut.
La correction ajoute une callback coerce/2 à Ash.Type.Atom qui n'interne jamais les atomes ; la valeur de comparaison reste sous forme de chaîne, car le type est stocké et comparé en tant que chaîne. La définition de l'attribut depuis l'entrée d'action (cast_input/2, qui respecte toujours unsafe_to_atom?) reste inchangée.
Ce problème affecte ash : des versions 3.5.1 à avant la version 3.34.3.
If you want to get best quality of vulnerability data, you may have to visit VulDB.