
Уязвимость BDU:2021-00364 (CVE-2021-3156) в Sudo
Baron Samedit — это критическая уязвимость (BDU:2021-00364, CVE-2021-3156) в утилите sudo
, связанная с переполнением буфера в куче (heap-based buffer overflow). Она позволяет локальному пользователю повысить привилегии до уровня root. Уязвимость существует в версиях sudo до 1.9.5p2 и связана с ошибкой в функции parse_args()
, которая неправильно обрабатывает аргументы командной строки при использовании sudoedit
с опцией -s
.
Технические детали уязвимости
Уровень опасности: 7.8 (Высокий)
Вектор атаки: CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
-
AV:L (Вектор атаки: Локальный) – Требуется локальный/физический доступ к системе.
-
AC:L (Сложность атаки: Низкая) – Эксплуатация проста и не требует сложных условий.
-
PR:L (Привилегии: Низкие) – Нужны базовые права доступа (например, учётная запись).
-
UI:N (Взаимодействие: Нет) – Участие пользователя не требуется.
-
S:U (Область: Неизменная) – Влияет только на уязвимый компонент.
-
C:H (Конфиденциальность: Высокое) – Полная утечка данных.
-
I:H (Целостность: Высокое) – Возможность полного изменения данных.
-
A:H (Доступность: Высокое) – Серьёзное нарушение работоспособности.
Интерпретация: Уязвимость высокой опасности (7.8) требует локального доступа и базовых прав, но позволяет легко нарушить конфиденциальность, целостность и доступность системы. Риск обусловлен низкой сложностью эксплуатации и максимальным воздействием на все ключевые аспекты безопасности.
Ошибка возникает из-за off-by-one при расчете размера буфера для аргументов командной строки. Когда пользователь запускает sudoedit -s
, а последний аргумент заканчивается обратным слешем (\
), происходит переполнение буфера в куче. Это позволяет перезаписать соседние структуры данных, включая служебные поля glibc, такие как указатели в tcache (механизм кэширования памяти в glibc ≥2.26).
Условия эксплуатации
-
Локальный доступ: Атакующий должен иметь возможность выполнить команду через
sudo
с любыми правами (даже ограниченными). -
Версия sudo: До 1.9.5p2.
-
Наличие glibc с tcache: Версия glibc ≥2.26 (для работы с кучей).
-
Отсутствие nscd: Сервис
nscd
(Name Service Cache Daemon) не должен быть активен, так как он может блокировать перезапись структурservice_user
.
Анализ эксплойтов
1. Эксплойт exploit_nss.py
Этот Python-скрипт использует переполнение для подмены структуры service_user
в glibc, заставляя sudo загрузить вредоносную библиотеку libnss_X/X1234.so.2
.
Ключевые этапы работы:
-
Проверка уязвимости:
Скрипт проверяет реакцию sudo на неверные аргументы:def check_is_vuln(): # Запуск sudoedit с некорректными аргументами execve(SUDO_PATH, [b"sudoedit", b"-s", b"-A", b"/aa", None], [None]) # Анализ сообщения об ошибке
-
Создание поддельной библиотеки:
Библиотекаlibnss_X/X1234.so.2
содержит код, который выполняется при загрузке через NSS:def create_libx(name): with open(so_path, "wb") as f: f.write(zlib.decompress(base64.b64decode(libx_b64)))
-
Манипуляция переменными окружения:
Скрипт формирует специальные переменныеLC_*
, чтобы спровоцировать переполнение:env = [b"Z" * (TARGET_OFFSET_START + 0xF - 8 - 1) + b"\\"] + FAKE_USER_SERVICE env.extend([lc_env(0, 0x40) + b";A=", lc_env(1, CHUNK_CMND_SIZE)])
2. Эксплойт Baron Samedit (exploit.asm)
Ассемблерный код формирует аргументы и окружение для вызова sudoedit
, вызывая переполнение и выполнение шеллкода.
Ключевые элементы:
-
Подготовка аргументов:
Аргументыsudoedit -s
дополняются строкой с обратным слешем:mX7ZTQJp3L2 db 'sudoedit', 0 oNTZ45KX db "-s", 0
-
Шеллкод:
Код вshellcode.c
выполняетsetuid(0)
,setgid(0)
и запускает/bin/sh
:__asm__( "movq $105, %rax;" // setuid(0) "movq $59, %rax;" // execve("/bin/sh") );
Способы защиты
-
Обновление sudo: Установите версию 1.9.5p2 или новее.
-
Ограничение прав sudoers:
В файле/etc/sudoers
ограничьте использованиеsudoedit
:Defaults !sudoedit
-
Мониторинг активности:
Следите за подозрительными вызовамиsudoedit
с аргументом-s
.
