Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

ЛентыКонтактыКонфиденциальность© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2023-4911 — Отчет об анализе CVE-2023-4911 (Looney Tunables) и лаборатория воспроизведения в Docker | Kitploit
Инструменты/GitHubGitHub/baeseungwon1010/cve-2023-4911
Повышение привилегийАнализ уязвимостейЭксплуатацияОбучение и ОбразованиеЭксплуатация Бинарных ФайловЛаборатории и Практика
GitHubbaeseungwon1010/cve-2023-4911

CVE-2023-4911

Отчет об анализе CVE-2023-4911 (Looney Tunables) и лаборатория воспроизведения в Docker

Репозиторий
693 месяцев назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

переполнение буфера в куче glibc (CVE-2023-4911)

ПараметрЗначение
CVE IDCVE-2023-4911
Тип атакиПереполнение буфера в куче → локальное повышение привилегий (Local Privilege Escalation)
CVSS 3.17.8 (Высокий)
Дата публикации2023-10-03
Уязвимая точкаПарсер GLIBC_TUNABLES динамического загрузчика glibc (ld.so)
Уязвимые версииglibc 2.34~2.38

1. Обзор

CVE-2023-4911 — это уязвимость переполнения буфера в куче, возникающая при парсинге переменной окружения GLIBC_TUNABLES динамическим загрузчиком GNU C Library (glibc). Используя это переполнение, атакующий может манипулировать путём поиска библиотек (RPATH) динамического загрузчика, чтобы при выполнении SUID root-бинарника (su, sudo и т.д.) загружалась вредоносная разделяемая библиотека, подготовленная атакующим, что позволяет выполнить произвольный код с правами root. Поскольку glibc является ключевым компонентом практически всех основных дистрибутивов Linux, данная уязвимость затронула большинство дистрибутивов на основе glibc, выпущенных после апреля 2021 года.

2. Часть уязвимого кода

while (true)
{
    char *name = p;
    size_t len = 0;

    /* Нахождение длины имени (name) */
    while (p[len] != '=' && p[len] != ':' && p[len] != '\0')
        len++;

    /* Если строка заканчивается без '=', завершаем */
    if (p[len] == '\0')
    {
        if (__libc_enable_secure)
            tunestr[off] = '\0';
        return;
    }

    /* Если первой встретилась ':', значит неверная запись */
    if (p[len] == ':')
    {
        p += len + 1;
        continue;
    }

    /* Встретили '=', перемещаемся к началу значения */
    p += len + 1;

    /* Вычисляем значение из исходной строки */
    char *value = &valstring[p - tunestr];

    len = 0;

    /* Нахождение длины значения */
    while (p[len] != ':' && p[len] != '\0')
        len++;

    ...
    /* Копирование в tunestr */
    ...

    if (p[len] != '\0')
        p += len + 1;
}

3. Анализ причины

3.1 Нормальный поток обработки

  1. __tunables_init() находит GLIBC_TUNABLES в списке переменных окружения.
  2. tunables_strdup() выделяет буфер с помощью __minimal_malloc() и копирует исходную строку (на этом этапе malloc — это очень ранняя реализация, ещё не полностью инициализированная).
  3. parse_tunables() обходит этот буфер, разделяя его по символу : (двоеточие) и присваивает значения соответствующим tunables для каждой пары key=value.

3.2 Место дефекта

parse_tunables() обрабатывает один tunable в последовательности: разбор имени → перемещение p → разбор значения → перемещение p. При нормальном вводе после обработки значения p перемещается на начало следующего tunable для его парсинга.

Однако если подать входные данные вида name=name=value:

GLIBC_TUNABLES=glibc.malloc.mxfast=glibc.malloc.mxfast=AAAA...(длинная строка)

В первом проходе парсинга вся строка glibc.malloc.mxfast=AAAA... интерпретируется как одно значение и копируется в буфер tunestr. После этого, поскольку за значением не следует двоеточие (:), разделяющее следующий tunable, указатель парсинга (p) не перемещается на следующий элемент, а снова указывает на начало уже скопированного значения.

Проблема в том, что само значение имеет форму name=value. На следующей итерации парсер ошибочно распознаёт это как новый tunable и повторно записывает данные в буфер. Так как tunestr выделен только под размер исходной строки, повторная запись приводит к переполнению буфера в куче.

3.3 Эффекты переполнения

Возникшее переполнение буфера в куче перезаписывает соседние области кучи, выделенные последовательно с помощью __minimal_malloc(). Используя это, атакующий может изменить указатель l_info[DT_RPATH] внутренней структуры link_map динамического загрузчика (ld.so) на контролируемый им стековый адрес.

В этой области стека заранее размещается поддельная структура Elf64_Dyn, которая указывает каталог, заданный атакующим, в качестве нового пути поиска библиотек (RPATH). В результате ld.so загружает вредоносную разделяемую библиотеку, подготовленную атакующим, вместо системных.

4. Цепочка атаки

  1. Атакующий формирует переменную окружения GLIBC_TUNABLES вида name=name=value.
  2. Запускает SUID-программу (например, su) с правами обычного пользователя.
  3. Ядро, благодаря SUID-биту, изменяет effective UID процесса на root и запускает динамический загрузчик (ld.so).
  4. В parse_tunables() ld.so происходит переполнение буфера в куче.
  5. Используя переполнение, атакующий изменяет указатель l_info[DT_RPATH] структуры link_map на стековый адрес, где находится поддельная структура Elf64_Dyn.
  6. ld.so использует изменённый RPATH для загрузки вредоносной libc.so.6, подготовленной атакующим.
  7. Код инициализации (или изменённый стартовый код) вредоносной libc.so.6 выполняется с правами root, производя setuid(0), setgid(0) и запуская /bin/sh.
  8. Этот процесс происходит до выполнения логики аутентификации su, поэтому получение root-оболочки происходит без проверки пароля.

PoC использует метод брутфорса, повторяя execve() до тех пор, пока не сформируется нужный макет памяти из-за влияния рандомизации (ASLR). Таким образом, успех атаки и время её выполнения зависят от окружения; обычно требуется от нескольких сотен до нескольких тысяч попыток.

5. Условия воспроизведения

  • Наличие бинарников с произвольным повышением привилегий, таких как SUID, SGID.
  • Возможность у атакующего запустить такой бинарник с произвольными переменными окружения.
  • Версия glibc до применения патча.

6. Воспроизведение среды (PoC)

Сначала клонируем содержимое из git в директорию

git clone https://github.com/baeseungwon1010/CVE-2023-4911

Изображение 1

Собираем docker-образ с помощью следующей команды

cd C* && docker compose run --rm cve-2023-4911-lab

Изображение 2

После входа в контейнер запускаем эксплойт

cd /home/student/exploit && ./exp

После запуска и ожидания видно, что обычный пользователь изменился на sudo(0)

Изображение 3 Изображение 4

7. Меры по устранению

Обновить версию glibc с уязвимой на исправленную. После обновления желательно перезагрузить систему или перезапустить службы, чтобы предыдущая версия glibc не осталась в памяти. Если немедленное обновление невозможно, в качестве временной меры можно удалить ненужные процессы SUID, SGID.

8. Ссылки

  • NVD: CVE-2023-4911
  • Ubuntu Security Notice: CVE-2023-4911
  • leesh3288/CVE-2023-4911 PoC
  • Debian Sources - glibc 2.28-10 dl-tunables.c
Скачать инструмент