Après la récente 0-day dans Internet Explorer (Réf Lexsi 12808) et l'Opération Aurora, c'est au tour du sous-système 16 bits de Windows d'être vulnérable à une élévation locale de privilèges. Toutes les versions de Windows sont affectées, de NT 3.1 (!) à Windows 7.

La vulnérabilité (Réf Lexsi 12828) affecte le composant VDM (Virtual DOS Machine) de Windows, chargé de permettre aux applications 16 bits en mode réel de s'exécuter dans un environnement 32 bits en mode protégé, via le mode 8086 virtuel du processeur. Lors de la restauration du contexte et de la pile par le gestionnaire de l'interruption General Protection Fault (interruption 0x0d), celui-ci vérifie qu'ils sont valides, mais se base sur 3 assertions qui peuvent être contournées une par une, permettant de fournir son propre contexte et sa pile noyau. Tavis Ormandy (Google) a publié les détails sur Full-Disclosure, accompagné d'un code d'exploitation.

La séquence est la suivante :

  1. lancement d'un processus (ici cmd.exe)
  2. détermination de l'adresse de base de Ntoskrnl
  3. scan en mémoire à la recherche de l'offset de Ki386BiosCallReturnAddress() par rapport à Ntoskrnl
  4. lancement d'une application 16 bits quelconque (ex : debug.exe) pour initialiser le sous-système NTVDM
  5. injection d'une DLL dans le processus ntvdm.exe

La DLL effectue alors les opérations suivantes :

  1. récupération de l'adresse de Ki386BiosCallReturnAddress() passé en variable d'environnement par le binaire précédent
  2. mise en place d'une fausse pile noyau avec comme sauvegarde de l'adresse de retour une fonction quelconque (payload)
  3. dans le TEB courant, on fait pointer VDM_TIB.VdmContext.Esi vers notre fausse pile et VDM_TIB.VdmContext.Eip vers l'adresse de Ki386BiosCallReturnAddress()
  4. exécution de NtVdmControl() pour déclencher la vulnérabilité et exécuter notre fonction quelconque dans le contexte du noyau

Une fois la vulnérabilité correctement exploitée, la payload recherche le jeton de sécurité du processus SYSTEM et remplace celui du processus ciblé (cmd.exe). Sur la capture ci-dessous issue de Windows 7, on voit par exemple que le jeton du processus initial à gauche correspond à l'utilisateur Lexsi, alors que celui du nouveau cmd.exe à droite est devenu SYSTEM :

Tavis Ormandy avait contacté Microsoft au mois de juin dernier, mais a tout de même décidé de publier cette vulnérabilité de manière "non responsable". Heureusement, il suffit de déployer la GPO permettant de désactiver le sous-système 16 bits pour ne plus être vulnérable.