Rapport CVE-2023-28218
Aperçu du bogue
Bogue conduisant à une élévation de privilèges dans le noyau Windows. Le bogue apparaît dans le pilote Windows Ancrillary Function Driver for WinSock (AFD.sys). Le bogue a été corrigé dans le correctif du 11/04/2023. Il a un score CVSS:3.1 7.0 / 6.1 et est évalué comme Important.
Description du bogue
- Type de bogue :
Double fetch et Integer overflow menant à un pool overflow.
- Le bogue se produit dans les fonctions
Afd!AfdComputeCMSGLength et Afd!AfdCopyCMSGBuffer.

Ces deux fonctions reçoivent toutes deux v82 comme paramètre d'entrée. v82 est une adresse contrôlée par l'espace utilisateur. Dans la fonction Afd!AfdComputeCMSGLength, cette adresse est déréférencée directement pour obtenir la valeur. Ensuite, la longueur du tampon CMSG est calculée et retournée. Un pool est ensuite alloué selon cette taille. En contrôlant les deux paramètres d'entrée a1 et a2, on peut contrôler la taille retournée dans le paramètre a3.

Dans la fonction Afd!AfdCopyCMSGBuffer, l'adresse v82 est déréférencée directement pour obtenir la valeur. Après quelques vérifications, cette valeur est utilisée comme taille pour l'opération memmove.

Dans cette fonction, il y a un bogue Integer overflow. Combiné au fait que les deux fonctions lisent directement depuis une adresse en espace utilisateur, on peut modifier sa valeur pendant l'exécution. Cela conduit à une taille très grande pour le memmove. Lorsque la copie atteint une zone mémoire inaccessible, un try/catch est déclenché. Mais la copie des zones précédentes a déjà eu lieu. On peut ainsi copier selon la taille souhaitée.

