Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
my-CVE-2021-1675 — Detaillierte Analyse und Exploit-Implementierung für Windows PrintNightmare (CVE-2021-1675/34527) mit RPC-basierter Privilegieneskalation und Remote-Codeausführung über bösartige Druckertreiberinstallation. | Kitploit
Tools/GitHubGitHub/hahaleyile/my-cve-2021-1675
Privilege EscalationSchwachstellenanalyseExploitationPapers & ForschungLernen & BildungRemote-Access-ToolBinary-Exploitation
GitHubhahaleyile/my-cve-2021-1675

my-CVE-2021-1675

Detaillierte Analyse und Exploit-Implementierung für Windows PrintNightmare (CVE-2021-1675/34527) mit RPC-basierter Privilegieneskalation und Remote-Codeausführung über bösartige Druckertreiberinstallation.

Repository anzeigen
331vor 5 JahrenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

= Print Nightmare Analysebericht :imagesdir: Figures :toc: :icons: font :figure-caption: Abb. :xrefstyle: short :pdf-theme: basic-theme.yml

Am 29. Juni 2021 wurde eine sehr schwerwiegende Windows-Druckdienst-Schwachstelle als 0day aufgedeckt, mit einem Basis-Score von 8,8, veröffentlicht auf GitHub (inzwischen gelöscht). Diese Schwachstelle ist der berühmte PrintNightmare: CVE-2021-34527, dessen Gefährlichkeit sogar die von EternalBlue übertrifft.

== Grundlegende Informationen zur Schwachstelle

Die Schwachstelle 34527 betrifft nahezu alle Versionen nach Windows 7 und Windows Server 2008, siehe <> für Details.

Aus Schadensperspektive kann ein Angreifer mit normaler Benutzerauthentifizierung unter Administratorrechten beliebigen Code remote ausführen. Hinsichtlich der Ausnutzbarkeit ist diese Schwachstelle sehr einfach auszunutzen, daher ist sie äußerst gefährlich.

Vom Schwachstellenmerkmal her basiert die 34527-Schwachstelle auf CVE-2021-1675. Die 1675-Schwachstelle ist eine lokale Privilegienausweitung und Remote Code Execution-Schwachstelle, die der 34527-Schwachstelle sehr ähnlich ist.

Bevor wir die Funktionsweise der Schwachstelle verstehen, sollten wir einen groben Überblick über die Architektur des Windows-Druckspoolers haben, um die Beziehungen zwischen den an der Schwachstelle beteiligten Modulen zu klären.

== CVE-2021-1675 Ablauf des Aufrufs

=== Architektur des Windows-Druckspoolers

Die Spooler-Architektur kann durch <<spooler_arch>> dargestellt werden:

[[spooler_arch]] .Print Spooler Architecture image::Print Spooler Architecture.png[]

Konkret dient der Druckspooler zur Verwaltung von Druckaufträgen und besteht aus folgenden Komponenten:

winspool.drv:: Die dem Benutzer bereitgestellte Dynamic-Link-Library-Datei. Diese Datei definiert die spoolerbezogenen Win32-APIs, die vom Benutzer aufgerufen werden können. Die APIs darin verwenden alle Remote Procedure Calls, um Dienste zu erhalten.

spoolsv.exe:: spoolsv.exe spielt die Rolle des Servers im System und ist das erste Programm, das API-Aufrufe verarbeitet. Dieses Design ermöglicht es dem Print Spooler, sowohl lokale als auch entfernte Druckaufträge unterschiedslos zu verarbeiten.

spoolsv.dll:: Das Routing-Programm. Es leitet die von spoolsv.exe empfangenen Druckanfragen an die einzelnen Druckanbieter weiter und entscheidet, welcher Druckanbieter die Anfrage letztendlich verarbeitet. Seine Aufgabe ist es, Druckaufträge als remote oder lokal zu unterscheiden. Auf einem entfernten Rechner weist es den Auftrag fest dem lokalen Druckanbieter zu.

localspl.dll:: Der lokale Druckanbieter. Die Hauptaufgabe des Druckanbieters besteht darin, die Anforderungen der Druckauftragsverwaltung zu erfüllen. Die überwiegende Mehrheit der APIs wird in diesem Modul implementiert.

