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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2021-3156 — CVE-2021-3156 (Baron Samedit) — отчёт и исследование | Kitploit
Инструменты/GitHubGitHub/ijbaig/cve-2021-3156
Повышение привилегийАнализ уязвимостейЭксплуатацияОбучение и ОбразованиеЭксплуатация Бинарных ФайловЛаборатории и Практика
GitHubijbaig/cve-2021-3156

CVE-2021-3156

CVE-2021-3156 (Baron Samedit) — отчёт и исследование

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

Популярное

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

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

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

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

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

Глубокий анализ эксплойт-цепочки: CVE-2021-3156 (Baron Samedit)

Автор: IJ Baig
Дата: 7 июля 2026 года


1. Идентификатор CVE, затронутые версии и подтверждение сборки

  • Идентификатор CVE: CVE-2021-3156
  • Тип уязвимости: Переполнение буфера в куче (heap-based buffer overflow)
  • Диапазон затронутых версий: Устаревшие версии Sudo с 1.8.2 по 1.8.31p2, а также стабильные версии с 1.9.0 по 1.9.5p1.
  • Собранная целевая версия: Sudo 1.9.5p1

1.1 Настройка окружения

Для безопасного анализа этой уязвимости уязвимая версия Sudo была скомпилирована в изолированной, непродакшн-среде.

OS Info

1.2 Компиляция из исходного кода

Исходный код Sudo 1.9.5p1 был загружен и скомпилирован локально с использованием стандартных утилит make. Особое внимание было уделено тому, чтобы сборка выполнялась из локального каталога и не перезаписывала нативный пропатченный бинарный файл sudo хост-системы.

Compilation Step 1

Подтверждение сборки: После компиляции был запущен пользовательский бинарный файл, чтобы убедиться, что была собрана именно уязвимая версия.

Make Install

Sudo Version

2. Анализ первопричины

2.1 Расположение уязвимого кода

  • Файл: plugins/sudoers/sudoers.c
  • Функция: set_cmnd() (примерно строка 864 в версии 1.9.5p1)

Vulnerable Code

2.2 Объяснение уязвимости

Представьте, что у вас есть помощник, чья задача — удалять escape-символы (обратные слеши) из списка слов перед тем, как поместить их в заново выделенное хранилище (буфер в куче). Помощник слепо предполагает, что за каждым обратным слешем всегда следует допустимый символ, поэтому при обнаружении обратного слеша он пропускает его и копирует следующий символ.

Однако в том, как программа обрабатывает аргументы при запуске sudoedit -s, существует изъян. Он позволяет пользователю незаметно добавить слово, которое заканчивается ровно одним обратным слешем (\), за которым сразу следует невидимый маркер конца слова (нулевой терминатор, \0).

Когда код помощника доходит до этого завершающего обратного слеша, он пропускает его и смотрит на следующий символ — нулевой терминатор. Вместо остановки логика оператора if заставляет помощника пропустить и нулевой терминатор. Цикл продолжается, копируя в хранилище любые произвольные данные из памяти за пределами допустимой области. Такое непрерывное копирование за пределы предполагаемой длины слова переполняет выделенный буфер, что приводит к серьёзному переполнению буфера в куче.

Фрагмент уязвимого кода:

/* Unescape characters, skipping over backslashes */
for (to = user_args, av = NewArgv + 1; (from = *av); av++) {
    while (*from) {
        // VULNERABILITY: If from[0] is '\' and from[1] is '\0', 
        // the loop evaluates to true, increments 'from', skipping the null terminator.
        if (from[0] == '\\' && !isspace((unsigned char)from[1]))
            from++;
        *to++ = *from++; 
    }
    *to++ = ' ';
}
*--to = '\0';

2.3 Официальный патч и объяснение исправления

Разработчики Sudo исправили эту логическую ошибку в версии 1.9.5p2, добавив строгую проверку границ. Теперь код явно проверяет, что символ, следующий за обратным слешем, не является нулевым терминатором, перед тем как выполнить его разэкранирование.

Дифф патча:

- if (from[0] == '\\' && !isspace((unsigned char)from[1]))
+ if (from[0] == '\\' && from[1] != '\0' && !isspace((unsigned char)from[1]))

Почему это устраняет первопричину: Добавление проверки from[1] != '\0' немедленно останавливает чтение за пределами допустимой области. Теперь, если код встречает завершающий обратный слеш в самом конце строки (то есть from[1] — нулевой терминатор), оператор if принимает значение false. Указатель не инкрементируется преждевременно, нулевой терминатор корректно обрабатывается как конец строки, и цикл безопасно завершается без переполнения кучи.

3. Воспроизведение эксплойта

3.1 Публичный Proof of Concept (PoC)

Для этого воспроизведения использовался широко известный Python-эксплойт, разработанный исследователем безопасности Worawit (а именно вариант exploit_nss.py).

3.2 Разбор выполнения PoC

Перед выполнением PoC крайне важно понять его механику. Скрипт не просто вызывает сбой программы; он выполняет высокоточную манипуляцию памятью для получения выполнения кода.

Вот пошаговый разбор операций PoC:

  1. Генерация полезной нагрузки: Скрипт динамически компилирует вредоносную C-нагрузку в файл разделяемой библиотеки (.so). Эта нагрузка предназначена для выполнения /bin/sh с правами root.
  2. Heap Feng Shui: Скрипт задаёт определённые переменные окружения (например, LC_ALL, LANG и TZ). Поскольку Sudo загружает переменные окружения в кучу при запуске, скрипт вычисляет точные размеры, необходимые для выстраивания кучи в предсказуемом порядке.
  3. Переполнение: Скрипт выполняет sudoedit -s и передаёт аргумент командной строки, заканчивающийся одним обратным слешем. Это запускает уязвимость off-by-one, описанную в разделе 2, вызывая запись за пределами допустимой области.
  4. Нацеливание на структуру NSS: Запись за пределами допустимой области точно перезаписывает определённую структуру glibc в соседней памяти кучи: структуру service_user. Эта структура используется Name Service Switch (NSS) для поиска системной информации.
  5. Выполнение кода: Структура service_user повреждается таким образом, чтобы указывать на вредоносную библиотеку .so, скомпилированную на шаге 1. Когда Sudo пытается выполнить поиск привилегий пользователя, он вслепую загружает и выполняет библиотеку злоумышленника, предоставляя root-оболочку.

3.3 Запуск уязвимости (Sudo 1.9.5p1)

Сначала был проведён базовый тест на сбой, чтобы доказать существование уязвимости, не превращая её в полноценный эксплойт.

Vuln Check

Затем полный скрипт Worawit exploit_nss.py был выполнен против уязвимого бинарного файла.

Terminal Access as Root

3.4 Проверка патча (Sudo 1.9.5p2)

Для проверки официального исправления тот же самый триггер PoC был выполнен против пропатченного бинарного файла Sudo.

sudoedit -s '\' 2>&1 | grep -q "sudoedit:" && echo "Vulnerable" || echo "Not vulnerable"

Patch Verify

4. Нетехническое резюме

Sudo — стандартная административная программа, используемая на наших серверах, — содержит критический изъян в обработке текстовых входных данных, содержащих обратные слеши. Аккуратно отправив некорректно сформированную команду, злоумышленник с базовым доступом пользователя может обмануть систему, заставив её записать данные за пределами выделенной области памяти. Эта ошибка позволяет полностью обойти меры безопасности и получить полный несанкционированный административный контроль над машиной даже без необходимости вводить пароль.

5. Возникшие трудности и извлечённые уроки

Трудности: Одной из основных трудностей была хрупкость манипуляции кучей. Эксплойт-нагрузки, нацеленные на конкретные версии ОС, часто не срабатывают на других, поскольку базовая стандартная библиотека C (glibc) управляет блоками памяти по-разному. Чтобы успешно превратить эту уязвимость в полноценный эксплойт, требовалось точное понимание выравнивания памяти и раскладки переменных окружения (Heap Feng Shui), характерных для целевой среды.

Скачать инструмент