Security Week 2440: уязвимость CUPS переменной опасности
Главным событием прошлой недели в области информационной безопасности стало обнаружение четырех уязвимостей в службе печати Common Unix Printing System. Уязвимости актуальны для множества Linux- и Unix-дистрибутивов. И сами уязвимости, и способ их эксплуатации, разработанный первооткрывателем, исследователем Симоном Маргарителли, представляют большой интерес. Впрочем, помимо технических особенностей проблемы, на прошлой неделе также имела место драма со сложностями процесса ответственного раскрытия информации, а также с чрезмерным обсуждением персональных особенностей людей, вовлеченных в процесс.
Суть исследования Маргарителли приведена на скриншоте выше: в некоторых случаях мы можем обратиться к серверу, на котором установлен и запущен компонент cups-browsed, и без спроса добавить собственный принтер. С помощью всех остальных уязвимостей мы можем вызвать выполнение произвольного кода. Звучит страшновато, но для объективной оценки лучше сослаться на бюллетень компании Canonical: проблема затрагивает в основном десктопные системы и не может быть проэксплуатирована без участия пользователя. У этой простой формулировки есть множество дополнений мелким шрифтом, которые мы постараемся кратко изложить далее.
Сухие строчки бюллетеня Canonical заметно контрастируют с эмоциональным отчетом исследователя Симона Маргарителли. Путь к выполнению произвольного кода начался со сканирования открытых портов на ноутбуке со свежеустановленной ОС Ubuntu. Было обнаружено, что эта система держит открытым порт 631 по протоколу UDP и ответственность за это несет служба, известная как cups-browsed.
Она отвечает за автоматическое обнаружение и добавление принтеров. Подключение к порту позволяет инициировать добавление принтера извне. В конфигурационном файле cups-browsed есть возможность ввести ограничения на то, кому система будет отвечать по данному порту, но по умолчанию допускаются любые подключения. Вся эта функциональность является реализацией протокола Internet Printing Protocol.
Здесь Симон делает небольшое отступление: он применил метод фаззинга и нашел несколько случаев падения cups-browsed во время коммуникации по порту 631. Но последствия этих ошибок обработки данных он не расследовал: возможно, позднее они приведут к обнаружению иных уязвимостей. В основной ветке работы использовалась штатная функциональность данной подсистемы, которая позволила добавить ничего не подозревающему пользователю системы на базе Linux «левый принтер»:
Если вернуться к скриншоту в начале текста, можно отметить, что во время обращения к cups-browsed происходит также раскрытие информации о системе. Как минимум становится известна версия ядра Linux, а в некоторых случаях может раскрываться имя пользователя. Это первая из найденных уязвимостей, получившая идентификатор CVE-2024–47176: то, что cups-browsed отвечает на любой запрос и позволяет произвольно добавлять принтеры в систему, уже является проблемой.
Что еще хуже, во время добавления принтера потенциальный злоумышленник контролирует несколько строк с его параметрами, которые не проверяются атакуемой системой. Это краткое описание еще двух уязвимостей в компонентах libcupsfilters и libppd, соответственно CVE-2024–47076 и CVE-2024–47175. В CUPS также входит пакет cups-filters, одной из задач которого является конверсия поступающих на печать данных в «понятный» для принтера формат. В составе этого пакета имеется исполняемый файл foomatic-rip, в котором также обнаружилась проблема.
Преобразователи данных из одного формата в другой традиционно становятся целью атак. Не стал исключением и код foomatic-rip. В 2011 году в нем была закрыта уязвимость, приводящая к выполнению произвольного кода, если при печати использовался именно этот обработчик данных. Проблема в том, что этот патч не был портирован в основной код CUPS. Уязвимость по факту не была закрыта, и Маргарителли ей воспользовался. Это четвертая уязвимость в цепочке атаки, получившая идентификатор CVE-2024–47177.
Собираем атаку. Через «не баг, но фичу» cups-browsed добавляем принтер в систему. На этом этапе нам вообще не требуется какое-либо действие пользователя, все происходит автоматически. На этапе добавления задаем параметры «принтера», включая обращение к foomatic-rip с произвольными параметрами. Эти «параметры» (в примере Симона: echo 1 >/tmp/PWNED
) будут выполнены при попытке печати чего угодно на заранее установленный потенциальным злоумышленником «принтере».
А теперь поговорим о сопутствовавшей данному исследованию драме. Маргарителли, будучи достаточно эмоциональным человеком, явно был не в восторге от процесса коммуникации с мейнтейнерами CUPS. Обнаружение уязвимости и построение Proof of Concept заняли два дня, в то время как общение с ответственными за подсистему печати в общей сложности длилось больше трех недель (что вообще-то нельзя назвать чем-то из ряда вон выходящим). В результате еще до раскрытия информации 26 сентября ходили слухи о какой-то грандиозной уязвимости в Linux с рейтингом по шкале CVSS чуть ли не 9,9 балла из 10 возможных. Когда в реальности выяснилось, что речь идет все же об (а) относительно легкоустранимой и (б) затрагивающей сравнительно небольшое количество систем проблеме, наступила стадия легкого разочарования.
Маргарителли начали обвинять в хайпе на не столь существенной проблеме, он едко отвечал на подобные комментарии в соцсетях, нападал на СМИ, обвинял разработчиков в затягивании процесса и так далее. Среди всего этого неконструктивного диалога есть только один интересный момент: откуда взялась оценка уязвимости (четвертой, в cups-filters и foomatic-rip) в 9,9 балла? Маргарителли тут вроде бы ни при чем, оценку предложил в приватной переписке один из разработчиков Red Hat. Позднее она была пересмотрена до 9 баллов ровно.
То есть происходил приватный диалог в закрытой группе, в ходе которого кто-то предположил оценку уязвимости. Никто не собирался публиковать информацию, пока все стороны не придуи к общему мнению, чтобы не вызывать излишнюю панику. Проблема в том, что эту переписку слили: 24 сентября в общий доступ попало приватное обсуждение уязвимости на площадке американского CERT. Впрочем днем ранее, 23 сентября, оценку уязвимости в 9,9 балла выложил в паблик сам Маргарителли, красочно расписав свою фрустрацию от затягивания процесса responsible disclosure. Вывод из этой истории заключается в том, что все стороны процесса при обсуждении уязвимости должны… ну, например, соблюдать спокойствие и проявлять выдержку. Предварительное обсуждение, в котором оценивается опасность свежеобнаруженной проблемы, должно быть приватным именно для того, чтобы не допускать излишних спекуляций.
А так получилось, что (из-за утечки с портала CERT VINCE) уязвимость раскрыли во всей полноте еще до выпуска патчей. Отметим, что по-настоящему эффект от обнаружения данной уязвимости пока трудно оценить. Относительно легко устраняется, возможно, только данная конкретная цепочка эксплуатации, в то время как внутри CUPS может быть множество других проблем.
По независимой оценке, 29 сентября в сети обнаруживались больше ста тысяч систем, отвечающих на запросы на порт 631 по протоколу UDP. Что это за системы — вопрос, который тоже предстоит исследовать. Одно дело, когда это относительно легко обновляемые настольные компьютеры под Linux (с белым IP), другое — если речь идет о роутерах с системой CUPS, которые будут обновляться очень медленно или вообще не получат патч. Относительно хорошей новостью является тот факт, что CUPS по умолчанию не устанавливается в серверных версиях ОС, но, возможно, и из этого правила могут быть какие-то немногочисленные исключения. В любом случае речь идет о достаточно серьезной прорехе в безопасности Unix-подобных систем.
Что еще произошло
Не менее впечатляющее исследование на прошлой неделе опубликовал исследователь Сэм Карри. Он и его команда нашли серьезную прореху в веб-сервисе компании KIA, который позволял удаленно разблокировать двери и запускать двигатель в большом числе автомобилей этого производителя. Для начала атаки требовалось знать только госномер автомобиля.
Исследователи «Лаборатории Касперского» подробно разбирают троян Necro, который распространялся вместе с рядом приложений в магазине Google Play.
ИИ-фича Windows Recall возвращается. Об этой функции и потенциальных проблемах с безопасностью собираемых ей данных (по сути, скриншотов экрана каждые несколько минут) мы писали ранее. После того как фича была раскритикована, Microsoft взяла паузу, и теперь снова готова внедрить ее в ближайшем будущем. С рядом улучшений безопасности: доступ к «истории активности пользователя» теперь будет возможен, только если подтверждено наличие самого пользователя у компьютера. Кроме того, Recall можно будет отключить и даже полностью удалить из системы.
Серьезная проблема (9 баллов по шкале CVSS) закрыта в наборе решений для виртуализации NVIDIA Container Toolkit. Уязвимость при худшем сценарии позволяет провести «побег из «песочницы» и получить полный контроль над хостом.