Basierend auf der obigen Theorie untersuchen wir weiter. Wenn ich zum Beispiel die Funktion AddPrinterDriverEx aufrufe (CVE-2021-1675), durchläuft es den folgenden Ablauf:

=== Auswahl der Funktionsversion

Zunächst ist diese Funktion eigentlich ein Makro, das je nach lokaler Build-Umgebung die Unicode-Version (W) oder die ANSI-Version (A) auswählt, wie in <>:

[[AddPrinterDriverEx]] .AddPrinterDriverEx image::AddPrinterDriverEx.png[]

Aber ob Breitzeichen- oder Schmalzeichen-Version, das Ergebnis ist letztlich dasselbe, da die Zeichenketten im Windows-Kernel in Unicode kodiert sind. Daher wird der ANSI-Version-Aufruf letztendlich in einen Unicode-Version-Aufruf umgewandelt, wie in <>:

[[AnsiToUnicode]] .AnsiToUnicode image::AnsiToUnicode.png[]

Nachdem die Parameter der ANSI-Funktion in die Unicode-Version konvertiert wurden, wird eine Funktion aufgerufen (<>):

[[AnsiCallUnicode]] .AnsiCallUnicode image::AnsiCallUnicode.png[]

Und diese Funktion ist tatsächlich die Unicode-Version von AddPrinterDriverEx (<>):

[[GetUnicodeProcAddress]] .GetUnicodeProcAddress image::GetUnicodeProcAddress.png[]

=== Die API-Funktion sendet eine RPC-Anfrage an den Spooler-Server

Nach dem Eintritt in die Unicode-Version der Funktion wird zunächst basierend auf dem Wert von Level der Parameter-Typ der Funktion ausgewählt:

image::pDriverInfo.png[]

In diesem Exploit setzen wir Level auf 2, d.h. wir wählen den Typ des Parameters pDriverInfo als DRIVER_INFO_2-Struktur. Dann verarbeitet Windows die Funktionsparameter, und nach der Verarbeitung wird die API über einen Remote Procedure Call weiterverarbeitet:

image::set arguments.png[]

image::NdrClientCall3.png[]

=== MSRPC-Mechanismus

Der Remote Procedure Call-Mechanismus von Microsoft basiert auf dem DCE-Standard. Vereinfacht erklärt, werden beim Remote Procedure Call Prozesse auf einem entfernten System ausgeführt, die vom Programmierer oder System vordefiniert sind.

Die konkrete Methode von RPC besteht darin, die remote aufzurufende Funktion zu serialisieren, über das Netzwerk an das entfernte System zu senden, dort zu deserialisieren und auszuführen.

In der von Microsoft aufgebauten Architektur werden TCP/IP und SMB üblicherweise als Protokolle zur Übertragung von RPC-Aufrufen verwendet.

Um MSRPC zu verwenden, muss zunächst die IDL-Schnittstellenbeschreibung der aufzurufenden Funktion definiert werden, dann werden mit dem MIDL-Tool die entsprechenden Serialisierungs-Stubs für Client und Server generiert.

Für einige Win32-APIs ist der Server-Stub bereits vordefiniert, sodass wir nur den Client-Stub generieren und verwenden müssen.

MSRPC verwendet UUIDs, um einen bestimmten Protokolltyp zu identifizieren. Beispielsweise beschreibt MS-RPRN das Remote-Druckprotokoll. Alle Funktionen im Zusammenhang mit Remote-Druck gehören zu diesem Protokoll. MSRPC verwendet die UUID 12345678-1234-ABCD-EF00-0123456789AB zur Identifizierung des Protokolls (<<rprn_uuid>>):

[[rprn_uuid]] .MS-RPRN UUID image::spoolss uuid.png[]

Anschließend kann auf Basis dieser Verbindung mit einer Operatornummer (Opnum) die Funktion innerhalb des Protokolls identifiziert und remote aufgerufen werden. Beispielsweise verwendet AddPrinterDriverEx die Opnum 89 (<<addPrinterDriverEx_opnum>>):

[[addPrinterDriverEx_opnum]] .AddPrinterDriverEx Opnum image::AddPrinterDriverEx Opnum.png[]

