Уязвимость функции stdin getln программы системного администрирования Sudo
Уязвимость функции stdin getln программы системного администрирования Sudo
Категория: Программы Теги: Уязвимости Опубликовано: 22 июня 2025

Уязвимость BDU:2020-00855 (CVE-2019-18634) Sudo

Уязвимость BDU:2020-00855 (CVE-2019-18634) переполнение буфера в функции stdin_getln программы Sudo (1.7.1–1.8.26), позволяющее повышение привилегий.
Механизм: При включенной опции pwfeedback в /etc/sudoers неправильная обработка символов управления (Ctrl+U, Backspace) приводит к записи за границы стека.

Анализ уязвимости

Уровень опасности: 7.8 HIGH
Вектор атаки: 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 (Доступность: Высокий) - Возможность полного контроля над системой.


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

  1. Версия Sudo 1.7.1–1.8.26 с активированной опцией pwfeedback (по умолчанию отключена).

  2. Доступ к системе: Локальный пользователь с правами выполнения sudo.

  3. Конфигурация: Параметр pwfeedback добавлен в /etc/sudoers:

    Defaults pwfeedback

Технический анализ эксплойтов

Рассмотрим код эксплоитов для понимания работы вектора атаки с использованием уязвимости CVE-2019-18634.

1. Эксплойт на C (Ubuntu)

Механизм:

  • Создает псевдотерминал (pty) для обхода проверок терминала.

  • Формирует payload с символами sudo_term_kill (Ctrl+U, 0x15) для сброса счетчика буфера.

  • Перезаписывает флаг tgetpass_flags значением 0x04 (TGP_ASKPASS), заставляя Sudo выполнить эксплойт как программу-запрос пароля.

  • Обнуляет user_details.uid, отключая сброс привилегий.

Ключевой фрагмент:

uint8_t payload[OVERFLOW_SIZE + 5] = {0};
payload[KILL_OFFSET * 1] = sudo_term_kill; // 0x15
payload[TGP_OFFSET + 2] = TGP_ASKPASS;     // 0x04
write(ptyfd, payload, sizeof(payload));    // Отправка вредоносных данных

2. Эксплойт self-contained.sh

Механизм:

  • Использует socat для эмуляции терминала.

  • Генерирует Perl-скрипт, формирующий бинарный payload:

    print("\x00\x15"x256 ... "\x04\x00\x00\x00" ... "\n"); // Запись в tgetpass_flags
  • Компилирует программу, которая устанавливает SUID-бит на себя при запуске через sudo.

Результат:
После выполнения /tmp/pipe получает права root:

$ ls -l /tmp/pipe
-rwsr-xr-x 1 root root 16744 Feb 15 09:23 /tmp/pipe

3. Эксплойт на Python (pwntools)

Механизм:

  • Открывает псевдотерминал с помощью os.openpty().

  • Формирует payload, перезаписывающий структуры памяти:

    payload  = (b'\x00\x15') * (tgetpass_flags - buf)  # Заполнение буфера
    payload += p64(TGP_ASKPASS)                         # Установка флага
    payload += p32(0) * 10                              # Обнуление user_details
  • Запускает reverse-shell при успехе.

4. Эксплойт для Linux Mint

Особенность:
Использует переменную окружения PLEASE_EXEC_MY_SHELL для рекурсивного вызова эксплойта с правами root:

envp[1] = "PLEASE_EXEC_MY_SHELL=/bin/sh"; // Активация оболочки при повторном запуске

Что может получить злоумышленник?

  1. Полные права root: Чтение/запись любых файлов (/etc/shadow, системные конфиги).

  2. Установка бэкдоров: Добавление SSH-ключей, модификация crontab.

  3. Атаки на соседние системы: Использование доверенных отношений (SSH, NFS).

  4. Сбор конфиденциальных данных: Доступ к БД, файлам приложений.


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

  1. Обновление Sudo:

    sudo apt update && sudo apt install sudo

    Минимальная безопасная версия: 1.8.31.

  2. Отключение pwfeedback:
    Удалить строку Defaults pwfeedback из /etc/sudoers.

  3. Контроль целостности бинарников:
    Использование auditd для мониторинга изменений:

    auditctl -w /usr/bin/sudo -p wa -k sudo_changes
  4. Правило для Suricata (IDS):
    Обнаружение активации pwfeedback в конфигах:

    alert tcp any any -> any any (msg:"Sudo pwfeedback exploitation attempt"; 
    content:"Defaults"; content:"pwfeedback"; nocase; metadata:policy security-ips; sid:1000001;)
  5. Mandatory Access Control:
    Ограничение прав Sudo с помощью SELinux/AppArmor:

    # AppArmor профиль
    deny /usr/bin/sudo px, # Блокировка исполняемых файлов
Алексей Черемных Алексей Черемных
43