CVE-2021-34527 : Comment identifier et neutraliser la vulnérabilité PrintNightmare ?

Comment identifier et neutraliser la vulnérabilité PrintNightmare ?
Gwendal LE FUR
juillet 03, 2021

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 :

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.

Schéma du fonctionnement de RpcAddPrinterDriver
Figure 1 – Schéma du fonctionnement de RpcAddPrinterDriver

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.

Schéma du téléversement d'une bibliothèque dynamique malveillante
Figure 2 – Téléversement d’une bibliothèque dynamique malveillante

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.

Schéma du résultat attendu du deuxième appel à RpcAddPrinterDriver
Figure 3 – Résultat attendu du deuxième appel à RpcAddPrinterDriver

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.

Schéma du résultat obtenu après un deuxième appel à RpcAddPrinterDriverEx
Figure 4 – Résultat obtenu après le deuxième appel à RpcAddPrinterDriverEx

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 ».

Lecture de l'exploit PrintNightmare depuis GitHub
Figure 5

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.

Les valeurs attendues dans « dwFileCopyFlags » après la première option sont définies dans la documentation Microsoft
Figure 6 – Source

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.

Options utilisées dans "dwFileCopyFlags" pour contouner la vérification d'autorisation et réaliser une élévation de privilèges
Figure 7 – Options utilisées dans « dwFileCopyFlags » pour contouner la vérification d’autorisation et réaliser une élévation de privilèges

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.

Diagramme d'aide à la vérification des actifs impactés (source Stan Hegt / Outflank)
Figure 8 – Diagramme d’aide à la vérification des actifs impactés (source Stan Hegt / Outflank)

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 :

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).

Image
Diagramme d’état de la vulnérabilité PrintNightmare en date du 6 juillet 2021 à 19h38 (source)

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.

Vous avez des questions ?

Vous souhaitez une démonstration ?

Contactez-nous et nos experts reviendront vers vous sous 24h.

Votre demande