
Rizin रिवर्स इंजीनियरिंग फ्रेमवर्क के ELF पार्सर में सेवा से इनकार भेद्यता का दस्तावेज़ीकरण, जो अनंत लूप की ओर ले जाने वाले नकली DT_VERNEEDNUM मान के कारण होता है।
Rizin radare2 से फोर्क किया गया एक रिवर्स इंजीनियरिंग फ्रेमवर्क है, इसके ELF पार्सर कोड में एक दोष पाया गया जो एक क्राफ्टेड फाइल को डिनायल ऑफ सर्विस (DoS) करने की अनुमति देता है। यह उपयोगकर्ता को फाइल को rizin में लोड करने से रोकेगा, लेकिन फाइल के निष्पादन पर इसका कोई प्रभाव नहीं पड़ेगा।
आपकी सामान्य ELF फाइल डायनेमिक लिंकिंग/लोडिंग पर निर्भर करती है और इस प्रकार इसमें व्यापक जानकारी एम्बेडेड होती है। .dynamic सेक्शन में पाई जाने वाली एक जानकारी DT_VERNEEDNUM एंट्री है, यह फील्ड सिंबल वर्जन डिपेंडेंसी टेबल में एंट्रीज की संख्या निर्दिष्ट करती है। इसलिए, प्रत्येक वर्जन डिपेंडेंसी को पार्स करते समय इस मान का उपयोग किया जाना चाहिए, लेकिन टेबल को इस प्रकार डिज़ाइन किया गया था कि अंतिम verneed एंट्री पर vn_next फील्ड 0 के बराबर होगा। हालांकि, rizin प्रत्येक एंट्री के माध्यम से तब तक लूप करने के बजाय जब तक यह अंत का पता नहीं लगाता, DT_VERNEEDNUM एंट्री से प्राप्त मान का उपयोग करके टेबल एंट्रीज पर लूप करता है। यह ऐसी स्थितियाँ पैदा करता है जहाँ DT_VERNEEDNUM मान को बहुत बड़ा जैसे 0xFFFFFFFFFFFFFFFF बनाया जा सकता है, जिससे ELF पार्सर अंतिम एंट्री पर लगातार घूमता रहता है, यह सोचकर कि उसके पास और एंट्रीज हैं, जबकि अब शून्य vn_next फील्ड के साथ अगली एंट्री के ऑफसेट की गणना करता है। यद्यपि यह rizin ELF पार्सर को प्रभावित करता है, इसका बाइनरी के निष्पादन पर कोई प्रभाव नहीं पड़ेगा क्योंकि लिनक्स लोडर यह पता लगा लेगा कि यह झूठे DT_VERNEEDNUM के साथ टेबल के अंत तक पहुँच गया है। यह केवल यह पता लगाकर एक सरल समाधान प्रदान करता है कि vn_next कब शून्य है और फिर लूप से बाहर निकल जाता है।
यह बग 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