
Documentação de uma vulnerabilidade de negação de serviço no parser ELF do framework de engenharia reversa Rizin, causada por um valor forjado de DT_VERNEEDNUM que leva a um loop infinito.
Rizin é um framework de engenharia reversa derivado do radare2, uma falha foi descoberta em seu código analisador de ELF que permitiria que um arquivo manipulado realizasse uma negação de serviço. Isso impediria um usuário de carregar o arquivo no rizin, mas ainda sem impacto na execução do próprio arquivo.
Um arquivo ELF típico depende de vinculação/carregamento dinâmico e, portanto, possui informações extensas embutidas no arquivo. Um dos bits de informação que pode ser encontrado é a entrada DT_VERNEEDNUM na seção .dynamic, este campo especifica o número de entradas na tabela de dependências de versão de símbolos. Portanto, esse valor deve ser usado ao analisar cada dependência de versão, mas a tabela foi projetada de forma que, na última entrada verneed, o campo vn_next seja igual a 0. No entanto, em vez de percorrer cada entrada até detectar o fim, o rizin percorre as entradas da tabela usando o valor obtido da entrada DT_VERNEEDNUM. Isso cria situações em que o valor DT_VERNEEDNUM pode ser forjado para algo muito grande, como 0xFFFFFFFFFFFFFFFF, fazendo com que o analisador ELF gire continuamente na última entrada, pensando que tinha mais entradas para iterar, calculando o deslocamento da próxima entrada com o campo vn_next agora nulo. Embora isso impacte o analisador ELF do rizin, não terá impacto na execução do binário, pois o carregador linux detectará que chegou ao final da tabela com um DT_VERNEEDNUM falso. Isso fornece uma solução simples: detectar quando vn_next é nulo e então sair do loop.
O bug pode ser encontrado em versões anteriores à v0.5.0 e foi corrigido no commit 4564986ef29f8872a95733416ce0a860ac2aa7e5, com arquivo e função impactados sendo 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