PrintNightmare, nouvelle vulnérabilité du Spouleur d’impression Windows
Jeudi 01 juillet 2021, Microsoft a publié l’alerte de sécurité concernant la vulnérabilité CVE-2021-34527 « Windows Print Spooler Remote Code Execution Vulnerability », aussi appelée « PrintNightmare » (bulletin officiel de Microsoft disponible en anglais ici). Cette vulnérabilité affecte le service Spouleur d’impression de Windows et permet d’exécuter du code arbitraire à distance avec les droits SYSTEM à l’aide d’un compte de domaine.
Qu’est-ce que le service Spouleur d’impression de Windows ?
Le service Spouleur d’impression est un fichier exécutable (spoolsv.exe), lancé par défaut au démarrage du système d’exploitation. Ce service permet d’implémenter les rôles client et serveur du système d’impression. Il est responsable de la gestion des tâches d’impression et de leur conversion au format spécifique des imprimantes.
Ce service utilise :
- le port RPC (Remote Procedure Call) 135 (TCP) ;
- les ports dynamiques RPC, compris entre 49152 et 65535 (TCP), pour enregistrer les points de terminaison RPC des protocoles d’impression MS-PAR (Print System Asynchronous Remote Protocol), MS-RPRN (Print System Remote Protocol), MS-PAN (Print System Asynchronous Notification Protocol) (serveur) et appeler les fonctions de ces protocoles d’impression (client) ;
- le port 80 pour le support des protocoles IPP (Internet Printing Protocol) et MS-WPRN (Web Point-and-Print Protocol) s’il a été configuré pour supporter IPP ;
- les ports SMB 139, 445 pour les fichiers de partage ou si les protocoles cités plus haut ne sont pas supportés.
En quoi consiste la faille PrintNightmare CVE-2021-34527 ?
La vulnérabilité PrintNightmare CVE-2021-34527 est liée à la fonctionnalité d’ajout de pilote sur un serveur d’impression dans le protocole MS-RPRN.
Lors de l’ajout d’un pilote sur un serveur d’impression, le client suit les étapes suivantes :
- Le client vérifie qu’il peut appeler via RPC la fonction RpcAddPrinterDriver ;
- Le client s’assure que les fichiers du pilote sont accessibles par le serveur d’impression ;
- Le client crée un objet contenant les informations relatives au pilote à installer, notamment les chemins « pDriverPath », « pDataFile » et « pConfigFile » ;
- Le client appelle la fonction RpcAddPrinterDriver avec en argument le nom du serveur d’impression et l’objet créé à l’étape précédente.
La fonction RpcAddPrinterDriver copie les fichiers spécifiés dans « pDriverPath », « pDataFile » et « pConfigFile » dans le répertoire :
C:\Windows\System32\spool\drivers\x64\3\new
Puis la fonction fait de même dans le répertoire :
C:\Windows\System32\spool\drivers\x64\3
Les fichiers correspondant à « pDriverPath » et « pConfigFile » sont ensuite chargés.
Dans sa dernière version, le service Spouleur d’impression vérifie que les chemins spécifiés dans les variables « pDriverPath » et « pConfigFile » ne sont pas au format UNC (Universal Naming Convention). Cela empêche de fournir des chemins du réseau de partage par exemple. Cependant, cette vérification n’est pas effectuée sur la variable « pDataFile ».
La première étape de l’attaque est de téléverser une bibliothèque dynamique malveillante dans le répertoire :
C:\Windows\System32\spool\drivers\x64\3
C’est avec l’aide de la fonction RpcAddPrinterDriver que cela se produit.
Il suffit de fournir un chemin au format UNC (exemple : \\IP_Attaquant\share\Evil.dll) dans la variable « pDataFile » accessible par la machine cible.
A ce moment là, la bibliothèque malveillante n’est pas encore chargée par le service.
La deuxième étape de l’attaque consiste à appeler une nouvelle fois la fonction RpcAddPrinterDriver, cette fois-ci en fournissant le chemin de la bibliothèque dynamique malveillante :
C:\Windows\System32\spool\drivers\x64\3\Evil.dll
Et est téléversée précédemment, dans la variable « pConfigFile ».
Le résultat attendu de ce deuxième appel à la fonction RpcAddPrinterDriver est le chargement de la bibliothèque dynamique malveillante.
Malheureusement, ce n’est pas le résultat obtenu et il reste encore une étape.
En effet, en raison de conflits de fichiers (certains des fichiers à copier sont déjà existants dans ce répertoire) une erreur se produit lors de la copie des fichiers dans le répertoire :
C:\Windows\System32\spool\drivers\x64\3
La fonction RpcAddPrinterDriver ne permet alors pas d’aller plus loin dans ce scénario.
Cependant, il existe une méthode similaire à RpcAddPrinterDriver, nommée RpcAddPrinterDriverEx (documentation disponible ici), qui permet de rétrograder ou de mettre à jour un pilote sur un serveur d’impression. Cette fonction prend en entrée les deux mêmes premiers arguments ainsi qu’une liste d’options, « dwFileCopyFlags »,
permettant de spécifier comment gérer les copies des fichiers du pilote à remplacer.
L’option « APD_COPY_ALL_FILES » permet de forcer la copie des fichiers sans tenir compte de leur horodatage. C’est cette option qui est utilisée pour l’attaque.
Les étapes de l’attaque sont ensuite identiques à ce qui a été vu plus haut avec la fonction RpcAddPrinterDriver.
La subtilité de l’attaque consiste à contourner la vérification d’autorisation mise en place dans la fonction RpcAddPrinterDriverEx. En effet, l’appel à cette méthode requiert le privilège « SeLoadDriverPrivilege » d’après la documentation Microsoft.
Cette vérification peut être contournée en fournissant à la fonction RpcAddPrinterDriverEx des valeurs inattendues dans « dwFileCopyFlags ».
En effet, la lecture de l’exploit PrintNightmare disponible sur GitHub montre que la variable « a4 » est modifiable par l’utilisateur, ce qui permet de passer la vérification à la ligne 19 de l’extrait du code source ci-dessus.
De plus, les valeurs attendues dans « dwFileCopyFlags » après la première option sont définies dans la documentation Microsoft.
D’après le code source du PoC, la combinaison des trois options « APD_COPY_ALL_FILES », « APD_COPY_FROM_DIRECTORY » et « APD_INSTALL_WARNED_DRIVER » permet de contourner la vérification d’autorisation.
La vérification « ValidateObjectAccess » à la ligne 21 du code source est vérifiée si l’utilisateur a accès au service Spouleur d’impression.
Or, les utilisateurs de domaine standards (non-admin) ont accès à ce service si le groupe « Authenticated Users » fait partie du groupe « Pre-Windows 2000 Compatible Access », ce qui est le cas par défaut. Ainsi, il est tout de même nécessaire d’avoir un compte de domaine valide pour réaliser l’attaque.
Quels sont les actifs impactés par la vulnérabilité CVE-2021-34527 ?
Toutes les versions de Windows contiennent le code vulnérable et sont donc vulnérables. Cependant, certaines conditions doivent être remplies pour permettre l’exploitation de la vulnérabilité.
Cette attaque passant par le Spouleur d’impression, les machines ne sont pas vulnérables si ce service est désactivé.
En conséquence, Cyberwatch recommande d’identifier les machines disposant d’un service Spouleur d’impression actif au sein du système d’information : si ces machines ne sont pas équipées des mises à jour de sécurité de Microsoft (KB5004945, KB5004946, KB5004947, KB5004950, KB5004951, KB5004953, KB5004954, KB5004955, KB5004958, KB5004959), ces machines doivent être considérées comme vulnérables à la CVE-2021-34527.
La plateforme Cyberwatch vous permet d’identifier très facilement les actifs concernés, de plusieurs manières :
- Utilisez notre scanner de vulnérabilités pour identifier les actifs concernés par la CVE-2021-34527 ;
- Utilisez la requête service:Spooler:Auto pour afficher les actifs avec le Spouleur d’impression activé par défaut sur votre système d’information ;
- Utilisez la règle de conformité MSDefender-Spooler-Disable pour identifier les actifs qui ont le Spouleur d’impression démarré ou activé par défaut dans votre système d’information ;
- Utilisez nos rapports sur l’état des services systèmes pour visualiser les actifs avec le Spouleur d’impression activé par défaut.
Vous pouvez demander dès aujourd’hui une démonstration de notre plateforme et rechercher cette vulnérabilité via notre formulaire de contact.
Les contrôleurs de domaines sont particulièrement visés par cette attaque car vulnérables même après avoir appliqué le correctif du 8 juin 2021 qui corrige notamment la vulnérabilité CVE-2021-1675.
Stan Hegt (@StanHacked), d’Outflank, a posté sur twitter un diagramme aidant à la vérification des actifs impactés.
Quel est l’impact de la vulnérabilité PrintNightmare / CVE-2021-34527 ?
La vulnérabilité PrintNightmare permet à un attaquant ayant compromis un compte de domaine d’élever ses privilèges et de prendre le contrôle total et à distance d’un contrôleur de domaine, ou d’exécuter du code arbitraire.
Quelle est la facilité d’attaque de PrintNightmare / CVE-2021-34527 ?
Plusieurs exploits sont disponibles gratuitement et publiquement sur internet. L’attaque nécessite cependant de disposer au préalable d’un compte de domaine.
Comment neutraliser PrintNightmare / CVE-2021-34257 ?
Microsoft a annoncé une série de correctifs de sécurité en « Out-of-band » (hors Patch Tuesday) le 6 juillet 2021 à 23h12.
Ces correctifs sont disponibles sous les références suivantes :
- KB5004945 pour Windows Server 20H2, Windows Server 2004, Windows 10 20H2, Windows 10 2004, Windows 10 21H1 ;
- KB5004946 pour Windows 10 1909 ;
- KB5004947 pour Windows Server 2019, Windows 10 1809 ;
- KB5004950 pour Windows 10 ;
- KB5004948 pour Windows Server 2016 et Windows 10 1607 ;
- KB5004951 et KB5004953 pour Windows Server 2008 R2 et Windows 7 ;
- KB5004956 et KB5004960 pour Windows Server 2012 ;
- KB5004954 et KB5004958 pour Windows Server 2012 R2 et Windows 8.1 ;
- KB5004955 et KB5004959 pour Windows Server 2008 SP2.
Ces informations sont tirées du bulletin officiel de Microsoft, qui recommande en outre de désactiver le service Spouleur d’impression sur les machines qui n’ont pas besoin de gérer les impressions.
Pour désactiver le service Spouleur d’impression, vous pouvez utiliser les commandes suivantes en PowerShell sur votre contrôleur de domaine :
Stop-Service -Name Spooler -Force
Set-Service -Name Spooler -StartupType Disabled
Il est aussi possible de limiter la surface d’attaque en retirant le groupe « Authenticated Users » du groupe « Pre-Windows 2000 Compatible Access ».
Cyberwatch recommande par ailleurs de consulter le bulletin de l’Agence Nationale de la Sécurité des Systèmes d’Information CERTFR-2021-ALE-014 et d’effectuer une recherche de la vulnérabilité sur votre système d’information dans les plus brefs délais, en ciblant a minima les contrôleurs de domaine.
Des règles de détection de compromission sont aussi mises à disposition par Microsoft.
Si malgré les recommandations officielles vous ne pouvez pas désactiver le Spouleur d’impression sur les machines les plus sensibles, Microsoft indique qu’il faut, outre l’installation des mises à jour de sécurité, vérifier la présence des clés de registre suivantes :
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Printers\PointAndPrint
NoWarningNoElevationOnInstall
NoWarningNoElevationOnUpdate
Si ces clés de registre existent, leur valeur doit impérativement être mise à 0.
Si ces clés de registre n’existent pas, aucune action complémentaire n’est requise après l’installation des mises à jour de sécurité.
Mise à jour du 6 juillet 2021 à 19h38 :
Microsoft propose également une seconde solution de contournement, qui consiste à configurer le paramètre « Autoriser le spouleur d’impression à accepter les connexions des clients » à la valeur « Désactivé », via une stratégie de groupe (GPO).
Cependant, l’application seule de ce paramètre permet d’attaquer localement le système vulnérable dans certaines conditions, comme le montre le diagramme ci-après (source : Benjamin Delpy).
Dans ce cadre, Cyberwatch recommande de privilégier une désactivation du Spouleur d’impression dans la mesure du possible, afin d’éviter toute erreur de paramétrage qui laisserait subsister la vulnérabilité, et d’attendre la sortie des correctifs de sécurité pour pouvoir réactiver ce service.
Mise à jour du 7 juillet 2021 à 9h30 :
Ajout des mises à jour sorties par Microsoft.
Cyberwatch recommande d’appliquer les mises à jour de sécurité disponibles dans les plus brefs délais, en ciblant en priorité les contrôleurs de domaines.
Conformément aux recommandations de durcissement de l’ANSSI, Cyberwatch recommande également de désactiver le service Spouleur d’impression sur les machines qui n’ont pas besoin de ce service et en particulier sur les contrôleurs de domaines.
Mise à jour du 7 juillet à 23h57 :
Ajout des mises à jour de Microsoft pour Windows Server 2012 et 2016.