Уязвимость функции parse_args() программы системного администрирования Sudo
Уязвимость функции parse_args() программы системного администрирования Sudo
Категория: Программы Теги: Уязвимости Опубликовано: 19 мая 2025

Уязвимость 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

  1. AV:L (Вектор атаки: Локальный) – Требуется локальный/физический доступ к системе.

  2. AC:L (Сложность атаки: Низкая) – Эксплуатация проста и не требует сложных условий.

  3. PR:L (Привилегии: Низкие) – Нужны базовые права доступа (например, учётная запись).

  4. UI:N (Взаимодействие: Нет) – Участие пользователя не требуется.

  5. S:U (Область: Неизменная) – Влияет только на уязвимый компонент.

  6. C:H (Конфиденциальность: Высокое) – Полная утечка данных.

  7. I:H (Целостность: Высокое) – Возможность полного изменения данных.

  8. A:H (Доступность: Высокое) – Серьёзное нарушение работоспособности.

Интерпретация: Уязвимость высокой опасности (7.8) требует локального доступа и базовых прав, но позволяет легко нарушить конфиденциальность, целостность и доступность системы. Риск обусловлен низкой сложностью эксплуатации и максимальным воздействием на все ключевые аспекты безопасности.

Ошибка возникает из-за off-by-one при расчете размера буфера для аргументов командной строки. Когда пользователь запускает sudoedit -s, а последний аргумент заканчивается обратным слешем (\), происходит переполнение буфера в куче. Это позволяет перезаписать соседние структуры данных, включая служебные поля glibc, такие как указатели в tcache (механизм кэширования памяти в glibc ≥2.26).

Условия эксплуатации

  1. Локальный доступ: Атакующий должен иметь возможность выполнить команду через sudo с любыми правами (даже ограниченными).

  2. Версия sudo: До 1.9.5p2.

  3. Наличие glibc с tcache: Версия glibc ≥2.26 (для работы с кучей).

  4. Отсутствие 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")
    );

Способы защиты

  1. Обновление sudo: Установите версию 1.9.5p2 или новее.

  2. Ограничение прав sudoers:
    В файле /etc/sudoers ограничьте использование sudoedit:

    Defaults !sudoedit
  3. Мониторинг активности:
    Следите за подозрительными вызовами sudoedit с аргументом -s.

Алексей Черемных Алексей Черемных
107