
rizin Denial-of-Service-Bug
Rizin ist ein Reverse-Engineering-Framework, das von radare2 abgespalten wurde. In dessen ELF-Parser-Code wurde ein Fehler entdeckt, der es ermöglicht, durch eine manipulierte Datei einen Denial-of-Service auszulösen. Dies würde verhindern, dass ein Benutzer die Datei in Rizin laden kann, hätte jedoch keine Auswirkungen auf die Ausführung der Datei selbst.
Eine typische ELF-Datei nutzt dynamisches Linken/Laden und enthält daher umfangreiche eingebettete Informationen. Ein Teil dieser Informationen ist der DT_VERNEEDNUM-Eintrag im .dynamic-Abschnitt. Dieses Feld gibt die Anzahl der Einträge in der Symbolversionsabhängigkeitstabelle an. Daher sollte dieser Wert beim Parsen jeder Versionsabhängigkeit verwendet werden, aber die Tabelle wurde so konzipiert, dass beim letzten verneed-Eintrag das Feld vn_next gleich 0 ist. Statt jedoch jeden Eintrag zu durchlaufen, bis das Ende erkannt wird, durchläuft Rizin die Tabelleneinträge mithilfe des Wertes aus dem DT_VERNEEDNUM-Eintrag. Dies führt zu Situationen, in denen der DT_VERNEEDNUM-Wert auf einen sehr großen Wert wie 0xFFFFFFFFFFFFFFFF gefälscht werden kann, wodurch der ELF-Parser kontinuierlich beim letzten Eintrag verharrt, in dem Glauben, dass er weitere Einträge zu durchlaufen hat, indem er den Offset des nächsten Eintrags mit dem nun null gesetzten vn_next-Feld berechnet. Obwohl dies den Rizin-ELF-Parser betrifft, hat es keine Auswirkungen auf die Ausführung der Binärdatei, da der Linux-Loader erkennt, dass das Ende der Tabelle mit einem falschen DT_VERNEEDNUM erreicht wurde. Dies bietet eine einfache Lösung: Man erkennt einfach, wenn vn_next null ist, und bricht dann aus der Schleife aus.
Der Fehler tritt in Versionen vor v0.5.0 auf und wurde in Commit 4564986ef29f8872a95733416ce0a860ac2aa7e5 behoben, wobei die betroffene Datei und Funktion librz/bin/format/elf/elf_info.c:get_gnu_verneed(ELFOBJ *bin) ist.
https://github.com/rizinorg/rizin/pull/3214
https://github.com/rizinorg/rizin/pull/3214/commits/4564986ef29f8872a95733416ce0a860ac2aa7e5