Bei der Verwendung von MSRPC sind zwei Punkte zu beachten:

[IMPORTANT]

  • TCP/IP-Verbindungen verwenden dynamische Ports. Der Portwert muss über den Endpoint Mapper (der auf Port 135 lauscht) abgerufen werden.

"As you can see in your output, the scripts are trying to connect to port 135 (endpoint mapper) in order to get the TCP/IP port where the DCOM endpoint is listening (that is a dynamic port)." -- SecureAuthCorp/impacket issue #412

  • Außerdem erfordern einige RPC-Funktionen eine Authentifizierung, daher benötigt dieser Exploit eine normale Benutzerberechtigung. ====

=== spoolsv.exe verarbeitet API-Anfragen

[[call_flow]] .RpcAddPrinterDriverEx Call Flow image::Function Calls.png[]

Aus <<call_flow>> ist ersichtlich, dass spoolsv.exe diese Funktionen aufruft. Aus der internen Analyse der Funktionen geht hervor, dass dieses Modul außer der Initialisierung nichts weiter tut.

Schließlich ruft dieses Modul die von pLocalProvidor referenzierte Funktion auf, nämlich LocalAddPrinterDriverEx im Modul localspl.dll. Als lokaler Druckanbieter ist localspl tatsächlich das Modul, das die API-Funktionen implementiert.

=== Implementierungslogik des lokalen Druckanbieters

[[LocalAddPrinterDriverEx]] .LocalAddPrinterDriverEx image::LocalAddPrinterDriverEx.png[]

Zunächst zeigt <>, dass dieses Modul überprüft, ob der Spooler ordnungsgemäß läuft, und dann zur Funktion SplAddPrinterDriverEx springt.

[[SplAddPrinterDriverEx]] .SplAddPrinterDriverEx image::SplAddPrinterDriverEx.png[]

Im Inneren der Funktion <> befindet sich die wichtige Stelle, die entscheidet, ob die Funktion AddPrinterDriverEx erfolgreich ausgeführt werden kann. Die erste Hälfte kann ignoriert werden, da WPP eine protokollbezogene Technologie ist; wir überspringen sie vorerst.

In der zweiten Hälfte definiert Microsoft eine Variable v12, ein Flag, das entscheidet, ob die Funktion fortgesetzt oder direkt beendet wird.

[[bittest]] .bittest dwFileCopyFlags image::bittest in spl.png[]

Aus <> ist ersichtlich, dass es zwei Bedingungen für die Fortsetzung gibt: Erstens ist v12 = 0, d.h. der bittest ist erfolgreich, zweitens ist die Validierung erfolgreich.

Die Validierung ist eine Berechtigungsprüfung, die nicht gut umgangen werden kann. Darin gibt es eine API OpenProcessToken, die anzeigt, dass in den folgenden Prozessen die Berechtigung erhöht werden muss, was ohne Administratorrechte nicht möglich ist.

Um die Ausführung fortzusetzen, muss daher die bittest-Überprüfung umgangen werden. Die geprüfte Zahl a4 – der 4. Parameter der Funktion – ist der Parameter, der auf der offiziellen Seite unter <> beschrieben wird:

|=== |Name/Wert |Beschreibung

|APD_STRICT_UPGRADE

0x00000001

|Füge den Ersatzdruckertreiber nur hinzu, wenn keine Dateien des Ersatztreibers älter sind als entsprechende Dateien des derzeit installierten Treibers.

|APD_STRICT_DOWNGRADE

0x00000002

|Füge den Ersatzdruckertreiber nur hinzu, wenn keine Dateien des derzeit installierten Treibers älter sind als entsprechende Dateien des Ersatztreibers.

|APD_COPY_ALL_FILES

0x00000004

|Füge den Druckertreiber hinzu und kopiere alle Dateien im Treiberverzeichnis. Dateizeitstempel MÜSSEN ignoriert werden.

|APD_COPY_NEW_FILES

0x00000008

|Füge den Druckertreiber hinzu und kopiere die Dateien im Treiberverzeichnis, die neuer sind als die entsprechenden derzeit verwendeten Dateien.

|APD_COPY_FROM_DIRECTORY

0x00000010

