Escalade des privilèges locaux Exploit pour le pilote du noyau CPU-Z.
L'application CPU-Z installera un pilote signé vulnérable pour accéder aux données du noyau à partir de Usermode. Avant V1.81, le pilote CPU-Z a exposé trois IOCTL qui permettent à toute application UserMode de lire les registres de contrôle, de lire DWORDS à partir de la mémoire physique et d'écrire des DWORD à la mémoire physique. Nous abuseurs de cette fonctionnalité pour obtenir l'exécution complète du code du mode de noyau et engendrer un shell système comme preuve de concept.
Cet exploit prend en charge Windows XP - Windows 10 1607:
Cet exploit a été testé sur les systèmes suivants avec CPU-Z v1.76:
* Sur Windows 1703 et le gardien de flux de contrôle du noyau ultérieur (CFG) est activé par défaut [1], ce qui donne une vérification de bogue Kernel_Security_Check_Failure.
Pour exécuter cet exploit, démarrez l'application CPU-Z et exécutez exploit.exe à partir d'une invite de commande en tant qu'utilisateur normal. En cas de succès, il devrait engendrer un nouveau processus CMD.EXE en cours de système. Notez que cet exploit échouera s'il est exécuté à partir d'un processus à faible intégrité en raison de l'utilisation de NTQuerySystemInformation.
Le pilote du noyau CPU-Z avant V1.81 permet à toute application UserMode de lire les registres de contrôle, de lire DWORDS à partir de la mémoire physique et d'écrire des DWORD à la mémoire physique. Nous abuseurs de cette fonctionnalité pour lire CR3 et traverser les tables de page afin de créer une lecture / écriture arbitraire primitive sur l'ensemble de l'espace mémoire virtuel.
Avec une lecture / écriture complète, nous retournons le bit utilisateur / superviseur sur l'entrée de la table de page (PTE) contenant notre charge utile sur KernelMode pour contourner la prévention de l'exécution du mode superviseur (SMEP). Nous écrasons ensuite un pointeur de fonction sur NT! HalDispatchTable [1] et déclenchant la charge utile en appelant ntQueryIntervalProfile.
En tant que preuve de concept, la charge utile affectera le jeton système à un processus CMD.exe suspendu et reprendra le processus. Cela devrait entraîner une nouvelle invite de commande exécutée en tant qu'autorité / système NT. La charge utile ne s'appuie pas sur les décalages statiques et devrait donc fonctionner sur Windows XP +.
Un certain nombre d'atténuations ont été introduites au cours des deux dernières années qui limitent l'efficacité de cet exploit. Une brève description est ci-dessous.
À partir de la version 1.81, le pilote fourni avec CPU-Z a été corrigé pour limiter l'ensemble des appelants pouvant ouvrir son objet de périphérique et certaines implémentations IOCTL ont été supprimées. Sur les demandes d'ouvrir l'objet de périphérique du pilote, il vérifiera si le processus actuel a le SEOADDRIRIVERPRIVIRILEGE activé. Si ce privilège est manquant ou désactivé, le conducteur rejettera la demande avec status_access_denided. Notez que lors de l'exécution en tant qu'administrateur, il est trivial d'activer ce privilège de Usermode. En outre, les registres de contrôle IOCTL pour lire ont été supprimés (bien que les implémentations de lecture / écriture de mémoire physique restent). Sans la possibilité de lire la base de table de page à partir de CR3, la méthode d'exploitation de ce projet n'est plus possible. Notez que le pilote CPU-Z fournit de nombreux autres IOCTL qui pourraient être utilisés pour l'exploitation, tels que la lecture et l'écriture à des registres arbitraires spécifiques au modèle.
À partir de Windows 10 1703 (mise à jour des créateurs), le gardien de flux de contrôle du noyau est activé par défaut sur x86_64. Les appels via le haldispatchTable entraîneront une vérification de bogue Kernel_Security_check_failure car il est protégé par CFG. Si la sécurité basée sur la virtualisation (VBS) n'est pas activée, il devrait être possible d'ajouter la charge utile en tant que cible d'appel valide pour contourner CFG.
Si la sécurité basée sur la virtualisation (VBS) est activée, elle tuera la majorité de cet exploit. La manipulation du PTE utilisée pour désactiver la SMEP ne sera plus possible, car les PTE seront protégés par l'hyperviseur. De plus, un contournement CFG sera nécessaire sur x86_64 pour gagner l'exécution de code via le haldispatchTable car le bitmap de noyau CFG ne sera pas écrite.
Les vulnérabilités utilisées dans cet exploit sont détaillées dans CVE-2017-15302 et CVE-2017-15303. Une autre preuve de concept peut être vue sur CPUZ-DSEFIX [5].
[1] https://community.osr.com/discussion/283374/Control-flow-luard-Qtion
[2] https://www.cvedetails.com/cve/cve-2017-15302/
[3] https://www.cvedetails.com/cve/cve-2017-15303/
[4] https://github.com/akayn/bugs/blob/master/cpuid/cve-2017-15302/readme.md
[5] https://github.com/samlarenn/cpuz-dsefix
De plus, la méthode d'écrasement HalDispatchTable utilisée dans cet exploit est un vecteur couramment utilisé pour obtenir l'exécution de code à partir d'une primitive de lecture / écriture du noyau. Pour plus de détails sur cette technique, consultez les ressources ci-dessous.
[6] http://poppopret.blogspot.com/2011/07/windows-kernel-exploitation-basics-part.html
[7] https://www.abatchy.com/2018/01/kernel-exploitation-7
[8] https://osandamalith.com/2017/06/14/windows-kernel-exploitation-arbitrary-overwrite/
[9] https://rootkits.xyz/blog/2017/09/kernel-write-what-where/