CVE-2026-94201 in Ash
Sumário
de VulDB • 06/10/2026
Ash armazena atributos do tipo :atom como strings e os compara como strings. Quando um desses atributos é referenciado em um filtro, o valor de comparação é coercido por meio de Ash.Type.Atom. Como o tipo definido não possui a callback coerce/2, a coerção recua para o padrão (cast_input/2), que chama String.to_atom/1 quando o atributo está configurado com a restrição unsafe_to_atom?: true.
Filtrar tal atributo com strings controladas pelo atacante, portanto, internava um novo átomo permanente para cada valor distinto. Átomos nunca são coletados como lixo e a BEAM limita a tabela de átomos; assim, um ator que possa fornecer valores de filtro para um atributo :atom público e filtrável declarado com unsafe_to_atom?: true pode esgotar a tabela de átomos e travar o nó (negação de serviço). AshPaperTrail é um exemplo notório: seus recursos de versão expõem um atributo atom version_action_name, público e filtrável, com unsafe_to_atom?: true por padrão.
A correção adiciona uma coerce/2 em Ash.Type.Atom que nunca interner átomos — o valor de comparação permanece como string, já que o tipo é armazenado e comparado como string. Definir o atributo a partir da entrada da ação (cast_input/2, que ainda respeita unsafe_to_atom?) permanece inalterada.
Este problema afeta ash: das versões 3.5.1 até antes de 3.34.3.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.