Print Spooler
Print Spooler — это системный компонент операционных систем семейства Microsoft Windows, отвечающий за управление очередью заданий на печать и взаимодействие с драйверами принтеров. Он представляет собой службу (фоновый процесс), которая принимает документы от приложений, сохраняет их на жёстком диске в виде временных файлов (спула) и затем последовательно отправляет на принтер в порядке поступления. Print Spooler обеспечивает возможность продолжения работы пользователя в приложении сразу после отправки документа на печать, не дожидаясь завершения физического вывода на устройство.
История и развитие
Ранние версии Windows
Служба Print Spooler появилась в ранних версиях Windows (начиная с Windows 95 и Windows NT 3.1) как часть подсистемы печати. В Windows 95 и 98 она была реализована в виде отдельного процесса spool32.exe, а в Windows NT — как служба Spoolsv.exe. Основной задачей было освобождение приложений от непосредственного управления принтером, которое в ранних системах (например, MS-DOS) выполнялось самим приложением и блокировало его работу до завершения печати.
Windows 2000 и XP
В Windows 2000 и Windows XP архитектура Print Spooler была значительно переработана. Служба стала более стабильной и получила поддержку сетевой печати. Появилась возможность управления очередями через консоль printmanagement.msc и оснастку «Управление печатью». В этот период были введены механизмы изоляции драйверов (Driver Isolation), позволяющие запускать драйверы принтеров в отдельном процессе, что снижало риск сбоя всей службы из-за ошибки в драйвере.
Современные версии (Windows 7, 8, 10, 11)
В Windows 7 и более новых версиях Print Spooler получил улучшенную поддержку стандартов печати, таких как XPS (XML Paper Specification) и IPP (Internet Printing Protocol). Были добавлены функции, упрощающие обнаружение сетевых принтеров и установку драйверов через Windows Update. Однако с ростом сложности системы увеличилось и количество уязвимостей, связанных с этой службой.
Устройство и принцип работы
Компоненты службы
Служба Print Spooler состоит из нескольких ключевых компонентов:
- Spoolsv.exe — основной исполняемый файл службы. Запускается автоматически при старте системы и работает в фоновом режиме.
- Диспетчер очереди — управляет порядком заданий, их приоритетами и статусами (печать, приостановка, удаление).
- Обработчик заданий — отвечает за запись данных печати в файлы спула (обычно в каталоге
%SystemRoot%\System32\spool\PRINTERS\) и их последующую передачу драйверу принтера. - Интерфейс для приложений — предоставляет API (Win32 Spooler API), через который программы отправляют задания на печать.
Процесс печати
- Отправка задания: Приложение (например, текстовый редактор) вызывает функцию
StartDocPrinterилиWritePrinter, передавая данные в драйвер принтера. - Обработка драйвером: Драйвер преобразует документ в формат, понятный принтеру (например, PCL, PostScript, ESC/P или XPS).
- Сохранение в спул: Print Spooler принимает подготовленные данные и сохраняет их в виде временного файла (файла спула) в специальной папке. Одновременно создаётся файл с расширением
.SHD, содержащий метаданные задания (имя документа, владелец, приоритет, страницы). - Постановка в очередь: Задание помещается в очередь, где ожидает освобождения принтера.
- Передача на принтер: Когда принтер готов, служба извлекает данные из файла спула и отправляет их через порт (USB, LPT, сетевой протокол) на устройство.
- Завершение: После успешной печати временные файлы удаляются, а задание помечается как завершённое.
Типы спулинга
- EMF-спулинг (Enhanced Metafile): используется по умолчанию в Windows. Приложение создаёт метафайл, который содержит команды для воспроизведения документа. Драйвер принтера обрабатывает этот метафайл уже в фоне. Это позволяет быстро вернуть управление приложению.
- RAW-спулинг: данные передаются драйверу сразу, и он формирует готовый для принтера поток байтов. Этот режим используется для PostScript-принтеров или при проблемах с EMF-спулингом.
- XPS-спулинг: применяется в Windows для принтеров, поддерживающих формат XPS. Документ преобразуется в XPS-файл, который затем отправляется на устройство.
Уязвимости и проблемы безопасности
Известные уязвимости
Служба Print Spooler исторически является источником серьёзных уязвимостей. Наиболее известные из них:
- CVE-2021-34527 (PrintNightmare): критическая уязвимость, позволяющая удалённо выполнить произвольный код с правами системы. Она затрагивает функцию
RpcAddPrinterDriverExв Windows Print Spooler. Атакующий мог установить вредоносный драйвер принтера на удалённой системе и получить полный контроль над ней. Уязвимость была обнаружена в июне 2021 года и потребовала экстренных обновлений безопасности от Microsoft. Даже после первоначальных исправлений исследователи находили способы обхода защиты. - CVE-2020-1048: уязвимость, позволяющая злоумышленнику с правами обычного пользователя создавать файлы в системных каталогах через манипуляции с очередями печати. Это могло привести к повышению привилегий.
- CVE-2022-22718: уязвимость, связанная с переполнением буфера в драйвере принтера, что также позволяло выполнить код в контексте системы.
Рекомендации по защите
Для снижения рисков Microsoft рекомендует:
- Отключать службу Print Spooler на системах, где печать не требуется (например, на серверах домена или контроллерах домена).
- Ограничивать права на установку драйверов принтеров только для администраторов.
- Устанавливать все обновления безопасности.
- Использовать групповые политики для блокировки входящих RPC-соединений к службе спулера.
Применение и управление
Настройка через графический интерфейс
В современных версиях Windows управление очередями печати осуществляется через раздел «Устройства и принтеры» в Панели управления. Пользователь может:
- просматривать список заданий;
- приостанавливать, возобновлять или отменять печать;
- изменять приоритет заданий;
- очищать всю очередь.
Командная строка и PowerShell
Для автоматизации и администрирования используются утилиты:
net stop spoolerиnet start spooler— остановка и запуск службы.print— отправка файла на печать.cscript prncnfg.vbs— управление конфигурацией принтеров.Get-PrinterиGet-PrintJob(PowerShell) — получение информации о принтерах и заданиях.
Отключение службы
Если печать не используется, службу можно отключить через оснастку «Службы» (services.msc) или с помощью PowerShell: `` Set-Service -Name Spooler -StartupType Disabled Stop-Service -Name Spooler `` Отключение службы может быть полезно для повышения безопасности, но приведёт к невозможности печати из приложений.
Интересные факты
- В ранних версиях Windows для печати использовался драйвер
UNIDRV.DLL, который поддерживал множество моделей принтеров через универсальный интерфейс. Современные драйверы часто используют модель V4, которая поддерживает изоляцию и автоматическую установку. - Файлы спула имеют расширение
.SPLи могут быть прочитаны специальными утилитами. В некоторых случаях это позволяло восстанавливать случайно удалённые задания на печать. - Служба Print Spooler является одной из немногих системных служб Windows, которая по умолчанию запускается от имени учётной записи
SYSTEM(локальная система), что даёт ей максимальные привилегии. Это делает её привлекательной целью для атак.
Источники
- Microsoft Docs: Print Spooler Architecture
- Microsoft Security Response Center: CVE-2021-34527
- Windows Internals, Part 1 (7th Edition) — Pavel Yosifovich, Mark Russinovich, David Solomon
- TechNet: Managing Print Servers
- CVE Database (MITRE)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →