
rizin 서비스 거부 버그
Rizin은 radare2에서 포크된 리버스 엔지니어링 프레임워크로, ELF 파서 코드에서 조작된 파일이 서비스 거부를 유발할 수 있는 결함이 발견되었습니다. 이로 인해 사용자가 rizin에 파일을 로드하지 못하게 되지만, 파일 자체의 실행에는 아무런 영향을 미치지 않습니다.
일반적인 ELF 파일은 동적 링킹/로딩에 의존하므로 파일에 광범위한 정보가 포함되어 있습니다. .dynamic 섹션에서 찾을 수 있는 정보 중 하나는 DT_VERNEEDNUM 항목으로, 이 필드는 심볼 버전 종속성 테이블의 항목 수를 지정합니다. 따라서 이 값은 각 버전 종속성을 파싱할 때 사용되지만, 테이블은 마지막 verneed 항목에서 vn_next 필드가 0이 되도록 설계되었습니다. 그러나 rizin은 끝을 감지할 때까지 각 항목을 반복하는 대신 DT_VERNEEDNUM 항목에서 검색한 값을 사용하여 테이블 항목을 반복합니다. 이로 인해 DT_VERNEEDNUM 값을 0xFFFFFFFFFFFFFFFF와 같이 매우 큰 값으로 위조할 경우, ELF 파서가 마지막 항목에서 계속 회전하며 더 많은 항목이 있다고 생각하고 이제 null이 된 vn_next 필드로 다음 항목의 오프셋을 계산합니다. 이것이 rizin ELF 파서에 영향을 미치지만, 리눅스 로더가 잘못된 DT_VERNEEDNUM으로 테이블의 끝에 도달했음을 감지하므로 바이너리 실행에는 아무런 영향을 미치지 않습니다. 이는 vn_next가 null일 때 감지하여 루프를 빠져나오는 간단한 해결책을 제공합니다.
이 버그는 v0.5.0 이전 버전에서 발견되었으며, 커밋 4564986ef29f8872a95733416ce0a860ac2aa7e5에서 패치되었습니다. 영향받은 파일과 함수는 librz/bin/format/elf/elf_info.c:get_gnu_verneed(ELFOBJ *bin)입니다.
https://github.com/rizinorg/rizin/pull/3214
https://github.com/rizinorg/rizin/pull/3214/commits/4564986ef29f8872a95733416ce0a860ac2aa7e5