|Füge den Druckertreiber unter Verwendung der vollqualifizierten Dateinamen hinzu, die in der _DRIVER_INFO_6-Struktur angegeben sind. Wenn dieses Flag angegeben ist, MUSS eines der anderen Kopierflags in diesem Bitfeld angegeben werden.

|APD_DONT_COPY_FILES_TO_CLUSTER

0x00001000

|Beim Hinzufügen eines Druckertreibers zu einem Druckserver-Cluster die Treiberdateien nicht auf die gemeinsame Cluster-Festplatte kopieren.

|APD_COPY_TO_ALL_SPOOLERS

0x00002000

|Füge den Druckertreiber zu Cluster-Spooler-Servern hinzu.

|APD_INSTALL_WARNED_DRIVER

0x00008000

|Füge den Druckertreiber hinzu, auch wenn er sich auf der Liste der gewarnten Druckertreiber des Servers befindet.

|APD_RETURN_BLOCKING_STATUS_CODE

0x00010000

|Gibt den implementierungsspezifischen Fehlercode an, der zurückgegeben wird, wenn die Installation des Druckertreibers durch die Serverrichtlinie blockiert wird.

|===

bittest 16 überprüft, ob das 16. Bit der Variable 1 ist. Der entsprechende Parameterwert ist 0x8000 (APD_INSTALL_WARNED_DRIVER). Aus der Beschreibung geht ebenfalls hervor, dass dieser Parameter bedeutet, den Druckertreiber ohne Überprüfung auf dem Server hinzuzufügen. Angeblich war dieser Parameter vor der Behebung von 1675 nicht in der offiziellen Dokumentation enthalten, was die Schwachstelle deutlich macht.

=== Methode zur Ausnutzung der Schwachstelle

Wenn die Methode zum Hinzufügen des Druckertreibers tatsächlich ausgeführt wird und die DRIVER_INFO_2-Struktur ausgewählt wird, geschehen folgende Dinge:

. Öffne DriverFile, ConfigFile und DataFile und überprüfe, ob diese drei Dateien existieren. Nur für DataFile ist ein UNC-Pfad zulässig.

. Wenn alle drei Dateien existieren, kopiere sie in das Verzeichnis C:\Windows\System32\spool\drivers\x64\3\New, wie in <<cp_conf_file>> und <<cp_data_file>> gezeigt: + [[cp_conf_file]] .Copy Config File image::copy config file.png[] + [[cp_data_file]] .Copy Data File image::copy data file.png[]

ifdef::backend-pdf[] Details zum Ergebnis des bösartigen Programms finden Sie in https://github.com/hahaleyile/my-CVE-2021-1675[meinem Repository]. Das Demogif befindet sich im Figures-Verzeichnis. endif::[]

== Microsofts Patch für die 1675-Schwachstelle

Am 8. Juni 2021 hat Microsoft einen Patch für CVE-2021-1675 veröffentlicht. Die spezifischen Änderungen sind:

[[path_1675]] .CVE-2021-1675 Patch image::IsElevated.png[]

[[YIsElevationRequired]] .YIsElevationRequired image::YIsElevationRequired.png[]

[[YIsElevated]] .YIsElevated image::YIsElevated.png[]

[[unset_1675]] .Unset APD_INSTALL_WARNED_DRIVER image::JudgeIsElevated.png[]

Microsoft hat in der Funktion RpcAddPrinterDriverEx eine Überprüfung auf erhöhte Benutzerrechte hinzugefügt, und Benutzer können diese Einschränkung in der Registrierung entfernen (<<path_1675>>). Benutzer müssen nur an der angegebenen Stelle in der Registrierung einen Schlüssel namens NoWaringNoElevationOnInstall erstellen (<>), oder das RPC-Konto muss ein TOKEN_QUERY-Prozess-Token erhalten (<>), um den Patch zu umgehen. Wenn der Patch wirksam wird, wird das 16. Bit des Parameters dwFileCopyFlags durch eine UND-Operation auf 0 gesetzt, d.h. der Parameterwert APD_INSTALL_WARNED_DRIVER wird unwirksam (<<unset_1675>>).

== Umgehung des 1675-Patches