- Pour déclencher le POC, il faut d'abord créer un
socket avec le paramètre type défini sur SOCK_DGRAM. Ensuite, utiliser le handle de ce socket comme paramètre pour appeler la fonction bind. Enfin, créer 2 threads : un thread appelle en continu DeviceControl avec l'IOCTL 0x120D3. Configurer le userbuffer de manière appropriée pour contourner certaines vérifications. L'autre thread modifie en continu la valeur stockée à l'adresse espace utilisateur qui sert de paramètre aux deux fonctions ci-dessus.
Exploitation
- Avec ce bogue, on peut overflow un pool non-paginé NX avec une taille, et les données sont entièrement contrôlables depuis l'espace utilisateur.
- La méthode d'exploitation consiste à sprayer de nombreux objets Namedpipe, puis à en libérer certains pour créer des trous dans le tas. Ensuite, créer un pool après avoir calculé la taille depuis la fonction
Afd!AfdComputeCMSGLength. Cette taille doit correspondre à celle d'un objet Namedpipe. Le pool sera alors alloué dans les objets qui viennent d'être libérés. Utiliser le bogue pour overflow les objets Namedpipe adjacents, puis utiliser les mécanismes des Namedpipe pour obtenir un accès lecture/écriture à la mémoire noyau. Lire le token du processus système, puis l'écrire dans le token du processus actuel.
Plage affectée
- Windows Server 2012 R2 (installation Server Core) versions antérieures à 6.3.9600.20919
- Windows Server 2012 R2 versions antérieures à 6.3.9600.20919
- Windows Server 2012 (installation Server Core) versions antérieures à 6.2.9200.24216
- Windows Server 2012 versions antérieures à 6.2.9200.24216
- Windows Server 2008 R2 pour systèmes x64 Service Pack 1 (installation Server Core) versions antérieures à 6.1.7601.26466
- Windows Server 2008 R2 pour systèmes x64 Service Pack 1 versions antérieures à 6.1.7601.26466
- Windows Server 2008 pour systèmes x64 Service Pack 2 (installation Server Core) versions antérieures à 6.0.6003.22015
- Windows Server 2008 pour systèmes x64 Service Pack 2 versions antérieures à 6.0.6003.22015
- Windows Server 2008 pour systèmes 32 bits Service Pack 2 (installation Server Core) versions antérieures à 6.0.6003.22015
- Windows Server 2008 pour systèmes 32 bits Service Pack 2 versions antérieures à 6.0.6003.22015
- Windows Server 2016 (installation Server Core) versions antérieures à 10.0.14393.5850
- Windows Server 2016 versions antérieures à 10.0.14393.5850
- Windows 10 Version 1607 pour systèmes x64 versions antérieures à 10.0.14393.5850
- Windows 10 Version 1607 pour systèmes 32 bits versions antérieures à 10.0.14393.5850
- Windows 10 pour systèmes x64 versions antérieures à 10.0.10240.19869
- Windows 10 pour systèmes 32 bits versions antérieures à 10.0.10240.19869
- Windows 10 Version 22H2 pour systèmes 32 bits versions antérieures à 10.0.19045.2846
- Windows 10 Version 22H2 pour systèmes ARM64 versions antérieures à 10.0.19045.2846
- Windows 10 Version 22H2 pour systèmes x64 versions antérieures à 10.0.19045.2846
- Windows 11 Version 22H2 pour systèmes x64 versions antérieures à 10.0.22621.1555
- Windows 11 Version 22H2 pour systèmes ARM64 versions antérieures à 10.0.22621.1555
- Windows 10 Version 21H2 pour systèmes x64 versions antérieures à 10.0.19044.2846
- Windows 10 Version 21H2 pour systèmes ARM64 versions antérieures à 10.0.19044.2846
- Windows 10 Version 21H2 pour systèmes 32 bits versions antérieures à 10.0.19044.2846
- Windows 11 version 21H2 pour systèmes ARM64 versions antérieures à 10.0.22000.1817
- Windows 11 version 21H2 pour systèmes x64 versions antérieures à 10.0.22000.1817
- Windows 10 Version 20H2 pour systèmes ARM64 versions antérieures à 10.0.19042.2846
- Windows 10 Version 20H2 pour systèmes 32 bits versions antérieures à 10.0.19042.2846
- Windows 10 Version 20H2 pour systèmes x64 versions antérieures à 10.0.19042.2846
- Windows Server 2022 (installation Server Core) versions antérieures à 10.0.20348.1668
- Windows Server 2022 versions antérieures à 10.0.20348.1668
- Windows Server 2019 (installation Server Core) versions antérieures à 10.0.17763.4252
- Windows Server 2019 versions antérieures à 10.0.17763.4252
- Windows 10 Version 1809 pour systèmes ARM64 versions antérieures à 10.0.17763.4252
- Windows 10 Version 1809 pour systèmes x64 versions antérieures à 10.0.17763.4252
- Windows 10 Version 1809 pour systèmes 32 bits versions antérieures à 10.0.17763.4252
Le correctif
- Le bogue a été corrigé en remplaçant les deux anciennes fonctions par deux nouvelles fonctions ; les anciennes fonctions ont reçu le suffixe
_old à la fin de leur nom. Ces nouvelles fonctions ont été. Dans les deux nouvelles fonctions, bien qu'il y ait toujours un double fetch, la valeur lue est vérifiée avant d'être utilisée. Les fonctions Rtl sont utilisées pour remplacer les opérations arithmétiques, empêchant ainsi l'Integer overflow.
Conclusion
- Le bogue a une plage d'impact très large, menaçant de nombreux systèmes. Cependant, le payload d'exploitation a encore un faible taux d'échec, entraînant un crash de Windows en raison du spray du tas. De plus, après avoir élevé les privilèges du processus cmd à System, quitter ce processus entraîne également un crash de Windows, car l'objet Namedpipe a été corrompu pendant l'exploitation.
Pièces jointes
- POC minimal

- POC d'exploit
