![Fusée :rocket: 🚀](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f680.png)
Cet article couvre le processus de découverte de multiples vulnérabilités du noyau introduites dans 24H2 et d'écriture d'un exploit, y compris la contournement des nouvelles mesures de renforcement de l'ASLR du noyau (KASLR).
![Tag :label: 🏷️](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f3f7.png)
• Connaissance de l'ingénierie inverse
• Connaissance des failles de double-fetch
• Accès au code source et compilateur de Microsoft
![Memo :pencil: 📝](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f4dd.png)
![Équipement :gear: ⚙️](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/2699.png)
• En analysant diverses parties du noyau NT dans 24H2, j'ai découvert deux vulnérabilités de type double-fetch de la mémoire en mode utilisateur.
• Ces bugs étaient particulièrement intéressants car ils apparaissaient dans du code présent depuis longtemps qui était auparavant sûr.
![Équipement :gear: ⚙️](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/2699.png)
• Il semble y avoir eu des modifications larges pour traiter la mémoire en mode utilisateur comme volatile dans le noyau.
• Un élément de preuve est l'ajout d'une nouvelle fonction de copie de mémoire nommée RtlCopyVolatileMemory.
Code:
RtlCopyVolatileMemory
• Cette fonction se comporte exactement comme RtlCopyMemory mais explicitement pour accéder à la mémoire volatile.
• Voici quelques exemples :
• Cas 1 : une lecture de 4 octets de la mémoire en mode utilisateur dans NtCreateTimer2
![Fz8aHtT.png](https://i.imgur.com/Fz8aHtT.png)
• Cas 2 : une lecture de 16 octets de la mémoire en mode utilisateur dans ObpCaptureBoundaryDescriptor
![8Ee3VaS.png](https://i.imgur.com/8Ee3VaS.png)
![Équipement :gear: ⚙️](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/2699.png)
• Le NtCreateUserProcess syscall traite la liste d'attributs PS_ATTRIBUTE_LIST en mémoire utilisateur.
• La fonction PspBuildCreateProcessContext contient un double-fetch du champ Size dans PS_ATTRIBUTE, déclenchant un débordement de tampon sur la pile.
• Code source et désassemblage pour 23H2 (non vulnérable) et 24H2 (vulnérable) :
23H2
![x8HzBbE.png](https://i.imgur.com/x8HzBbE.png)
24H2
![lUsEOaY.png](https://i.imgur.com/lUsEOaY.png)
![Équipement :gear: ⚙️](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/2699.png)
• Ce bug permet de contourner la sonde d'une adresse fournie par l'utilisateur.
• Le NtQueryInformationThread syscall contient une grande instruction switch pour différents types d'informations.
• La vulnérabilité se trouve dans la classe ThreadTebInformation, permettant de lire des parties du TEB du thread.
23H2
![t6fTnQZ.png](https://i.imgur.com/t6fTnQZ.png)
24H2
![vJ7NkZt.png](https://i.imgur.com/vJ7NkZt.png)
![Équipement :gear: ⚙️](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/2699.png)
• Dans les versions précédentes de Windows, la défaite de KASLR était triviale grâce à des syscall incluant des pointeurs du noyau.
• En 24H2, ces fuites d'adresses de noyau ne sont plus disponibles pour les appelants non privilégiés.
• Une nouvelle technique est nécessaire pour déterminer la disposition du noyau.
![Équipement :gear: ⚙️](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/2699.png)
• EntryBleed utilise un canal latéral de synchronisation pour déterminer l'adresse du noyau.
• La fonction prefetch charge une adresse dans le cache du CPU, sans se soucier si l'adresse est en mode noyau.
![Équipement :gear: ⚙️](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/2699.png)
• J'ai découvert que le KVA shadowing est désactivé sur les machines modernes sous Windows 11.
• Cela signifie que l'espace d'adressage du noyau est présent dans les tables de pages en mode utilisateur.
• Une attaque de préchargement contre Windows est décrite dans un article de Daniel Gruss, Clémentine Maurice et Anders Fogh (2016).
• Un outil fiable pour déterminer l'adresse de base du noyau est disponible sur GitHub.
![vSfVj4l.png](https://i.imgur.com/vSfVj4l.png)
![Équipement :gear: ⚙️](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/2699.png)
• Nous avons contourné le KASLR et localisé l'adresse de base du noyau en mémoire.
• Nous avons une vulnérabilité permettant d'écrire des données arbitraires dans le noyau.
![Équipement :gear: ⚙️](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/2699.png)
• Nous devons créer un primitive de lecture en modifiant un global dans le noyau.
• La classe SystemManufacturingInformation dans le syscall NtQuerySystemInformation copie une structure globale UNICODE_STRING en mémoire utilisateur.
• En écrasant les valeurs dans la structure globale, il est possible de lire depuis une adresse arbitraire et de retourner les données en mémoire utilisateur.
![Équipement :gear: ⚙️](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/2699.png)
•
![Bouton de coche :white_check_mark: ✅](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/2705.png)
•
![Bouton de coche :white_check_mark: ✅](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/2705.png)
•
![Bouton de coche :white_check_mark: ✅](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/2705.png)
![Équipement :gear: ⚙️](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/2699.png)
• La technique utilisée consiste à échanger le jeton de processus avec celui d'un processus privilégié.
• Après l'échange de jetons, nous pouvons créer un processus avec des privilèges élevés.
![YwNsyj6.png](https://i.imgur.com/YwNsyj6.png)
![Ampoule :bulb: 💡](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f4a1.png)
• Consulter le code source et le compilateur pour éviter des modifications incongrues.
![Lien :link: 🔗](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f517.png)
• Recherche Support Microsoft
• Recherche Learn Microsoft
• Recherche Google
• Recherche Bing
![Drapeau arrivée :checkered_flag: 🏁](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f3c1.png)
En conclusion, les vulnérabilités découvertes dans 24H2 montrent les risques associés aux modifications des anciens codes. La contournement de KASLR reste un défi, mais des techniques comme le préchargement peuvent encore être exploitées pour des attaques réussies.