Гостевая статья CVE-2019-18634 (Buffer overflow когда pwfeedback занесен в sudoers)

Без названия.jpg

Что имеем:
Параметр Sudo pwfeedback может использоваться для обеспечения визуальной обратной связи, когда пользователь вводит свой пароль. Для каждого нажатия клавиши печатается звездочка. Эта опция была добавлена в ответ на путаницу пользователей по поводу того, как стандартная подсказка Password: отключает отображение нажатий клавиш. Хотя pwfeedback не включен по умолчанию в исходной версии sudo, некоторые системы, такие как Linux Mint и Elementary OS, включают его в своих файлах sudoers по умолчанию. Из-за ошибки, когда опция pwfeedback включена в файле sudoers, пользователь может вызвать переполнение буфера в стеке. Эта ошибка может быть вызвана даже пользователями, не указанными в файле sudoers. Нет никакого влияния, если pwfeedback не был включен.

Изменения в версиях Sudo:
С версии Sudo 1.7.1 до 1.8.25p1 включительно это имеет значение, но только если в sudoers включена опция pwfeedback. Хотя логическая ошибка также присутствует в версиях sudo с 1.8.26 по 1.8.30, она не может быть использована из-за изменений в обработке EOF, представленных в sudo 1.8.26.
Пользователь с привилегиями sudo может проверить, включен ли pwfeedback, запустив:
sudo -l
Если pwfeedback указан в выходных данных «Дефолтные записи по умолчанию», это повлияет на конфигурацию sudoers. В следующем примере конфигурация sudoers уязвима:
Код:
$ sudo -l
    Matching Defaults entries for millert on linux-build:
    insults, pwfeedback, mail_badpass, mailerpath=/usr/sbin/sendmail

    User millert may run the following commands on linux-build:
    (ALL : ALL) ALL

CVE ID:
This vulnerability has been assigned in the database.

Детали:
Эксплуатация ошибки не требует разрешений sudo, просто включите pwfeedback. Ошибка может быть воспроизведена путем передачи большого ввода в sudo через канал, когда он запрашивает пароль. Например:
Код:
$ perl -e 'print(("A" x 100 . "\x{00}") x 50)' | sudo -S id
    Password: Segmentation fault

Есть два недостатка, которые способствуют этой уязвимости:
  • Параметр pwfeedback не игнорируется, как должно быть, при чтении с чего-либо другого, кроме терминального устройства. Из-за отсутствия терминала сохраненная версия символа стирания строки остается в своем первоначальном значении 0.
  • Код, удаляющий строку звездочек, не сбрасывает должным образом позицию буфера в случае ошибки записи, но сбрасывает оставшуюся длину буфера. В результате функция getln () может записывать после конца буфера.
В системах с однонаправленными каналами попытка записи в конец канала чтения приведет к ошибке записи. Поскольку оставшаяся длина буфера неправильно сбрасывается при ошибке записи при удалении строки, буфер в стеке может быть переполнен.

Влияние:
Это не повлияет, если pwfeedback не включен в файле sudoers.
Если в sudoers включен pwfeedback, переполнение стека может позволить непривилегированным пользователям перейти в корневую учетную запись. Поскольку злоумышленник полностью контролирует данные, используемые для переполнения буфера, существует высокая вероятность использования.

Временное решение:
Если в файле sudoers включена функция pwfeedback, достаточно отключить его, ожидая восклицательный знак, чтобы предотвратить использование ошибки. Например, изменить:
Defaults pwfeedback
На:
Defaults !pwfeedback
После отключения pwfeedback в sudoers с помощью команды visudo, пример вывода sudo -l становится:
Код:
$ sudo -l
    Matching Defaults entries for millert on linux-build:
    insults, mail_badpass, mailerpath=/usr/sbin/sendmail

    User millert may run the following commands on linux-build:
    (ALL : ALL) ALL

Исправлено:
Баг был исправлен в sudo 1.8.31.

Баг был обнаружен и проанализирован Joe Vennix из Apple Information Security

Источник:
 
Последнее редактирование:
  • Нравится
Реакции: DarkDepth
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!