Dissection de l'hyperviseur VMware - 6 Juin 2019 - Sstic

 
Dissection de l'hyperviseur VMware - 6 Juin 2019 - Sstic
Dissection de l’hyperviseur VMware

         Brice L’helgouarc’h

             6 Juin 2019
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