Удалённо эксплуатируемые уязвимости в сервере печати CUPS

Симоне Маргарителли (Simone Margaritelli), автор межсетевого экрана OpenSnitch и сетевого анализатора bettercap, досрочно раскрыл информацию о ранее анонсированных критических уязвимостях, позволяющих удалённо атаковать дистрибутивы GNU/Linux, Solaris, FreeBSD и некоторые другие BSD-системы. Изначально публикация была запланирована на 6 октября, но из-за утечки информации сведения пришлось опубликовать досрочно, до того как большинство дистрибутивов успеет подготовить обновление пакетов. Уязвимости затрагивают сервер печати CUPS и позволяют удалённо без прохождения аутентификации добиться выполнения кода в системе.

Выявившим проблему исследователем подготовлен рабочий прототип эксплоита, использующий комбинацию из нескольких уязвимостей и позволяющий удалённо выполнить код с правами процесса обработки заданий вывода на печать CUPS (обычно это пользователь “lp”). Эксплоит позволяет незаметно заменить параметры принтера пользователя или добавить новый принтер, связанный с запущенным атакующим IPP-сервером, который отдаёт специально оформленное PPD-описание принтера, Обработка данного PPD во время запуска работы вывода на печать приводит к выполнению кода атакующего (необходимо, чтобы жертва инициировала печать на подставленный или заменённый атакующим принтер).

Атаке подвержены системы с сервером печати CUPS и запущенным процессом cups-browsed, принимающим сетевые соединения на 631 порту (UDP). Атака также может быть совершена из локальной сети, в которой для доступа к серверу печати используются протоколы zeroconf, mDNS или DNS-SD. Уязвимы только конфигурации cups-browsed в которых в файле
/etc/cups/cups-browsed.conf в параметре BrowseRemoteProtocols указано значение “cups”. В дистрибутивах с systemd проверить использование сервиса cups-browsed можно командой “sudo systemctl status cups-browsed”.

Уязвимость проявляется во всех системах печати на базе CUPS, в которых используются уязвимые версии пакетов cups-filters, libcupsfilters, libppd и cups-browsed. Исправления пока доступны только в виде патчей (1, 2, 3) – актуальные версии cups-filters 2.0.1, libcupsfilters 2.1b1, libppd 2.1b1 и cups-browsed 2.0.1 подвержены уязвимостям. В дистрибутивах проблема остаётся неисправленной, проследить за появлением обновлений можно на следующих страницах: Debian, Ubuntu, RHEL, SUSE/openSUSE, Fedora, Arch, FreeBSD. В качестве обходного пути защиты до установки обновления можно закрыть для внешних сетей доступ к UDP-порту 631, отключить сервис cups-browsed или выставить настройку BrowseRemoteProtocols в значение “none”.

Выявленные уязвимости:

  • CVE-2024-47176 – уязвимость в процессе cups-browsed, который создаёт сетевой сокет, принимающий соединения на 631 порту, прикрепляемый ко всем имеющимся в системе сетевым интерфейсам и принимающий IPP-запросы “Get-Printer-Attributes” от любых внешних систем. Через манипуляцию с данным сервисом можно добиться добавления в систему принтера, контролируемого атакующим, и эксплуатировать через передачу PPD-конфигурации уязвимости в других компонентах CUPS.
  • CVE-2024-47177 – узявимость в обработчике foomatic-rip из набора cups-filters, позволяющая добиться выполнения кода через передачу параметра FoomaticRIPCommandLine в PPD-файле, который атакующий может передать благодаря вышеописанной уязвимости в cups-browsed. Указанные в параметре FoomaticRIPCommandLine shell-команды выполняются как есть, без учёта того, что параметр может выставить посторонний. Например, для записи в файл /tmp/VULNERABLE можно указать “FoomaticRIPCommandLine: “echo 1 > /tmp/VULNERABLE”.
  • CVE-2024-47175 – уязвимость в libppd, вызванная отсутствием проверки корректности значения ppdCreatePPDFromIPP2 при записи IPP-атрибутов во временный PPD-файл. Проблема позволяет добиться подстановки произвольных данных в результирующий PPD-файл через прикрепление атрибутов, используя символ перевода строки. Например, можно обойти проверку и вместе с разрешёнными атрибутами подставить атрибут FoomaticRIPCommandLine для эксплуатации вышеотмеченной уязвимости в cups-filters.
  • CVE-2024-47076 – уязвимость в библиотеке libcupsfilters из пакета cups-filters, связанная с отсутствием проверки значений cfGetPrinterAttributes5, возвращаемых внешним IPP-сервером, что даёт атакующему возможность организовать обработку произвольных IPP-атрибутов в других подсистемах CUPS, например, при генерации PPD-файлов.

Сценарий атаки на CUPS сводится к следующим шагам:

  • Развёртывание атакующим собственного IPP-сервера.
  • Отправка жертве UDP-пакета со ссылкой на принтер, привязанный к запущенному атакующим IPP-серверу.
  • После получения данного пакета система жертвы подключается к IPP-серверу атакующего и запрашивает атрибуты принтера.
  • В ответ на запрос жертвы IPP-сервер атакующего возвращает PPD-файл с атрибутами, среди которых указывается атрибут FoomaticRIPCommandLine. Данный атрибут прикрепляется к одному из допустимых атрибутов, используя символ “n” в одной строке (например, “cupsPrivacyURI: “https://www.google.com/n*FoomaticRIPCommandLine: “), что позволяет обойти проверку и приводит к записи FoomaticRIPCommandLine как отдельного атрибута при сохранении полученных данных во временный файл.
  • В результате обработки переданных атрибутов в системе жертвы создаётся PPD-файл:

    *cupsSNMPSupplies: False
    *cupsLanguages: “en”
    *cupsPrivacyURI: “https://www.google.com/”
    *FoomaticRIPCommandLine: “echo 1 > /tmp/I_AM_VULNERABLE”
    *cupsFilter2 : “application/pdf application/vnd.cups-postscript 0 foomatic-rip”
    *cupsSingleFile: True
    *cupsFilter2: “application/vnd.cups-pdf application/pdf 0 -”
  • При выводе на печать на подставленный атакующим принтер на системе жертвы будет выполнена команда “echo 1 > /tmp/I_AM_VULNERABLE”

Release. Ссылка here.