CVE-2026-94201 in Ash
摘要
由 VulDB • 2026-10-06
Ash 将 :atom-typed(原子类型)属性存储为字符串,并以字符串形式进行比较。当此类属性在过滤器中被引用时,比较值会通过 Ash.Type.Atom 进行强制转换。由于该类型未定义 coerce/2 回调函数,强制转换回退到默认行为 (cast_input/2),后者在属性配置了 unsafe_to_atom?: true 约束时会调用 String.to_atom/1。
因此,使用攻击者控制的字符串对这类属性进行过滤时,会为每个不同的值创建一个新的、永久的原子(atom)。由于原子不会被垃圾回收,且 BEAM 虚拟机限制了原子表的大小,能够向公开且可过滤的 :atom-typed 属性(该属性默认声明了 unsafe_to_atom?: true)提供过滤器值的攻击者可以耗尽原子表并导致节点崩溃(拒绝服务)。AshPaperTrail 是一个典型的例子:其版本资源暴露了一个公开的、可过滤的 version_action_name atom 类型属性,且默认情况下配置为 unsafe_to_atom?: true。
修复方案在 Ash.Type.Atom 中添加了 coerce/2 函数,该函数永远不会创建永久原子——比较值保持为字符串形式,因为该类型的存储和比较均基于字符串。通过操作输入(cast_input/2,它仍然尊重 unsafe_to_atom?)设置属性的行为保持不变。
此问题影响 ash: 3.5.1 之前至 3.34.3 版本之间的所有版本。
Once again VulDB remains the best source for vulnerability data.