Уязвимость, получившая название Printdemon, связана с диспетчером очереди печати Windows или Windows Print Spooler. Зная о ней, злоумышленник с локальным доступом без особых привилегий, по сути, с помощью лишь одной команды в интегрированной среде сценариев Powershell может получить права администратора. Эксплуатация бреши возможна и в системах, не имеющих данного инструмента, но для этого потребуется несколько больше усилий.
Первыми Printdemon обнаружили специалисты компании Safebreach Labs Пелег Хадар (Peleg Hadar) и Томер Бар (Tomer Bar), сообщившие о ней Microsoft. Уязвимость CVE-2020-1048 была исправлена в обновлении безопасности, вышедшем в рамках традиционного «патчевого вторника» (Patch Tuesday), который в этот раз выпал на 13 мая 2020 г.
Эксплуатация уязвимостиПо задумке разработчиков, служба Windows Print Spooler должна принимать задания на печать от любых запущенных приложений, вне зависимости от того, с какими полномочиями они выполняются.
Принцип эксплуатации уязвимости заключается в том, что злоумышленник, используя любую доступную учетную запись в Windows, может «отправить на печать» бинарный код собственной программы через порт, который на самом деле представляет собой файл, к примеру, системной библиотеки.
Microsoft исправила уязвимость Printdemon, которая затрагивает все версии Windows, выпущенные с 1996 г.Чтобы получить права на запись в такой файл, принудительно вызывается сбой службы Windows Print Spooler, в результате чего она автоматически перезапускается, причем уже с самыми широкими привилегиями (SYSTEM). Затем процесс печати в системный файл успешно доводится до завершения.
Напомним, при добавлении принтера в качестве порта вывода на печать, помимо обычных USB/LPT-интерфейсов или сетевого порта TCP, можно указать локальный файл. Авторы особо подчеркивают, что «печать в файл» и «печать через порт, указывающий на файл» не одно и то же. В рамках Windows Print Spooler это две принципиально разные концепции, причем последняя не очень хорошо документирована.
Основная проблема для злоумышленника в данном случае заключается в том, что ему необходимо обладать теми же привилегиями, которые нужны для доступа к файлу-порту, в который будет «заливаться» вредоносный код.
Однако, как выяснили ИБ-специалисты, и эта трудность решается, причем элементарно. В частности, при использовании Powershell команды "Add-PrinterPort -Name c:\windows\system32\ualapi.dll" будет достаточно, чтобы добавить в систему порт, указывающий на системную библиотеку ualapi.dll. После чего можно легко добавить в систему новый виртуальный принтер, который будет «печатать» прямо в нее от имени любого пользователя. Это возможно из-за ошибочной реализации проверки корректности имени порта – она в Windows осуществляется лишь на уровне пользовательского интерфейса (клиентской части). Используя же инструменты вроде того же Powershell, к серверной части службы управления очередью печати можно обратиться напрямую.