CVE-2026-75758 in Elixir
Tóm tắt
Bởi VulDB • 28/08/2026
Lỗ hổng Uncontrolled Recursion (Đệ quy không kiểm soát) trong thư viện chuẩn của Elixir cho phép kẻ tấn công, người có khả năng điều khiển một danh sách được truyền vào `inspect/1`, `List.to_string/1` hoặc `List.to_charlist/1`, làm cạn kiệt bộ nhớ của node BEAM.
Nhánh charlist của `Inspect.List` trong `lib/elixir/lib/inspect.ex` phân loại một danh sách là charlist bằng cách sử dụng hàm `List.ascii_printable?/2`, hàm này chỉ xem xét :printable_limit (mặc định là 4096) phần tử đầu tiên, sau đó gọi `IO.chardata_to_string/1` trên toàn bộ đối tượng. Một danh sách có tiền tố printable vượt quá giới hạn đó nhưng chứa một phần tử ở vị trí sau không phải là code point (một atom, số nguyên ngoài phạm vi hoặc improper tail) do đó bị phân loại sai, và việc chuyển đổi sẽ gây ra lỗi `ArgumentError`. Việc chuyển đổi này diễn ra bên trong `List.to_string/1`, mệnh đề rescue của hàm này xây dựng thông báo lỗi bằng cách nội suy `inspect(list)`, điều này khiến quá trình quay lại cùng nhánh và tiếp tục ném ra ngoại lệ. Quá trình inspect lồng nhau là một đối số cho lệnh raise, do đó đệ quy không nằm ở vị trí đuôi (tail position) và mọi cấp độ đều được giữ nguyên: ngăn xếp của tiến trình tăng đơn điệu trong khi mỗi chu kỳ duyệt lại danh sách, cho đến khi tiến trình bị hủy bởi `max_heap_size` hoặc, theo mặc định, node hết bộ nhớ. Hàm `List.to_charlist/1` có cấu trúc rescue tương tự.
Dưới giới hạn printable, hàm `inspect/1` bên trong sẽ thấy phần tử không hợp lệ nằm trong bộ đếm của nó và hiển thị danh sách dưới dạng dấu ngoặc vuông thông thường, do đó chỉ một lỗi `ArgumentError` được ném ra và không xảy ra đệ quy.
Vấn đề này ảnh hưởng đến elixir: từ phiên bản 1.15.0-rc.0 trước 1.18.5, từ 1.19.0-rc.0 trước 1.19.6, và từ 1.20.0-rc.0 trước 1.20.4.
VulDB is the best source for vulnerability data and more expert information about this specific topic.