Obwohl Microsoft die Funktion RpcAddPrinterDriverEx gepatcht hat, können wir den Patch dennoch durch einen Remote-Aufruf von RpcAsyncAddPrinterDriver umgehen. Wie in <<async_send>> gezeigt, ist diese Funktion auf der Clientseite ein direkter Remote-Aufruf an den Server:

[[async_send]] .RpcAsyncAddPrinterDriver Send image::RpcAsyncAddPrinterDriver Send.png[]

Der Server weist zunächst Speicherplatz für den Thread zu und ruft dann weiter auf, wie in <<async_receive>> gezeigt:

[[async_receive]] .RpcAsyncAddPrinterDriver Receive image::RpcAsyncAddPrinterDriver Receive.png[]

Die weiter aufgerufene Funktion schiebt alle Parameter auf den Stack und führt YAddPrinterDriverEx als Thread aus (<<async_yadd>>):

[[async_yadd]] .thread start YAddPrinterDriverEx image::thread start YAddPrinterDriverEx.png[]

Damit wird der Patch von Microsoft für RpcAddPrinterDriverEx erfolgreich umgangen. Das bedeutet, dass durch den Remote-Aufruf der Funktion RpcAsyncAddPrinterDriver weiterhin beliebiger Code mit Administratorrechten ausgeführt werden kann.

Außerdem hat <> erklärt, dass der Patch Probleme bei der Token-Überprüfung hat und auf Maschinen mit vollständig deaktiviertem UAC unwirksam ist. Ich persönlich bin mit den Mechanismen in diesem Bereich nicht sehr vertraut, daher verzichte ich auf weitere Kommentare.

== Microsofts Behebung der 34527-Schwachstelle

Am 6. Juli 2021 hat Microsoft das Druckspooler-Schwachstellenproblem vorübergehend durch eine weitere Reihe von Patches behoben. Laut offizieller Stellungnahme wird durch diesen Patch die Installation von Druckertreibern auf einem Druckserver nur noch durch Administratoren möglich sein. Außerdem hat Microsoft eine Gruppenrichtlinie und zwei Registrierungsschlüssel hinzugefügt, damit Benutzer diese Richtlinie anpassen können.

Tool herunterladen

. Der Grund für das Kopieren in dieses Verzeichnis ist, dass die entsprechenden Dateien ausgeführt werden sollen. '3' steht für einen Druckertreiber vom Typ v3. Zuerst werden die neuen Dateien in das New-Verzeichnis kopiert, um ein Überschreiben der Dateien im 3-Verzeichnis zu verhindern. Wenn unter 3 gleichnamige Dateien vorhanden sind, werden diese in das Old-Verzeichnis als Backup verschoben, dann werden die Dateien aus New nach 3 kopiert und überschreiben diese. Dies kann beim zweiten Aufruf von RpcAddPrinterDriverEx beobachtet werden: + .Second Time RPC Call image::second time call.png[] + .Backup Files To Old Directory image::backup file.png[] + .Copy New Files To Destination image::copy file.png[]

Aufgrund dieses Mechanismus können wir Dateien von einem entfernten Pfad als lokale Dateien speichern, da die Parameter für Treiberdatei und Konfigurationsdatei nur lokale Pfade sein können, während der Parameter für die Datendatei ein entfernter Pfad sein kann.

. Laut <> ist pConfigFile die Konfigurations-DLL des Gerätetreibers, daher muss sie einmal zur Initialisierung geladen werden. Dies wurde auch im tatsächlichen Betrieb bestätigt. + .Load pConfigFile image::Load Image.png[]

Somit kann man durch Erstellen einer bösartigen DLL und Platzieren des Schadcodes im DLL-Einstiegspunkt beliebigen Code mit Administratorrechten ausführen. + .spoolsv.exe is under administrator privilege image::spoolsv user.png[]

. Die Funktion CreateInternalDriverFileArray() entscheidet anhand des Dateioperationsflags, ob das Spool-Treiberverzeichnis überprüft wird. Wenn das Flag a5 auf False gesetzt ist, überprüft die Treiberladefunktion nur, ob das Benutzerverzeichnis die zu kopierenden Treiberdateien enthält. Andernfalls versucht die Funktion, den Zieltreiber im Spool-Treiberverzeichnis zu finden. Dies erfordert, dass dwFileCopyFlags den Parameter APD_COPY_FROM_DIRECTORY gesetzt hat. + image::APD.png[] + image::APD_1.png[]

