Уязвимость, позволяющая подставить 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 была выявлена ещё одна похожая уязвимость, позволяющая совершить подстановку управляющих символов через манипуляцию с локалями.

Источник: http://www.opennet.ru/opennews/art.shtml?num=60869