Zum Inhalt springen

CVE-2021-34527 – PrintNightmare – Druckwarteschlange deaktivieren

Symbolbild Security

Im CVE-2021-34527 „Sicherheitsanfälligkeit im Windows-Druckerspooler bezüglich Remotecodeausführung“ („Windows Print Spooler Remote Code Execution Vulnerability“) berichtet Microsoft über eine schwerwiegende Sicherheitslücke in der Druckwarteschlange, die bereits attackiert wird. Der fehlerhafte Code existiert bereits seit Windows 7 SP1 bzw. Windows Server 2008. Aktuell ist noch kein Sicherheitsupdate verfügbar, dass die Lücke schließt!

Beitrag-Update, 07.07.2021: Sicherheitsupdates verfügbar – Details unter CVE-2021-34527!

Obwohl die Sicherheitslücke in Windows und Windows Server existiert, sind laut Microsoft aktuell besonders Domänencontroller gefährdet!

Dieser Artikel widmet sich der Workaround-Anwendung im Serverbereich, da beide verfügbare Workarounds kaum für Clients geeignet sind.

Workarounds: Deaktivieren oder Blockieren

Von Microsoft werden im CVE-2021-34527 aktuell zwei Optionen bzw. Workarounds angeboten:

  • Druckwarteschlange-Dienst (Print Spooler) deaktivieren
  • Clientverbindungen zum Druckspooler blockieren

Beide Workarounds sind logischerweise nicht für Druckserver geeignet!

Ein inoffizieller, dritter Workaround arbeitet mit Änderungen der NTFS-Rechte des Ordners C:\Windows\System32\spool\drivers. Ob die Änderung wirklich schützt und keine Nebenwirkungen hervorruft, ist aktuell noch unklar.

Gruppenrichtlinie: Druckwarteschlange beenden und deaktivieren

Der Windows-Dienst Druckwarteschlange kann in den Gruppenrichtlinien-Einstellungen in Computerkonfiguration → Einstellungen → Systemsteuerungseinstellungen → Dienste beendet und deaktiviert werden. Diese Lösung ist praktisch wenn kein Windows Server Druckserver im Netzwerk existiert und die Gruppenrichtlinie leicht über alle Server angewendet werden kann. Wenn Druckserver existieren, müssen diese logischerweise von der Gruppenrichtlinie ausgenommen werden. Ansonsten ist kein Drucken mehr möglich! Leider hat man im Normalfall keinen Überblick ob und wann die Gruppenrichtlinie auf den Servern zur Anwendung kommt.

CVE-2021-34527 Workaround: Druckwarteschlange über Gruppenrichtlinie anhalten und deaktivieren

Gruppenrichtlinie: Clientverbindungen blockieren

Server die nicht als Druckserver fungieren, aber Drucker für ihre Dienste benötigen, können durch die Blockierung der Clientverbindungen abgesichert werden. Diese Einstellung kann unter Computerkonfiguration → Richtlinien → Administrative Vorlagen → Drucker → Annahme von Clientverbindungen zum Druckspooler zulassen: Deaktiviert gesetzt werden. Achtung: Die Druckwarteschlange muss zum Übernehmen der Änderung neu gestartet werden!

Gruppenrichtlinie: Clientverbindungen zum Druckspooler blockieren

PowerShell: Druckwarteschlange beenden und deaktivieren

Mit dem folgenden PowerShell-Script werden alle Windows Server aus der Active Directory Domäne abgerufen. Wenn der jeweilige Server erreichbar ist, wird zunächst geprüft ob dieser freigegebene Drucker hat. Wenn keine freigegebenen Drucker gefunden wurden, wird der Dienst „Druckwarteschlange“ (Spooler) beendet und deaktiviert.

Im Gegensatz zur Gruppenrichtlinie erhält man hier sofort einen Überblick wo die Druckwarteschlange ausgeführt wurde und das Script den Dienst beendet und deaktiviert hat.

Das Script benötigt:

  • Windows-Dienst „Druckwarteschlange“ im Status „Ausgeführt“
  • PowerShell als Administrator
  • Domänen-Administratorrechte
  • PowerShell-Modul ActiveDirectory
function Disable-SpoolerOnWindowsServer {

    #Requires -Modules ActiveDirectory
    #Requires -RunAsAdministrator

    # Spooler available?
    if((Get-Service Spooler).Status -ne "Running"){
        Write-Error -Message "Spooler service for script execution required!" -ErrorAction Stop
    }

    # Get Servers vom Active Directory
    $servers = Get-ADComputer -Filter {(OperatingSystem -like "Windows Server*") -and (Enabled -eq $true)} -Properties Name | Sort-Object | select -ExpandProperty Name
    
    # Check Servers
    foreach($server in $servers){

        # This System found?
        if($env:computername -eq $server){

            # Do not deactivate on this system now!
            Write-Warning "$server - Please stop and deactivate spooler later manually on this system! Required for script execution!"

        } else {

            # Server online?
            if(Test-Connection $server -Count 3 -Quiet){
                Write-Host "$server - online! Starting spooler check!"

                # Get Spooler
                $spooler = Get-Service Spooler -ComputerName $server -ErrorAction SilentlyContinue

                # No Spooler service found
                if($spooler.Name -ne "Spooler"){
                    Write-Warning "$server - no Spooler service found!"
                }

                # Spooler active?
                if($spooler.StartType -eq "Automatic"){

                    # Printer shared?
                    $printer = Get-Printer -ComputerName $server | Where-Object Shared -eq $true

                    # Disable if no printers shared
                    if($printer.Count -gt 0){

                        # Shared Printers, do not disable
                        Write-Warning ("$server - Cannot disable Spooler! "+$printer.count+" shared printers found!")

                    } else {
    
                        # Disable spooler
                        Set-Service Spooler -ComputerName $server -StartupType Disabled
                        Start-Sleep(1)

                        # Spooler disabled?
                        if((Get-Service Spooler -ComputerName $server).StartType -eq "Disabled"){
                            Write-Host "$server - Spooler is now disabled!"
                        } else {
                            Write-Warning "$server - Failed to disable Spooler!"
                        }

                        # Spooler running?
                        if((Get-Service Spooler -ComputerName $server).Status -eq "Running"){

                            # Stop spooler service
                            (Get-Service -ComputerName $server -Name Spooler).Stop()
                            Start-Sleep(1)

                            # Spooler still running?
                            if((Get-Service Spooler -ComputerName $server).Status -eq "Running"){
                                Write-Warning "$server - Spooler still running!"
                            } else {
                                Write-Host "$server - Spooler stopped!"
                            }
                        }

                    } # if printer.count

                } elseif($spooler.StartType -eq "Disabled"){

                    # Spooler already disabled
                    Write-Host "$server - Spooler already disabled!"

                } #if $spooler.StartType

            } else {

                Write-Warning "$server - Server not available! Can't check Spooler!"

            } #if server online

        } #if computername

    } #foreach

} #function


# Run function
Disable-SpoolerOnWindowsServerCode-Sprache: PHP (php)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

16 − dreizehn =