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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2021-3156 — CVE-2021-3156 (Baron Samedit) Report and Research | Kitploit
Инструменты/GitHubGitHub/ijbaig/cve-2021-3156
Privilege EscalationVulnerability AnalysisExploitationLearning & EducationBinary ExploitationLabs & Practice
GitHubijbaig/cve-2021-3156

CVE-2021-3156

CVE-2021-3156 (Baron Samedit) Report and Research

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

Популярное

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

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

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

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

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

Глубокий анализ эксплойт-цепочки: 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 заставляет помощника пропустить и нулевой терминатор. Цикл продолжается, копируя в хранилище любые произвольные данные из памяти за пределами допустимой области. Такое непрерывное копирование за пределы предполагаемой длины слова переполняет выделенный буфер, что приводит к серьёзному переполнению буфера в куче.

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

root@kitploit:~
/* 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, добавив строгую проверку границ. Теперь код явно проверяет, что символ, следующий за обратным слешем, не является нулевым терминатором, перед тем как выполнить его разэкранирование.

Дифф патча:

root@kitploit:~
- 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.

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

Patch Verify

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

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

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

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

Извлечённые уроки: С точки зрения защиты и операций безопасности, этот глубокий анализ подтвердил несколько ключевых концепций:

  • Ценность контролируемых лабораторных сред: Переход от управляемых веб-тренажёров (например, TryHackMe) к локальной сборке и эксплуатации уязвимого бинарного файла из исходного кода даёт гораздо более глубокое понимание того, как базовые механизмы ОС определяют возможность эксплуатации.
  • Инженерия обнаружения имеет первостепенное значение: Полагаться только на установку патчей для SUID-бинарных файлов недостаточно, поскольку цикл патчинга занимает время. Исследование этого эксплойта подчеркнуло необходимость надёжных правил обнаружения в SIEM. Мониторинг телеметрии выполнения процессов на предмет подозрительных команд sudoedit -s, заканчивающихся escape-символами, мог бы позволить команде SOC обнаруживать попытки эксплуатации до того, как патч будет полностью развёрнут в инфраструктуре.
  • Границы привилегий: Это упражнение подчеркнуло огромный риск, связанный с SUID-бинарными файлами. Поскольку Sudo выполняется с привилегиями root с самой первой инструкции, любая ошибка логики разбора при запуске гарантирует полную компрометацию системы.

6. Бонус: параллельные уязвимости в Sudo

Параллельный CVE: CVE-2019-14287 (обход безопасности Sudo) Ещё одна известная уязвимость в той же самой кодовой базе Sudo имеет схожий паттерн первопричины: некорректный разбор и проверка пользовательского ввода. В CVE-2019-14287 логический изъян в том, как Sudo разбирал идентификатор пользователя (UID), позволял злоумышленнику выполнять команды с правами root, указав идентификатор пользователя -1 или 4294967295.

Параллель: Хотя Baron Samedit (CVE-2021-3156) — это изъян повреждения памяти, а CVE-2019-14287 — обход авторизации, первопричина в обоих случаях — сбой в начальной логике разбора аргументов. Обе уязвимости проистекают из того, что Sudo ошибочно доверяет и некорректно обрабатывает пограничные аргументы командной строки (завершающие обратные слеши против неожиданного целочисленного переноса) перед выполнением своих основных привилегированных функций.


Заявление о безопасности и этике: Все действия по эксплуатации и тестированию, продемонстрированные в этом отчёте, выполнялись исключительно в изолированной авторизованной локальной виртуальной машине. В ходе этого упражнения не затрагивались и не использовались продакшн-системы или несанкционированные сети.

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