[TIP]

Zusammenfassend: Die Idee zur Ausnutzung des Schadcodes ist, die bösartige DLL als ConfigFile zu initialisieren, um beliebigen Code mit Administratorrechten auszuführen. Es ist lediglich erforderlich, auf dem Angreifer-Rechner eine Samba-Freigabe bereitzustellen, damit das Opfer die bösartige Datei als DataFile herunterlädt und ausführt.

== Verwendung des Exploit-Programms

Das Programm basiert auf Docker und kann Abhängigkeitsprobleme effektiv lösen.

Zuerst lädt der Benutzer die Compose-Datei in sein Verzeichnis herunter und erstellt dort einen Ordner 'share' als Mount-Punkt. Der Benutzer kann die bösartige Datei in den share-Ordner legen; dieser Ordner wird als Samba-Pfad (smb) freigegeben.

Dann gibt der Benutzer im Terminal folgenden Befehl ein:

[source,docker]

docker-compose up -d

Damit wird der Cluster (ein Container) gestartet. Der Benutzer kann nach Belieben in den Container wechseln; die Umgebungen im Container sind bereits konfiguriert.

Oder man kann direkt im Terminal folgenden Befehl eingeben:

[source,docker]

docker-compose run my_cve python main.py -h

um den Befehl auszuführen.

== Ausführungsergebnisse des Exploit-Programms

Danke an <> für den Open-Source-Code als Referenz!

ifndef::backend-pdf[] .Program running result image::exploit.gif[] endif::[]

Durch die IDA-Decompilierung von <<restrict_async>> können wir sehen, dass Microsoft in der async-Funktion eine Überprüfung von Token und Registrierungseinträgen hinzugefügt hat.

[[restrict_async]] .restrict in async function image::restrict in async.png[]

Aus <<restrict_rpcadd>> ist ersichtlich, dass Microsoft in der Funktion RpcAddPrinterDriverEx eine Überprüfung der Benutzergruppe und ihres Registrierungsschlüssels hinzugefügt hat.

[[restrict_rpcadd]] .restrict in RpcAddPrinterDriverEx Function image::restrict in rpcadd.png[]

Daher scheint die Behebung der 1675-Schwachstelle tatsächlich noch Probleme mit der Token-Überprüfung zu haben.

== Projektplan

. Unterstützung für den Remote-Aufruf von RpcAsyncAddPrinterDriver hinzufügen, um den Patch von Microsoft vom 8. Juni zu umgehen und den CVE-2021-34527 Exploit zu realisieren.

. Den UAC-Mechanismus verstehen und diese Schwachstellenanalyse vervollständigen.

[bibliography] == Referenzen

  • [[[a,Offizielle Website]]] Windows Print Spooler Remote Code Execution Vulnerability https://msrc.microsoft.com/update-guide/en-US/vulnerability/CVE-2021-34527

  • [[[b,dwFileCopyFlags]]] https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rprn/b96cc497-59e5-4510-ab04-5484993b259b

  • [[[c,Analyse der Windows PrintNightmare-Schwachstelle (CVE-2021-34527) und des Patches]]] https://www.freebuf.com/vuls/279876.html

  • [[[d,gentilkiwi/mimikatz]]] https://github.com/gentilkiwi/mimikatz

  • [[[e,Offizielle Dokumentation]]] DRIVER_INFO_2 structure https://docs.microsoft.com/en-us/windows/win32/printdocs/driver-info-2

  • [[[f,cube0x0]]] https://github.com/cube0x0

  • [[[g,James Forshaw]]] https://twitter.com/tiraniddo/status/1410726790994169857

  • [[[h,Offizielle Erklärung]]] KB5005010: Restricting installation of new printer drivers after applying the July 6, 2021 updates https://support.microsoft.com/en-us/topic/kb5005010-restricting-installation-of-new-printer-drivers-after-applying-the-july-6-2021-updates-31b91c02-05bc-4ada-a7ea-183b129578a7