PrintNightmare: PoC на GitHub, активная эксплуатация и экстренный патч KB5004945
PoC-эксплойт PrintNightmare появился на GitHub и исчез через час - но fork-ов уже десятки. Накатываем KB5004945 на серверы клиентов и чистим Point and Print.
PrintNightmare: публичный PoC-эксплойт опубликован на GitHub, Microsoft выпускает внеплановый патч KB5004945 для CVE-2021-34527
Когда две недели назад мы останавливали Print Spooler на контроллерах домена, Microsoft обещал выпустить патч. Патч вышел - но не тогда, когда его ждали, и не совсем так, как хотелось.
Ночью 29 июня на GitHub появился рабочий PoC-эксплойт для PrintNightmare. Через несколько часов репозиторий удалили, но fork-и уже разошлись по всему интернету. В ту же ночь начали фиксироваться активные попытки эксплуатации в дикой природе. Microsoft экстренно выкатил внеплановый патч KB5004945.
Мы узнали об этом в начале рабочего дня. Дальше - стандартный режим аварийного реагирования.
Почему PoC - это принципиальный перелом
До публикации PoC CVE-2021-34527 была серьёзной уязвимостью в нишевом смысле: технически подкованный атакующий мог её воспроизвести, но массовой эксплуатации не было. После публикации рабочего кода порог входа упал до нуля. Скрипт-кидди с минимальными навыками теперь может получить SYSTEM на контроллере домена, у которого запущен Print Spooler и нет патча.
Час между появлением PoC и первыми зафиксированными атаками - это не метафора. По данным из профессиональных каналов, которые мы читаем, первые попытки сканирования и эксплуатации появились быстро. Удаление репозитория в такой ситуации - жест больше символический, чем практический.
KB5004945: что это и зачем его накатывать немедленно
Патч KB5004945 вышел вне стандартного цикла Patch Tuesday - Microsoft выпустил его экстренно. Он закрывает CVE-2021-34527 (RCE через Print Spooler) на актуальных версиях Windows: Server 2019, 2016, 2012 R2, Windows 10 разных версий.
Важный момент, который сразу выяснился: патч закрывает уязвимость, но с одной оговоркой. Если в системе включена политика Point and Print без ограничений (NoWarningNoElevationOnInstall = 1), патч не даёт полной защиты. Нужно либо отключить эту политику, либо убедиться, что она настроена правильно.
Это стало второй частью нашей работы в этот день.
Что мы делали
Процесс выглядел так:
- Приоритизация по критичности. Первыми в очереди - контроллеры домена и серверы управления. Там либо уже был остановлен Spooler после нашего прохода двумя неделями ранее, либо нужно было и останавливать, и патчить одновременно.
- Накат KB5004945. На серверах с активным Spooler - патч через WSUS или вручную с Microsoft Update Catalog, в зависимости от того, как у клиента устроен патч-менеджмент. Перезагрузка обязательна.
- Проверка Point and Print. Полезли в GPO и реестр проверять, не включил ли кто NoWarningNoElevationOnInstall. Это настройка, которую иногда включают для удобства пользователей - чтобы принтеры ставились без запроса прав. Удобно, но в контексте PrintNightmare - опасно.
- Верификация. После патча и проверки политик - убеждались, что Spooler на DC всё ещё выключен или что патч применился корректно.
На нескольких клиентах Point and Print без ограничений всё-таки обнаружился. Не на DC, но на файловых серверах с ролью print server. Вот именно здесь без проверки можно было решить, что раз патч накатили - всё хорошо, и ошибиться.
Point and Print: почему это важно
Point and Print - механизм, который позволяет Windows автоматически скачивать и устанавливать драйверы принтеров с сервера. Удобная вещь в нормальных условиях: пользователь добавляет принтер, драйвер приезжает с сервера сам.
Проблема в том, что при отключённых предупреждениях (NoWarningNoElevationOnInstall = 1) Windows устанавливает эти драйверы без запроса повышения привилегий. В контексте PrintNightmare это означает, что если атакующий контролирует сервер, с которого едут «драйверы», или может имитировать такой сервер, - он получает выполнение кода с системными привилегиями на клиентской машине.
Microsoft явно указал в рекомендациях по KB5004945: патч + включённый Point and Print без ограничений = неполная защита. Оба условия нужно закрывать.
Что в итоге
К концу дня у всех клиентов, до которых мы добрались, ситуация выглядела так: KB5004945 накатан, Point and Print либо вычищен из режима «без ограничений», либо подтверждено, что его не было. На контроллерах домена Spooler выключен - как и было сделано две недели назад.
Несколько клиентов всё ещё в очереди - там нет оперативного доступа или есть процедуры согласования окна обслуживания. Это нормальная ситуация для корпоративной среды, просто раздражающая, когда патч нужен сегодня, а не через две недели.
История с PrintNightmare иллюстрирует знакомый паттерн: уязвимость в компоненте с широким дефолтным присутствием, потом рабочий PoC, потом окно активной эксплуатации до патча. ProxyLogon в феврале шёл по той же схеме. Разница в том, что там между публикацией деталей и массовой эксплуатацией было немного больше времени. Здесь - буквально часы.
Помогает одно: регулярный аудит конфигураций и отслеживание состояния патчей в рамках постоянного сопровождения. Клиенты, у которых мы прошлись по Spooler две недели назад, сегодня были в значительно более спокойной позиции - один пункт из плана действий уже был закрыт.