Dissection de l'hyperviseur VMware - 6 Juin 2019 - Sstic
←
→
Transcription du contenu de la page
Si votre navigateur ne rend pas la page correctement, lisez s'il vous plaît le contenu de la page ci-dessous
Motivations (1) Virtualisation : quelle confiance ? ▶ Confiance « aveugle » ▶ Analyse de malwares ▶ Infrastructures critiques ▶ Cloud computing ▶ Risque principal : l’isolation n’est plus physique mais logicielle SSTIC 2019 Dissection de l’hyperviseur VMware 1
Motivations (1) Virtualisation : quelle confiance ? ▶ Confiance « aveugle » ▶ Analyse de malwares ▶ Infrastructures critiques ▶ Cloud computing ▶ Risque principal : l’isolation n’est plus physique mais logicielle Cas de l’hyperviseur VMware ▶ Hyperviseur très répandu : Workstation (desktop), ESXi (serveur) ▶ Facilitation des interactions utilisateur ▶ Snapshots ▶ Accélération 3D ▶ Mode Unity (Windows, macOS) SSTIC 2019 Dissection de l’hyperviseur VMware 1
Motivations (2) SSTIC 2019 Dissection de l’hyperviseur VMware 2
Fonctionnement général des hyperviseurs
Prérequis formels (1) ▶ Popek et Goldberg, Formal Requirements for Virtualizable Third Generation Architectures, 1974 : ensemble de conditions suffisantes (mais non nécessaires !) à la virtualisation sur une architecture ▶ Spécification des propriétés attendues d’un hyperviseur : ▶ Fidélité, ▶ Performance, ▶ Contrôle sur les ressources. Définition (instruction privilégiée) Une instruction est dite privilégiée si l’exécution de celle-ci lance une exception lorsque le processeur n’est pas en mode superviseur. SSTIC 2019 Dissection de l’hyperviseur VMware 3
Prérequis formels (2) Définition (instruction sensible) Une instruction est dite critique ou sensible si celle-ci interagit avec le matériel. Théorème Pour tout ordinateur de troisième génération conventionnel, un hyperviseur peut être construit si l’ensemble de ses instructions sensibles est un sous-ensemble de ses instructions privilégiées. SSTIC 2019 Dissection de l’hyperviseur VMware 4
Prérequis formels (2) Définition (instruction sensible) Une instruction est dite critique ou sensible si celle-ci interagit avec le matériel. Théorème Pour tout ordinateur de troisième génération conventionnel, un hyperviseur peut être construit si l’ensemble de ses instructions sensibles est un sous-ensemble de ses instructions privilégiées. ▶ Processeurs x86_32 : instructions sensibles mais non privilégiées ▶ Contrôle sur les ressources difficile ▶ x86_32 n’est pas donc pas virtualisable au sens de Popek et Goldberg SSTIC 2019 Dissection de l’hyperviseur VMware 4
Virtualisation assitée par le matériel (1) Instructions VT-x ▶ Permet à l’hyperviseur d’intercepter automatiquement les instructions sensibles ▶ Deux nouveau modes d’exécution (VMX root, VMX non-root) ▶ Utilisation de Virtual Machine Control Structures pour contrôler les transitions entre ces deux modes SSTIC 2019 Dissection de l’hyperviseur VMware 5
Virtualisation assitée par le matériel (1) Instructions VT-x ▶ Permet à l’hyperviseur d’intercepter automatiquement les instructions sensibles ▶ Deux nouveau modes d’exécution (VMX root, VMX non-root) ▶ Utilisation de Virtual Machine Control Structures pour contrôler les transitions entre ces deux modes Traitement des VM exits ▶ Contenu de la VMCS ▶ État du système invité, ▶ État du système hôte, ▶ Champs d’information de sortie de la VM. . . ▶ Lorsqu’une instruction sensible est piégée dans l’hyperviseur : ▶ Lecture des champs appropriés de la VMCS, ▶ Exécution du traitement approprié et reprise de l’exécution de la VM. SSTIC 2019 Dissection de l’hyperviseur VMware 5
Virtualisation assitée par le matériel (2) vmxon init VMCS vm l a u n c h while (1) { e x i t _ c o d e = r e a d _ e x i t _ c o d e ( VMCS ) ; switch ( exit_code ) { c a s e TRIPLE_FAULT_EXIT : // T r a i t e m e n t en c a s de t r i p l e f a u l t c a s e IO_INSTRUCTION : // T r a i t e m e n t en c a s d ’ i n s t r u c t i o n I /O c a s e VMXOFF_INSTRUCTION : // T r a i t e m e n t l a VM e x é c u t e l ’ i n s t r u c t i o n v m x o f f [ . . . ] // A u t r e s e x i t c o d e s } vm r e s u m e } vmxoff SSTIC 2019 Dissection de l’hyperviseur VMware 6
Étude des mécanismes de l’hyperviseur VMware
Communication entre VM et hyperviseur : Backdoor ▶ Communication par le biais de ports I/O mov rax , 0 x564D5868 ; magic number spéciaux (VM exits) mov rbx , 0 x8686 ; params commande ▶ Ports I/O 0x5658 (slow ) et 0x5659 (fast) mov rcx , 0 x01 ; num commande mov dx , 0 x5658 ; port ▶ Activé par défaut ▶ Pas besoin d’être en ring 0 (choix in rax , dx d’architecture) Listing 1 – Exemple de communication par ▶ Pas de différenciation du niveau de Backdoor: récupération de la fréquence du privilège de l’appelant CPU. SSTIC 2019 Dissection de l’hyperviseur VMware 7
Protocoles sur Backdoor RPCI ▶ Messages du système invité vers l’hyperviseur ▶ Informations sur le système invité, logs, drag n’ drop, presse-papiers du guest, Unity. . . ▶ Exemple de commande : info-set guestinfo.ip 192.168.122.123 ▶ Format des réponses 0/1 ▶ Utiliser l’outil rpctool ! SSTIC 2019 Dissection de l’hyperviseur VMware 8
Protocoles sur Backdoor RPCI ▶ Messages du système invité vers l’hyperviseur ▶ Informations sur le système invité, logs, drag n’ drop, presse-papiers du guest, Unity. . . ▶ Exemple de commande : info-set guestinfo.ip 192.168.122.123 ▶ Format des réponses 0/1 ▶ Utiliser l’outil rpctool ! TCLO ▶ Requêtes de l’hyperviseur vers le système invité ▶ Synchronisation de l’horloge, presse-papiers, commandes Unity. . . ▶ Exemple de commande : Capabilities_Register ▶ Format des réponses : OK ou OK [DATA] SSTIC 2019 Dissection de l’hyperviseur VMware 8
Méthodologie RE (1) : repérage de symboles RE : Par où commencer ? ▶ Nombreux binaires et DLLs, de taille importante ▶ On aimerait gagner du temps. . . ▶ Première étape : repérer des symboles ▶ Exports des DLLs ▶ Exploitation des strings des binaires SSTIC 2019 Dissection de l’hyperviseur VMware 9
Méthodologie RE (1) : repérage de symboles RE : Par où commencer ? ▶ Nombreux binaires et DLLs, de taille importante ▶ On aimerait gagner du temps. . . ▶ Première étape : repérer des symboles ▶ Exports des DLLs ▶ Exploitation des strings des binaires lea rdx , aV m xv md b _s e td ev ; " V M X V m d b _ S e t D e v P r e s e n t " lea rcx , aS D ev ic e No t Fo un ; "% s : device not found !\ n " call Debug jmp short lo c _ 7 F F7 F 15D 6 3F F Listing 2 – Exemple de log permettant de déterminer le nom de la fonction courante. SSTIC 2019 Dissection de l’hyperviseur VMware 9
Méthodologie RE (2) : énumération de commandes RPCI Repérage de commandes ▶ Inspection des xrefs à une commande connue ▶ Chaîne correspondante référencée dans une unique fonction commune à d’autres commandes, en charge d’enregistrer les handlers de commandes RPCI ▶ RegisterRPCICommandHandler(id, vmdbKey, command, handler, a5) SSTIC 2019 Dissection de l’hyperviseur VMware 10
Méthodologie RE (2) : énumération de commandes RPCI Repérage de commandes ▶ Inspection des xrefs à une commande connue ▶ Chaîne correspondante référencée dans une unique fonction commune à d’autres commandes, en charge d’enregistrer les handlers de commandes RPCI ▶ RegisterRPCICommandHandler(id, vmdbKey, command, handler, a5) Utilisation ▶ Confirmation de l’existance avec rpctool ▶ Mise en avant de commandes inconnues/peu fréquentes dans les captures. . . ▶ . . . et donc de nouveau éléments à fuzz :) ▶ Bémol : extrêmement chronophage de respécifier chaque commande ! SSTIC 2019 Dissection de l’hyperviseur VMware 10
VMDB Mise en évidence ▶ Utilisation du repérage de symboles ▶ Base de données relative à l’exécution de la machine virtuelle maintenue par le vmx ▶ Informations sur le système invité ▶ Gestion de la console (MKSVmdb*) ▶ Callbacks (VMXVmdbCb_RegisterCallbacks) SSTIC 2019 Dissection de l’hyperviseur VMware 11
VMDB Mise en évidence ▶ Utilisation du repérage de symboles ▶ Base de données relative à l’exécution de la machine virtuelle maintenue par le vmx ▶ Informations sur le système invité ▶ Gestion de la console (MKSVmdb*) ▶ Callbacks (VMXVmdbCb_RegisterCallbacks) Propriétés ▶ Fonctionnement analogue à celui d’un système de fichiers. . . ▶ Structure arborescente, chemins (Vmdb_SetCurrentPath), lien symbolique .. ▶ Exemple de chemin : guest/caps/unityFeatures ▶ . . . tout en restant une base de données ▶ Lecture (Vmdb_Set*) et écriture (Vmdb_Get*) de valeurs, notion de schéma SSTIC 2019 Dissection de l’hyperviseur VMware 11
Communication inter-processus (1) Architecture générale ▶ Découpage en processus ▶ vmware-vmx.exe : hyperviseur, interaction avec vmx86 ▶ vmware.exe : interface graphique ▶ VMDB au coeur des communications entre ces processus IPC via named pipes ▶ Le VMX expose des named pipes, ensuite utilisées par le processus vmware.exe ▶ Mise à jour de données ▶ Lancement d’évènements ▶ Sniffing des named pipes à l’aide de WinDbg : appels à ReadFile/WriteFile SSTIC 2019 Dissection de l’hyperviseur VMware 12
Communication inter-processus (2) 6 TUPLESe / vm /# _VMX / vmx /1 1 21 021 unity / unityUpdate /#19/ updateData /1 228 ,→ b W 9 2 Z S A 2 N j Q 1 M i A z O D I g N D g x I D Q z M i A 1 M z k A A A A =1 1 22 220 1 10 1 1 SSTIC 2019 Dissection de l’hyperviseur VMware 13
Recherche de vulnérabilités sur le mode Unity
Fonctionnement du mode Unity (1) Fonctionnement général ▶ Repose en grande majorité sur les mécanismes présentés ▶ Extensions de système invité : vmtoolsd.exe ▶ Système de plugins (DLLs), différents niveaux de privilèges ▶ Basculement effectué à l’initiative du système hôte ▶ Échange de messages unityUpdate entre VM et hyperviseur, différents types SSTIC 2019 Dissection de l’hyperviseur VMware 14
Fonctionnement du mode Unity (1) Fonctionnement général ▶ Repose en grande majorité sur les mécanismes présentés ▶ Extensions de système invité : vmtoolsd.exe ▶ Système de plugins (DLLs), différents niveaux de privilèges ▶ Basculement effectué à l’initiative du système hôte ▶ Échange de messages unityUpdate entre VM et hyperviseur, différents types Propagation des messages ▶ VM → hyperviseur : message RPCI → unityUpdate dans VMDB → IPC avec GUI → interaction user32.dll ▶ Hyperviseur → VM : message TCLO → prise en charge par vmusr/unity.dll → interaction user32.dll SSTIC 2019 Dissection de l’hyperviseur VMware 14
Fonctionnement du mode Unity (2) Invité Hôte cui::UnityMgr::OnUnityUpdate vmxd TCLO Callbacks RPC VMDB TUPLES [b64] vmwarebase!ParseUnityUpdate MAJ VMDB RPCI VmxVmdbCbUnityCmd user32.dll unity.dll vmxd VmxVmdbUnityCB cui!ProcessUnityUpdate vmtoolsd.exe vmware-vmx.exe vmware.exe SSTIC 2019 Dissection de l’hyperviseur VMware 15
Problématique ▶ Mode Unity : communications complexes entre VM et VMM ▶ Surface d’attaque a priori intéressante ▶ Messages trop nombreux et complexes pour analyse manuelle ▶ Sous notre contrôle : messages RPCI et réponses TCLO ▶ Nécessité d’automatisation des interactions SSTIC 2019 Dissection de l’hyperviseur VMware 16
Recherche de vulnérabilités sur le mode Unity Solution retenue
Mutation et rejeu de captures RPCI Méthodologie ▶ Méthode de capture présentée par ZDI ▶ Capture des messages RPCI dans une fonction du VMX avec WinDbg ▶ Rejeu avec un script dédié, dans l’ordre ou non Avantages/défauts + Simplicité de mise en oeuvre + Génération automatique d’interactions non cohérentes − Code coverage limité à moins de disposer une capture très importante − Besoin de redéveloppement pour cibler d’autres mécanismes SSTIC 2019 Dissection de l’hyperviseur VMware 17
MemITM (1) Généralités ▶ Fuzzer en mémoire développé chez Amossys ▶ Interception et modification en mémoire de messages d’un processus Windows depuis Python ▶ Disponible sur GitHub :) Utilisation ▶ Génération d’une configuration via IDAPython ▶ Deux fonctions exposées à l’utilisateur ▶ logger : sauvegarde des messages, envoi via HTTP. . . ▶ fuzzer : bitflip, substitution de valeurs. . . ▶ Utilisation des fonctions et bibliothèques Python SSTIC 2019 Dissection de l’hyperviseur VMware 18
MemITM (2) Placement du hook en mémoire ▶ Nécessité de savoir où se placer en mémoire ▶ Fuzzing d’une partie ou de toutes les commandes : en fonction de l’adresse du hook ▶ Dans notre cas : placement dans les DLLs de vmtoolsd.exe (pas de bypass de checks) Avantages/défauts + Précision dans le ciblage des messages à muter + Pas de besoin de redéveloppement, il suffit de modifier le hook − Création des messages non automatique − Impossible de modifier la taille du buffer. . . SSTIC 2019 Dissection de l’hyperviseur VMware 19
Recherche de vulnérabilités sur le mode Unity Résultats
Ciblage de la GUI ? SSTIC 2019 Dissection de l’hyperviseur VMware 20
Crash en quelques printf (1) SSTIC 2019 Dissection de l’hyperviseur VMware 21
Crash en quelques printf (1) SSTIC 2019 Dissection de l’hyperviseur VMware 21
Crash en quelques printf (2) Au secours, printf a cassé mon hyperviseur ! ▶ Vulnérabilité découverte « par hasard » : affichage des 0x07 lors du rejeu de messages RPCI ▶ Bug dans le transfert de l’audio de la VM vers l’hôte, non privilégié ▶ Spécifique à la version Linux de VMware Workstation ▶ Signalée à VMware et corrigée (CVE-2019-5525) SSTIC 2019 Dissection de l’hyperviseur VMware 22
Crash en quelques printf (2) Au secours, printf a cassé mon hyperviseur ! ▶ Vulnérabilité découverte « par hasard » : affichage des 0x07 lors du rejeu de messages RPCI ▶ Bug dans le transfert de l’audio de la VM vers l’hôte, non privilégié ▶ Spécifique à la version Linux de VMware Workstation ▶ Signalée à VMware et corrigée (CVE-2019-5525) Exploitabilité ? ▶ Reproductibilité : sur divers systèmes hôtes et invités ▶ Différents cas : ▶ Écriture à une adresse invalide ▶ Appel d’une fonction après déreférence d’un pointeur : besoin d’un info leak ▶ Heap spraying à l’aide de messages RPCI SSTIC 2019 Dissection de l’hyperviseur VMware 22
Cas 1 : écriture à une adresse invalide -------[registers]------- $rax: 0x0 $rbx: 0x8b703 $rcx: 0x0 $rdx: 0x0 $rsp: 0x7ffdbdf6c908 → [...] → 0x0000000000424242 ("BBB"?) $rbp: 0x0 $rsi: 0x7f95ac493410 → 0x00007f95ac3d9460 → "BBBBBBBBBBBBBBBBB[...]" [...] $r10: 0x0 [...] $r13: 0x7f95ac30f310 → 0x00007f95ac4462c0 → 0x0042424242424242 ("BBBBBBB"?) [...] ---------[code]---------- 0x7f95bb8c0147 nop WORD PTR [rax+rax*1+0x0] 0x7f95bb8c0150 add r14d, 0x1 0x7f95bb8c0154 cmp DWORD PTR [rdi+0x10], r14d 0x7f95bb8c0158 mov WORD PTR [r10], r11w ← $rip 0x7f95bb8c015c ja 0x7f95bb8c001f 0x7f95bb8c0162 pop rbx 0x7f95bb8c0163 pop rbp SSTIC 2019 Dissection de l’hyperviseur VMware 23
Cas 2 : VM escape potentielle -------[registers]------- $rax: 0x4242424242424242 ("BBBBBBBB"?) $rbx: 0x7fe7b81f4800 → 0x0000000000000000 $rcx: 0x6f [...] $rdi: 0x4242424242424242 ("BBBBBBBB"?) $rip: 0x7fe7c5777681 → call QWORD PTR [rax+0x38] $r8: 0x0 [...] ---------[code]---------- 0x7fe7c577766e add BYTE PTR [rbp+0x484d75f6], al 0x7fe7c5777674 mov eax, DWORD PTR [rbx+0x198] 0x7fe7c577767a mov rdi, QWORD PTR [rbx+0x1a8] 0x7fe7c5777681 call QWORD PTR [rax+0x38] ← $rip 0x7fe7c5777684 mov edx, DWORD PTR [rbx+0x1cc] 0x7fe7c577768a mov ebp, eax 0x7fe7c577768c test edx, edx 0x7fe7c577768e jne 0x7fe7c57776a0 SSTIC 2019 Dissection de l’hyperviseur VMware 24
Conclusions et perspectives Conclusions ▶ Mode Unity : surface d’attaque a priori intéressante, intérêt final limité ▶ Passage initié depuis le système hôte ▶ Pas de crash du VMX relatif au mode Unity (fuzzing « trivial ». . . ) ▶ Fuzzing en mémoire : perte du suivi des fenêtres ▶ Mise en avant de nouvelles surfaces d’attaques potentielles : audio et GUI Perspectives ▶ Fuzzing audio de l’hyperviseur VMware ▶ Recherche de vulnérabilités relative à l’interface graphique (Workstation et ESXi) SSTIC 2019 Dissection de l’hyperviseur VMware 25
Questions ?
Vous pouvez aussi lire