Уязвимость, позволяющая подставить escape-последовательности в чужие терминалы

В утилите wall, поставляемой в пакете util-linux и предназначенной для отправки сообщений в терминалы, выявлена уязвимость (CVE-2024-28085), позволяющая осуществить атаку на терминалы других пользователей через манипуляцию с escape-последовательностями. Проблема вызвана тем, что утилита wall блокирует использование escape-последовательности во входном потоке, но не выполняет эту операцию для аргументов в командной строке, что позволяет атакующему
выполнить escape-последовательности в терминале других пользователей.

Например, выполнив ‘wall $(printf “33[33mHI”)’ можно вывести надпись “HI” жёлтым цветом. При помощи escape-последовательностей, которые позволяют перемещать указатель, очищать и заменять содержимое на экране, можно симулировать показ приглашения о вводе пароля от утилиты sudo в терминале другого пользователя. Если пользователь не заметит подвоха и введёт свой пароль, то пароль засветится в истории ввода как несуществующая команда (по сути пользователь вместо команды введёт свой пароль в командной строке).

“33[3A” // перемещаем курсор вверх на 3 строк “33[K” // удаляем предыдущий вывод “[sudo] password for a_user:” // выводим фиктивный запрос sudo “33[?25l” // выставляем фоновый цвет для скрытия ввода “33[38;2;48;10;36m”

Во время вывода предупреждения о том, что введённая команда не найдена, во многих дистрибутивах запускается обработчик /usr/lib/command-not-found, который пытается определить пакет, в котором присутствует отсутствующая команда, и выдать подсказку о возможности его установки. Проблема в том, что при запуске обработчика command-not-found несуществующая команда передаётся в него в качестве параметра командной строки, который виден при просмотре процессов в системе (например, при попытке запуска неустановленной утилиты “xsnow” в списке процессов будет виден “/usr/lib/command-not-found — xsnow”). Соответственно, атакующий может организовать мониторинг запускаемых процессов (например, анализируя появление “/proc/$pid/cmdline” для прогнозируемого номера PID) и определить пароль, введённый жертвой в командной строке.

Для того чтобы пользователь ввёл пароль в ответ на фиктивное приглашение sudo предложен трюк, суть которого в отслеживании в списке процессов реального запуска утилиты sudo, ожидания её завершения и осуществления атаки через “wall” сразу после этого. Через манипуляции c escape-последовательностями атакующий может заменить сообщение после реального выполнения sudo на фиктивное приглашение повторного ввода пароля. Жертва может подумать, что ошиблась при вводе и ввести пароль второй раз, засветив пароль в аргументах обработчика “command-not-found”.

Для успешной атаки требуется установка режима “mesg” в значение “y”, которое по умолчанию выставлено в Ubuntu, Debian и CentOS/RHEL. Возможность проведения атаки продемонстрирована в Ubuntu 22.04 в конфигурации по умолчанию при использовании gnome-terminal. В Debian атака затруднена, так как в дистрибутиве по умолчанию не включён обработчик “command-not-found”, а в CentOS/RHEL атака не сработает, так как утилита wall установлена без флага setgid и не имеет доступа к чужим терминалам. При использовании windows-terminal атака может быть модифицирована для изменения содержимого буфера обмена.

Уязвимость проявляется в пакете util-linux с 2013 года, после того как в выпуск 2.24 добавили возможность указания сообщения в командной строке wall, но забыли применить чистку escape-последовательностей. Исправление уязвимости включено во вчерашний выпуск util-linux 2.40. Примечательно, что при попытке исправления уязвимости в выпуске util-linux 2.39 была выявлена ещё одна похожая уязвимость, позволяющая совершить подстановку escape-последовательности через манипуляцию с локалями.

Release. Ссылка here.