ADG Оставить заявку
Блог Информационная безопасность 5 мин чтения

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.

Контакт

Нужна такая же инженерная работа?

Опишите задачу и контекст. Ответим в течение рабочего дня, при необходимости подпишем NDA.