CVE-2026-75758 in Elixir
요약
\~에 의해 VulDB • 2026. 08. 28.
Elixir 표준 라이브러리에서 제어되지 않은 재귀(Uncontrolled Recursion) 취약점이 발견되어, inspect/1, List.to_string/1 또는 List.to_charlist/1로 전달되는 리스트를 조작한 공격자가 BEAM 노드의 메모리를 고갈시킬 수 있습니다.
lib/elixir/lib/inspect.ex에 있는 Inspect.List의 charlist 분기는 List.ascii_printable?/2를 사용하여 리스트가 charlist인지 판별합니다. 이 함수는 기본적으로 4096인 :printable_limit(사용 가능한 문자 요소)만큼의 첫 번째 원소만 검사한 후, 전체 항(term)에 대해 IO.chardata_to_string/1을 호출합니다. 따라서 인쇄 가능한 접두사(prefix)가 해당 한계를 초과하지만 이후 원소가 코드 포인트(code point)가 아닌 경우(원자(atom), 범위를 벗어난 정수, 또는 improper tail 등)에는 잘못 분류되어 변환 과정에서 ArgumentError가 발생합니다. 이 변환은 List.to_string/1 내부에서 실행되며, rescue 절에서는 inspect(list)를 보간(interpolating)하여 메시지를 구성합니다. 이는 동일한 분기로 재진입(re-enter)하여 다시 예외를 발생시킵니다. 중첩된 검사(nested inspection)는 raise의 인자로 사용되므로 재귀가 꼬리 위치(tail position)에 있지 않으며, 모든 호출 스택 프레임이 유지됩니다: 프로세스 스택은 단조롭게 증가하며 각 사이클마다 리스트를 다시 순회하므로, max_heap_size로 인해 프로세스가 종료되거나(기본 설정), 노드 메모리가 고갈될 때까지 진행됩니다. List.to_charlist/1도 동일한 rescue 구조를 가집니다.
인쇄 가능한 한계 미만에서는 내부 inspect/1이 카운터 내에서 유효하지 않은 원소를 확인하고 리스트를 일반적인 대괄호(bracket) 형식으로 렌더링하므로, 단일 ArgumentError가 발생하며 재귀는 일어나지 않습니다.
본 이슈는 elixir의 1.15.0-rc.0 이상 1.18.5 미만 버전, 1.19.0-rc.0 이상 1.19.6 미만 버전 및 1.20.0-rc.0 이상 1.20.4 미만 버전에 영향을 미칩니다.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.