Produit

Protection des processus Windows protégés

Ce court article de blog est le premier d’une série en deux parties traitant d’une exploitation Windows en mode utilisateur, initialement révélée par James Forshaw et Alex Ionescu. Cette exploitation permet aux attaquants d’effectuer des actions hautement privilégiées qui nécessitent généralement un pilote de noyau.

Protected process light

Windows 8.1 a introduit le concept de Protected Process Light (PPL), qui permet à des programmes spécialement signés de s'exécuter de telle manière qu'ils sont immunisés contre toute altération ou interruption, même par des utilisateurs administrateurs. L'objectif est d'empêcher les logiciels malveillants de se propager — en altérant les processus du système stratégique et en terminant les applications anti-malware. Il existe une hiérarchie de « niveaux » PPL, où les niveaux à privilèges élevés sont immunisés contre les altérations par les niveaux à privilèges inférieurs, mais pas l'inverse. 

Pour plus d'informations sur les processus PPL, veuillez consulter les ressources suivantes :

L'exploit

De manière générale, l'exploit est une attaque par empoisonnement de cache où un attaquant peut ajouter une DLL au cache KnownDlls — une liste approuvée de DLL Windows. KnownDlls n'est accessible en écriture que par les processus WinTcb, qui constituent la forme la plus élevée de PPL... mais un bug dans l'implémentation de l'API DefineDosDevice permet aux attaquants de tromper CSRSS, un processus WinTcb, pour qu'il crée une entrée de cache en leur nom. KnownDlls est approuvé par le chargeur Windows, donc aucune vérification de sécurité supplémentaire n'est effectuée lors du chargement des KnownDlls, même au sein des processus PPL. Après avoir empoisonné le cache, l'attaquant lance un processus protégé qui finit par charger sa DLL et exécuter sa charge utile.

Comme cette faille permet aux attaquants d'injecter une DLL de leur choix dans un processus PPL, ils peuvent effectuer n'importe quelle action avec les privilèges WinTcb. Microsoft a indiqué qu'ils ne sont pas intéressés par la correction de cette vulnérabilité. Il est confirmé que cela fonctionne sur Windows 10 21H1 version 10.0.19043.985.

Open source

Le premier POC d’exploit public dont nous avons connaissance est PPLDump, un outil récemment publié capable de vider n’importe quel processus PPL, tel que LSASS en mode RunAsPPL. Quelques semaines après la sortie de PPLDump, Sealighter-TI est apparu, réutilisant le code d’exploit de PPLDump pour accéder au flux ETW Threat-Intelligence, normalement réservé aux entreprises d’antimalwares sous accord de confidentialité (NDA). La rapidité avec laquelle Sealighter-TI a été développé démontre la facilité avec laquelle il est possible de réutiliser le code d’exploit pour exécuter une nouvelle charge utile.

Le code d'exploitation étant public, nous nous attendons à ce que les outils offensifs l'exploitent rapidement en exécutant des charges utiles en tant que WinTcb PPL. Cela leur permettra de :

  • Récupérer les identifiants d'entreprise, même lorsque LSASS est renforcé pour une exécution en tant que PPL.
  • Terminer ou désactiver silencieusement les processus PPL tels que les produits de sécurité.
  • Exécution d’implants entiers en tant que processus WinTcb PPL. Ces implants ne peuvent pas être inspectés ou terminés par des produits de sécurité en mode utilisateur. Microsoft restreint les produits de sécurité à l’AntiMalware PPL, qui dispose de privilèges inférieurs à ceux de WinTcb.
  • Injectez du code dans des processus PPL existants. Imaginez l'exécution de la charge utile beacon de Cobalt Strike à l'intérieur de Windows Defender.

Combler la faille

Face à cette vulnérabilité sans atténuation publique, nous publions un outil appelé PPLGuard pour la combler. PPLGuard, basé sur la base de code de PPLDump avec autorisation, utilise l'exploit pour s'élever d'abord au niveau WinTcb PPL, puis applique une DACL rendant le répertoire d'objets KnownDlls en lecture seule. Cela bloque l'exploit en empêchant CSRSS d'ajouter une nouvelle entrée — une étape critique dans la chaîne d'exploitation. Cette DACL n'existe qu'en mémoire, elle est donc effacée au redémarrage. 

GENERIC_WRITE DENY ACE ajouté à KnownDlls par PPLGuard

Puisque PPLGuard corrige la vulnérabilité sur laquelle repose l'exploitation, les exécutions ultérieures échoueront.

C:\git\PPLGuard>x64\Release\PPLGuard.exe
[+] Renforcement de KnownDlls réussi ! :)
C:\git\PPLGuard>x64\Release\PPLGuard.exe
[-] DefineDosDevice a échoué avec le code d'erreur 5 - Accès refusé.

L'outil de démonstration de faisabilité PPLGuard est disponible ici.

Conclusion

Dans cet article, nous avons abordé une exploitation de privilèges Windows et fourni un outil open source qui atténue la vulnérabilité exploitée. Dans la deuxième partie de cet article, nous verrons comment rechercher ce type d'attaques à l'aide d'Elastic Security. Restez à l'écoute.

En attendant, découvrez notre dernière version du service Elasticsearch sur Elastic Cloud. Assurez-vous également de profiter de nos formations rapides pour être opérationnel rapidement.

Mise à jour 03.06.2021 : après la rédaction de ce blog, quelqu'un a porté l'exploit PPLDump vers .NET pour l’exécution du beacon Cobalt Strike en tant que WinTCB PPL.