En janvier 1986, Brain, considéré comme le premier virus ciblant les PC, avait pour conséquence la modification du MBR des machines infectées. Plus de 20 ans après, la découverte dans la nature d'un malware utilisant cette méthode à des fins de furtivité grâce à des techniques avancées de rootkit Windows, relance une nouvelle fois la course en avant sur les technologies virales.
Un logiciel malveillant utilisant une technique de rootkit Windows au niveau du MBR a été détecté dans la nature en décembre dernier. En raison de certaines valeurs codées "en dur", seul Windows XP est touché. Plusieurs milliers d'utilisateurs ont ainsi été infectés après une visite sur des sites de "drive-by-download", tentant d'exploiter des vulnérabilités connues (MS03-011
(Réf. Lexsi 2706), MS06-014
(Réf. Lexsi 6876), MS06-055
(Réf. Lexsi 7520) ou MS06-071
(Réf. Lexsi 7688) ou de forcer l'usager à exécuter un binaire malveillant (en le faisant passer pour un codec par exemple). Quelques temps après sa mise au jour, le malware en question était détecté par un petit nombre de solutions antivirales seulement. Chose amusante, il semble que l'équipe derrière ce nouvel exemplaire de virus ne soit autre que celle ayant déjà développé le désormais célèbre troyen bancaire "Torpig".
Rappels sur les virus de boot
Le MBR (Master Boot Record), premier secteur d'un périphérique de stockage de masse, contient, en plus de la table des partitions, du code originalement destiné à rechercher une partition de démarrage valide et à charger le secteur de boot de cette partition (VBR, Volume Boot Record). Evidemment, des chargeurs de boot comme Grub ou Lilo, non liés à un OS spécifique, remplacent ce code par le leur afin par exemple d'afficher un menu. En clair, il s'agit de la première portion de code à laquelle le BIOS passe l'exécution lors du démarrage de l'ordinateur. Elle s'exécute dans un mode spécifique du processeur x86, dit mode "réel", dans lequel l'accès direct aux routines du BIOS et aux périphériques est possible sans aucune restriction.
Comme dit en introduction, l'utilisation du MBR dans le cadre de logiciels malveillants n'est vraiment pas nouvelle. Le but est très souvent de détourner les interruptions BIOS, dont la 20ème est la plus connue : INT 13h est en effet l'interruption permettant l'accès aux services bas niveau de gestion des disques, permettant de lire ou d'écrire des secteurs précis. Détourner cette interruption permet de contrôler le déroulement des opérations de disque effectuées par le système d'exploitation au cours de son chargement, pour éventuellement les modifier. Parmi les autres interruptions intéressantes, citons par exemple INT 10h, utilisée pour la vidéo. L'avantage du code présent dans le MBR est qu'il s'exécute avant le chargement du système d'exploitation et peut donc contrôler le démarrage de celui-ci. Les virus MS-DOS utilisaient souvent ces méthodes ; l'inconvénient, pour les développeurs de virus, de l'arrivée de la famille des Windows NT (donc NT, 2000, XP, 2003, par opposition à 95, 98 et Millenium) est que cette phase MS-DOS lors du démarrage a été supprimée.
Premières preuves de concept : BootRoot (XP) et Vboot Kit (Vista)
En août 2005, Derek Soeder and Ryan Permeh de la société eEye présentent à la conférence Black Hat USA 2005 la preuve de concept BootRoot : il s'agit d'un MBR "maison" permettant de modifier le noyau de Windows pour y insérer des fonctionnalités de rootkit, sans affecter son bon fonctionnement. On peut ainsi parler d'un "portage" des concepts de modification de la MBR dans un contexte Windows NT. L'exemple présenté agissait au niveau NDIS (Network Driver Interface Specification, interface Windows en charge des communications réseau) afin d'y ajouter une porte dérobée réseau. En se basant sur BootRoot, les chercheurs d'eEye ont aussi développé SysRQ2, un live-cd ayant pour effet de pouvoir lancer un interprète de commandes avec les droits SYSTEM (ça peut toujours servir...) par une simple combinaison de touche Ctrl+Shift+SysRq.
Afin de bien comprendre comment se place un rookit MBR, il n'est peut-être pas inutile de rappeler les grandes étapes du processus de démarrage de Windows depuis un disque dur (la procédure depuis une disquette, un CD-ROM, un périphérique USB ou le réseau diffère légèrement) :
- Après l'exécution du BIOS, celui-ci charge le premier secteur du disque, c'est-à -dire le MBR ;
- Le code présent dans le MBR s'exécute en mode réel : traditionnellement, il localise une partition "bootable" dans sa table et exécute le premier secteur de celle-ci ;
- Le "bootstrap loader" de Windows prend la main : il charge les 16 premiers secteurs de sa partition, puis charge et exécute NTLDR, toujours en mode réel 16 bit ;
- NTLDR bascule en mode protégé 32 bit puis charge et exécute OSLOADER ;
- OSLOADER analyse "boot.ini", exécute NTDETECT en mode virtuel 8086 (détection du matériel), met en place la pagination, charge HAL et NTOSKRNL, les pilotes de boot et met en place les ruches du registre ;
- NTOSKRNL initialise le noyau et lance le processus utilisateur SMSS (Session Manager Subsystem) pour la gestion des sessions.
On voit donc que le code présent dans le MBR arrive en premier lieu dans le processus et que sa modification permet de contrôler toute la suite des événements.
Les rootkits MBR sont réalisables car Windows (sauf TPM) part du principe que rien de ce qui s'est exécuté avant son chargement n'est malicieux ; en particulier, il fait une confiance aveugle au BIOS. De plus, il considère que l'image mémoire d'un exécutable n'a pas pu être corrompue par l'INT 13 lors du chargement et lui passe directement la main (Vista effectuant quelques vérifications supplémentaires avant l'exécution). Aucun fichier n'est modifié sur le disque, tout est fait en RAM à la volée.
Pour mettre en place un rootkit MBR, BootRoot détourne l'interruption 13h. Lors de l'exécution de NTLDR, il pourra ainsi modifier OSLOADER en mémoire. La modification faite a pour but de localiser la liste des modules et d'y repérer "ndis.sys". Lorsqu'un paquet réseau est reçu, la macro "NdisMIndicateReceivePacket" est appelée et utilise une fonction sauvegardée dans le champ "PacketIndicateHandler" de la stucture "NDIS_MINIPORT_BLOCK" du pilote de miniport de la carte réseau, fonction appelée "ethFilterDprIndicateReceivePacket()". BootRoot modifie cette fonction par un simple JMP au point d'entrée et se garde ainsi un accès aux structures contenant les paquets afin de mettre en place une porte dérobée réseau.
En 2007, une nouvelle étape est franchie avec la démonstration, par Nitin et Vipin Kumar de NVLabs, à Black Hat USA 2007 de la preuve de concept Vboot Kit. Il s'agit grosso modo d'un portage des concepts de BootRoot sur Windows Vista, avec des vérifications d'intégrité supplémentaires à contourner. L'exemple donné modifie périodiquement le jeton de sécurité des processus "cmd.exe" pour leur donner les privilèges SYSTEM, en parcourant la liste chaînée de structures "E_PROCESS" décrivant chaque processus.
Le premier malware de ce type détecté dans la nature
Lors de l'infection, le logiciel malveillant retrouvé dans la nature remplace donc le MBR par sa propre version, et garde une copie de l'original dans le secteur 62 (voir ci-dessous pour l'explication). Un pilote Windows malicieux est stocké dans un espace libre, dans les derniers secteurs du disque. Le code présent dans le MBR aura pour effet de charger ce pilote de manière furtive, sans modifier le système, en particulier sa base de registre (sans modifier une clé Run ou ajouter un service par exemple), ni ajouter de fichier. Le rootkit MBR sera pleinement fonctionnel au prochain redémarrage.
Gmer donne la description suivante pour chaque étape de l'infection :
- installation : en utilisant l'API "CreateFile()" sur le disque dur physique, copie du MBR original dans le secteur 62, écrasement du MBR par une version malicieuse, puis écriture dans le secteur 61 de la partie noyau du chargeur (voir plus bas) et écriture du pilote malicieux ;
- exécution du code MBR au prochain redémarrage : détournement de l'interruption 13h pour contrôler les secteurs lus par NTLDR en vue de la modification du noyau de Windows (et non pas du pilote NDIS comme dans BootRoot), en particulier pour le chargement du pilote après appel à la fonction "nt!IoInitSystem" ;
- chargeur de pilote : ouverture de "\??\PhysicalDrive0" pour récupérer le pilote malicieux caché, chargement avec une routine "maison" et exécution ;
- pilote : mise en place d'une porte dérobée réseau et des fonctionnalités de rootkit (ex : détournements des IRP, voir ci-dessous).
Afin d'éviter une détection triviale, le rootkit détourne en effet certaines fonctions de la table "MajorFunctions" (MJ) du pilote de disque dur "\Driver\Disk" ("disk.sys"). Lorsqu'un IRP (I/O Request Packet) de type IRP_MJ_READ (lecture) est créé, il l'intercepte et si le secteur demandé est le premier, c'est-à -dire le MBR, il renvoie le MBR original qu'il avait pris soin de stocker dans le secteur 62. De même, un IRP dont la MajorFunction est de type IRP_MJ_WRITE (écriture) sera aussi contrôlé par le malware afin que le MBR ne puisse pas être modifié. Par contre, un anti-rootkit comme Gmer teste depuis longtemps si la table des IRP_MJ_* n'a pas été modifiée (ainsi que les premiers octets de chaque fonction), ce qui lui permet de détecter ce malware.
Comme précisé plus haut, ce malware particulier n'affecte pas Windows Vista car son processus de démarrage est assez différent de celui de Windows 2000 ou XP.
Comment se protéger contre ce type de logiciel malveillant ?
Tout d'abord, les cas réels d'infection ont eu lieu en exploitant des failles corrigées depuis longtemps par Microsoft ; l'application d'une veille sécuritaire sérieuse reste donc le premier rempart efficace. De plus, certains BIOS proposent d'empêcher la modification du MBR : cette fonctionnalité avait été créée du temps des premiers virus de boot, mais était un peu tombée en désuétude depuis. Enfin, il reste toujours possible de restaurer le MBR depuis un live-cd, la tâche étant facilitée par la sauvegarde créée par le virus lui-même dans le secteur 62. Mieux, la commande "fixmbr" ou "fdisk /mbr" depuis un CD d'installation de Windows remplace le MBR malicieux par une version saine.
Le problème de base est que Windows 2000/XP autorise depuis l'espace utilisateur la lecture et l'écriture de n'importe quel secteur du disque dur. L'argument "lpFileName" de la fonction de l'API Windows "CreateFile()" peut en effet prendre comme argument "\\.\PHYSICALDRIVE0" afin d'obtenir un accès "en dur" à tous les secteurs de ce disque. Dans Vista, l'écriture grâce à cette méthode n'est plus possible en espace utilisateur depuis l'attaque de Joanna Rutkowska sur le fichier d'échange ("pagefile.sys"), mais cette restriction ne s'applique pas aux premiers secteurs du disque, dont le MBR... Par contre, la fonctionnalité UAC (User Account Control) de Vista peut bloquer cette attaque si l'utilisateur refuse l'action.
Le malware repéré dans la nature en décembre dernier s'inspire de BootRoot. Est-ce à dire qu'eEye, par la publication d'une preuve de concept fonctionnelle, a facilité le travail des développeurs de virus (mode Troll
) ? Non, l'avancée vers ce type de logiciel malveillant était inéluctable car il s'agit de l'étape suivant les rootkits en mode utilisateur, puis les rootkits en mode noyau. BootRoot a peut-être simplement accéléré l'apparition du premier virus fonctionnel utilisant cette technologie, et donc aussi des protections pour le contrer.