PrintNightmare CVE-2021-34527: правильный порядок hardening, когда клиенты уже отключают Print Spooler на DC
Microsoft выпустила экстренный патч для PrintNightmare. Разбираем, почему отключение Print Spooler на DC - неправильный первый шаг, и как выстроить GPO Point and Print restrictions до того, как трогать службу.
Microsoft выпускает экстренный out-of-band патч для CVE-2021-34527 - RCE через Windows Print Spooler с публичным PoC в открытом доступе
В пятницу 2 июля на GitHub появился публичный PoC для PrintNightmare - уязвимости в Windows Print Spooler, которая позволяет неаутентифицированному удалённому пользователю выполнить произвольный код с правами SYSTEM. CVE-2021-34527, CVSS 8.8. К выходным PoC видел весь мир, и наши клиенты начали звонить.
Экстренный патч Microsoft выпустила 6-7 июля - в зависимости от версии ОС. Это out-of-band релиз, вне обычного Patch Tuesday. Но до патча и параллельно с ним разворачивается вполне понятная паника: «отключаем Print Spooler на всех DC прямо сейчас». Вот тут начинается история про то, как лекарство сносит пациента.
Почему Print Spooler на DC - это вообще риск
Print Spooler (spoolsv.exe) запускается по умолчанию на всех Windows-машинах, включая Domain Controllers. На DC он никому не нужен в штатной роли - принтеры к контроллерам домена никто не подключает. Но служба работает, слушает, и уязвимость в ней позволяет через функцию RpcAddPrinterDriverEx() заставить систему загрузить произвольную DLL с правами SYSTEM.
На обычной рабочей станции это неприятно. На DC это катастрофа: SYSTEM на контроллере домена - это фактически полный контроль над доменом.
Поэтому инстинкт «выключи службу на DC» абсолютно верный. Проблема - в порядке действий и в том, что происходит с остальной инфраструктурой.
Что ломается, когда отключают Spooler на DC в первую очередь
Несколько клиентов до звонка к нам уже успели остановить Print Spooler на всех контроллерах домена. Картина в понедельник утром выглядела предсказуемо неприятно.
Point and Print перестаёт работать. Если в инфраструктуре используется автоматическая установка принтеров через GPO с драйверами, которые раздаются с DC или через SYSVOL, - это всё падает. Пользователи теряют принтеры при логоне или не могут установить новые.
Печать через print server продолжает работать, но с нюансами. Если print server - это отдельный сервер, а не DC, сама очередь печати жива. Но там могут быть свои проблемы с аутентификацией Kerberos и делегированием, которые внезапно вылезают.
Юзеры начинают устанавливать принтеры вручную - напрямую по IP, с локальными драйверами. Это ровно то, от чего Point and Print должен был защищать: произвольные драйверы, непонятно откуда, на пользовательских машинах.
Правильный порядок
Мы в итоге выработали такую последовательность для клиентов, где остановка Spooler на DC вообще возможна.
Первое - немедленно применить патч. Если патч поставлен, уязвимость закрыта. Отключение Spooler становится defence-in-depth, а не экстренной мерой. Это даёт время сделать всё остальное без паники.
Второе - настроить GPO Point and Print Restrictions до отключения службы. Это ключевой шаг, который большинство пропускает. В Group Policy: Computer Configuration - Administrative Templates - Printers - Point and Print Restrictions. Там нужно:
- включить политику;
- указать явный список доверенных print servers (
When installing drivers for a new connectionиWhen updating drivers for an existing connection- оба наShow warning and elevation promptили жёстче); - убедиться, что пользователи не могут устанавливать драйверы с произвольных серверов.
Это само по себе снижает attack surface: даже при работающем Spooler злоупотребить Point and Print для установки вредоносного драйвера становится труднее.
Третье - инвентаризация ролей Print Spooler. Пройтись по всем серверам: где служба реально нужна, где она работает по умолчанию и никем не используется. DC, серверы без ролей печати - кандидаты на отключение. Print server - нет.
Четвёртое - отключить Spooler на DC. Только теперь, когда GPO настроены, патч применён, печать через выделенные print servers проверена. Останавливаем службу и переводим в Disabled:
Stop-Service -Name Spooler -Force
Set-Service -Name Spooler -StartupType Disabled
На всех DC через желаемую GPO или скриптом. Проверяем, что ничего не сломалось в части печати у пользователей.
Что с патчем на практике
Первая версия патча (6-7 июля) закрывала удалённый вектор, но оставляла вопросы по локальному privilege escalation - там несколько исследователей сразу же указали на неполноту. Microsoft выпустила уточнение и дополнительные рекомендации, в том числе по реестровым ключам NoWarningNoElevationOnInstall и UpdatePromptSettings - оба должны быть в 0 или отсутствовать, иначе патч обходится.
Из того, что видим на клиентских инфраструктурах: реестровые ключи, ослабляющие Point and Print, встречаются в средах, где кто-то когда-то «починил проблему с установкой принтеров» через гугл. Найти и убрать их - отдельная задача при аудите.
Где сейчас
На клиентах из managed-сопровождения Spooler на DC отключён везде, где он не нужен, патч применён, GPO Point and Print Restrictions в порядке. На нескольких площадках ещё идёт работа по выделению print server-роли на отдельные серверы там, где она была исторически размазана по DC - это уже не экстренная мера, а правильная архитектура.
История с PrintNightmare в очередной раз показывает: Windows-службы, работающие по умолчанию на DC «потому что так исторически сложилось», - это постоянный источник боли. Spooler на DC не нужен никогда. Но выключать его нужно было вчера, а не в пятницу вечером после публикации PoC.