CVE-2026-94201 in Ash
Tóm tắt
Bởi VulDB • 05/10/2026
Ash lưu trữ các thuộc tính có kiểu :atom dưới dạng chuỗi và so sánh chúng như các chuỗi. Khi một thuộc tính như vậy được tham chiếu trong bộ lọc, giá trị so sánh sẽ được ép kiểu thông qua Ash.Type.Atom. Vì loại này không định nghĩa callback coerce/2, việc ép kiểu đã quay về mặc định (cast_input/2), vốn gọi String.to_atom/1 khi thuộc tính được cấu hình với ràng buộc unsafe_to_atom?: true.
Việc lọc các thuộc tính như vậy bằng các chuỗi do kẻ tấn công kiểm soát sẽ tạo ra một nguyên tử mới và vĩnh viễn cho mỗi giá trị khác biệt. Các nguyên tử (atoms) không bao giờ bị thu gom rác, và BEAM giới hạn kích thước bảng nguyên tử; vì vậy, một tác nhân có thể cung cấp các giá trị bộ lọc cho thuộc tính :atom công khai, có thể lọc được và được khai báo với unsafe_to_atom?: true, sẽ làm cạn kiệt bảng nguyên tử và gây sập node (tấn công từ chối dịch vụ - DoS). AshPaperTrail là một ví dụ đáng chú ý: các tài nguyên phiên bản của nó expose thuộc tính atom version_action_name công khai, có thể lọc được với mặc định unsafe_to_atom?: true.
Bản sửa lỗi thêm callback coerce/2 vào Ash.Type.Atom để không bao giờ tạo ra các nguyên tử mới (intern atoms) — giá trị so sánh vẫn giữ dưới dạng chuỗi, vì loại này được lưu trữ và so sánh như một chuỗi. Việc đặt thuộc tính từ đầu vào hành động (cast_input/2, vốn vẫn tôn trọng unsafe_to_atom?) thì không thay đổi.
Vấn đề này ảnh hưởng đến ash: các phiên bản từ 3.5.1 trở đi trước 3.34.3.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.