
error de denegación de servicio en rizin
Rizin es un framework de ingeniería inversa bifurcado de radare2, se descubrió una falla en su código de análisis ELF que permitiría que un archivo manipulado realizara una denegación de servicio. Esto impediría que un usuario pudiera cargar el archivo en rizin, pero no tendría ningún impacto en la ejecución del archivo en sí.
Un archivo ELF típico depende del enlace/carga dinámica y, por lo tanto, tiene una gran cantidad de información incrustada en el archivo. Un dato que se puede encontrar es la entrada DT_VERNEEDNUM en la sección .dynamic; este campo especifica el número de entradas en la tabla de dependencias de versiones de símbolos. Por lo tanto, este valor debe usarse al analizar cada dependencia de versión, pero la tabla fue diseñada de modo que en la última entrada verneed, el campo vn_next sea igual a 0. Sin embargo, en lugar de recorrer cada entrada hasta detectar el final, rizin recorre las entradas de la tabla usando el valor obtenido de la entrada DT_VERNEEDNUM. Esto crea situaciones en las que el valor DT_VERNEEDNUM podría ser falsificado para ser muy grande, como 0xFFFFFFFFFFFFFFFF, lo que hace que el analizador ELF gire continuamente sobre la última entrada pensando que tiene más entradas para iterar, calculando el desplazamiento de la siguiente entrada con el campo vn_next ahora nulo. Aunque esto afecta al analizador ELF de rizin, no tendrá ningún impacto en la ejecución del binario, ya que el cargador de Linux detectará que ha llegado al final de la tabla con un DT_VERNEEDNUM falso. Esto proporciona una solución simple: detectar cuando vn_next es nulo y luego salir del bucle.
El error se puede encontrar en versiones anteriores a v0.5.0 y fue corregido en el commit 4564986ef29f8872a95733416ce0a860ac2aa7e5 con el archivo y la función afectados como 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