
rizin bug de déni de service
Rizin est un framework de rétro-ingénierie fork de radare2. Une faille a été découverte dans son analyseur ELF qui permettrait à un fichier malveillant de provoquer un déni de service. Cela empêcherait un utilisateur de charger le fichier dans rizin mais n'aurait aucun impact sur l'exécution du fichier lui-même.
Un fichier ELF classique repose sur l'édition de liens dynamique/le chargement dynamique et contient donc de nombreuses informations intégrées. L'une des informations que l'on peut trouver est l'entrée DT_VERNEEDNUM dans la section .dynamic ; ce champ spécifie le nombre d'entrées dans la table de dépendances de version des symboles. Par conséquent, cette valeur doit être utilisée lors de l'analyse de chaque dépendance de version, mais la table a été conçue de sorte que sur la dernière entrée verneed, le champ vn_next soit égal à 0. Cependant, au lieu de parcourir chaque entrée jusqu'à détecter la toute fin, rizin parcourt les entrées de la table en utilisant la valeur extraite de l'entrée DT_VERNEEDNUM. Cela crée des situations où la valeur DT_VERNEEDNUM peut être falsifiée pour devenir très grande, par exemple 0xFFFFFFFFFFFFFFFF, ce qui oblige l'analyseur ELF à tourner en boucle sur la dernière entrée en pensant qu'il a encore plus d'entrées à parcourir, en calculant le décalage de l'entrée suivante avec le champ vn_next désormais nul. Bien que cela affecte l'analyseur ELF de rizin, cela n'aura aucun impact sur l'exécution du binaire puisque le chargeur Linux détectera qu'il a atteint la fin de la table avec un faux DT_VERNEEDNUM. Cela fournit une solution simple : détecter quand vn_next est nul et sortir de la boucle.
Le bogue peut être trouvé dans les versions antérieures à v0.5.0 et a été corrigé dans le commit 4564986ef29f8872a95733416ce0a860ac2aa7e5, le fichier et la fonction concernés étant 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