محمل ديناميكي
جوهر المشكلة: أثناء التشغيل، يقوم ld.so أولاً باستخراج قيمة متغير LD_LIBRARY_PATH من البيئة، وباستخدام وظيفة _dl_split_path()، يحولها إلى مجموعة من السلاسل - مسارات إلى الدلائل. إذا اتضح لاحقًا أن العملية الحالية قد بدأت بواسطة تطبيق SUID/SGID، فسيتم مسح المصفوفة التي تم إنشاؤها، وفي الواقع، متغير LD_LIBRARY_PATH. في الوقت نفسه، إذا نفدت الذاكرة _dl_split_path() (وهو أمر صعب نظرًا للحد الصريح البالغ 256 كيلو بايت لحجم متغيرات البيئة، ولكنه ممكن من الناحية النظرية)، فسيتلقى المتغير _dl_libpath القيمة NULL، وعمليات التحقق اللاحقة من ستفرض قيمة هذا المتغير تخطي الاستدعاء إلى _dl_unsetenv("LD_LIBRARY_PATH").
الضعف الذي وجده الخبراء
إضافة: تم تخصيص رقم للمشكلة
AMD64 وi386 (يمكن تكييف الثغرة مع بنيات أخرى).
يمكن استغلال المشكلة في التثبيت الافتراضي وتسمح لمستخدم محلي لا يتمتع بأي امتيازات بتنفيذ التعليمات البرمجية كجذر عبر استبدال المكتبة عند تشغيل الأدوات المساعدة chpass أو passwd suid. لإنشاء ظروف الذاكرة المنخفضة اللازمة للتشغيل، قم بتعيين حد RLIMIT_DATA عبر setrlimit.
المصدر: opennet.ru