Root-уязвимость в sudo, затрагивающая Linux Mint и Elementary OS

В утилите sudo, используемой для организации выполнения команд от имени других пользователей, выявлена уязвимость (CVE-2019-18634), позволяющая повысить свои привилегии в системе до пользователя root. Проблема проявляется начиная с выпуска sudo 1.7.1 только при использовании в файле /etc/sudoers опции "pwfeedback", которая отключена по умолчанию, но активирована в некоторых дистрибутивах, таких как Linux Mint и Elementary OS. Проблема устранена в выпуске sudo 1.8.31, опубликованном несколько часов назад. В дистрибутивах уязвимость пока остаётся неисправленной.

Опция "pwfeedback" включает отображение символа "*" после каждого введённого символа при вводе пароля. Из-за ошибки в реализации функции getln(), определённой в файле tgetpass.c, переданная через стандартный входной поток (stdin) слишком большая строка с паролем при определённых условиях может не уместиться в выделенный буфер и переписать другие данные в стеке. Переполнение возникает во время выполнения кода sudo с правами root.

Суть проблемы в том, что при использовании в процессе ввода спецсимвола ^U (очистка строки) и при сбое операции записи, код, отвечающий за очистку выведенных символов "*", сбрасывает данные о доступном размере буфера, но не возвращает в исходное значение указатель на текущую позицию в буфере. Другим фактором, способствующим эксплуатации, является отсутствие автоматического отключения режима "pwfeedback" при поступлении данных не с терминала, а через входной поток (данная недоработка позволяет создать условия для возникновения ошибки записи, например, на системах с однонаправленными неименованными каналами ошибка возникает при попытке записи за конец канала для чтения).

Так как атакующий может полностью контролировать перезапись данных в стеке, не представляет трудности создание эксплоита, позволяющего повысить свои привилегии до пользователя root. Проблема может быть эксплуатирована любым пользователем, независимо от прав на использование sudo и наличия специфичных для пользователя настроек в sudoers. Для блокирования проблемы следует убедиться в отсутствии в /etc/sudoers настройки "pwfeedback" и при необходимости отключить её ("Defaults !pwfeedback"). Для проверки наличия проблемы можно выполнить код:

   
$ perl -e 'print(("A" x 100 . "\x{00}") x 50)' | sudo -S id
Password: Segmentation fault