
خطأ رفض الخدمة في rizin
ريزين (Rizin) هو إطار عمل للهندسة العكسية مشتق من radare2، وقد تم اكتشاف ثغرة في كود محلل ملفات ELF الخاص به تسمح لملف مصمم خصيصًا بتنفيذ هجوم حجب الخدمة. يمنع هذا المستخدم من تحميل الملف إلى ريزين، لكن دون أي تأثير على تنفيذ الملف نفسه.
تعتمد ملفات ELF النموذجية على الربط/التحميل الديناميكي، وبالتالي تحتوي على معلومات موسعة مدمجة داخل الملف. إحدى هذه المعلومات هي إدخال DT_VERNEEDNUM الموجود في قسم .dynamic، ويحدد هذا الحقل عدد الإدخالات في جدول تبعيات إصدارات الرموز. لذلك، يجب استخدام هذه القيمة عند تحليل كل تبعية إصدار، ولكن الجدول صُمم بحيث يكون حقل vn_next مساويًا للصفر في آخر إدخال verneed. ومع ذلك، بدلاً من التكرار عبر كل إدخال حتى يكتشف النهاية الفعلية، يكرر ريزين عبر إدخالات الجدول مستخدمًا القيمة المسترجعة من إدخال DT_VERNEEDNUM. وهذا يخلق حالات يمكن فيها تزوير قيمة DT_VERNEEDNUM إلى قيمة كبيرة جدًا مثل 0xFFFFFFFFFFFFFFFF، مما يتسبب في دوران محلل ELF باستمرار على الإدخال الأخير معتقدًا أن لديه المزيد من الإدخالات للتكرار عبرها عن طريق حساب إزاحة الإدخال التالي مع حقل vn_next الفارغ الآن. على الرغم من أن هذا يؤثر على محلل 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