samedi 8 décembre 2007

Le Design du Kernel d'émulation CPU :

L'émulation est une technologie de pointe crée depuis les années 90 par les pionniers de l'industrie Antivirus de l'époque pour faire face aux menaces ascendantes des virus Polymorphiques du type MTE et compagnies. Un émulateur, est par définition un module qui imite partiellement ou totalement le fonctionnement d'un ordinateur; c'est à dire qu'il permet de faire exécuter un quelconque fichier cible sous un environnement contrôlé et purement virtuel indépendamment de l'ordinateur et des ses composants. L'utilité d'un tel module se résume à pouvoir analyser le fonctionnement potentiel d'un fichier cible afin d'anticiper un quelconque comportement malicieux du fichier en question au cas où il serait exécuté en mode réel :

  • Suppression de fichiers.
  • Formatage ou destruction du disque dur.
  • Infections des autres fichiers.
  • Propagation par le réseau.
  • Désactivation des Firewalls / Antivirus installés.
  • Corruption du système d'exploitation.
  • etc..
En général,l'architecture d'un système virtuel d'émulation doit prendre en compte 4 éléments capitaux reliés en chaînes :
  • Émulation Processeur ( Pentium, AMD, ARM etc... ).
  • Émulation Mémoire.
  • Émulation Hardware (Disque dur virtuel,Carte réseau etc..)
  • Émulation Système d'exploitation (Windows / Linux / Solaris etc.. ).
Comme vous pouvez déjà le constater : techniquement, la mise au point et l'implémentation d'une telle technologie au sein d'un système d'analyse Antiviral est vraiment très difficile à faire. Faut il le dire encore, ça demande vraiment des compétences en informatique de haut niveau; et c'est ce qui explique le nombre restreint de solutions Antivirus qui l'utilisent actuellement, du moins qui ont réussi à l'implémenter correctement et efficacement, je cites à titre d'exemples : Nod32 de la firme Tchécoslovaque ESET, F-PROT de la firme Islandaise FRISK ainsi que Norman Virus Control de la firme Norvégienne Norman ASA.

Maintenant en parlant de mon propre travail : j'ai essayé de maintenir un niveau d'abstraction élevé pendant toute la phase de développement afin de pouvoir offrir une architecture d'émulation évolutive et adaptative. L'abstraction des méthodes et de l'interface générale d'émulation est un peu coûteuse en terme de performances, mais elle a l'avantage de me permettre d'avoir une plus grande flexibilité de travail pour la prise en charge des différentes combinaisons de configurations liées au processus d'émulation. L'avantage d'une telle approche se résume au faite que le Kernel d'émulation sera indépendant et portable en terme de fonctionnement entre les différents systèmes d'exploitation et les différents Processeurs que j'ai implémenté et que j'implémenterai dans un proche futur. Pour être plus clair sur ce point :
  • Un seul Kernel est capable d'émuler plusieurs Processeurs : Pentium, AMD, ARM etc..
  • Un seul Kernel est capable d'émuler plusieurs systèmes d'exploitation Windows, Linux, Solaris etc..
Tout dépend de la configuration d'émulation, c'est juste une question de connectivité d'interfaces et de sous modules de traitement. Prenez à titre d'exemple ce scénario qui peut se produire au cours du processus de scanning :
  • L'engin principal rencontre un fichier exécutable Linux de type ELF sous un environnement exécutif Windows, le Kernel d'émulation se connecte alors dynamiquement à l'interface d'émulation du système d'exploitation Linux et commence le processus d'émulation.
  • L'engin principal rencontre un fichier exécutable Windows de type PE sous un environnement exécutif Linux, le kernel d'émulation se connecte alors dynamiquement à l'interface d'émulation du système d'exploitation Windows et commence le processus d'émulation.
Pour le support d'émulation des processeurs, j'ai implémenté un support unifié des plages d'instructions IA32 et IA64, c'est à dire que le module d'émulation CPU supporte parallèlement le mode d'exécution 32bit et le mode d'exécution 64bit !
  • Le processus de scanning lancé depuis un environnement 32bit fonctionne de cette manière :

  • Si l'engin principal rencontre un fichier exécutable 32bit, le kernel d'émulation invoque alors l'interface d'émulation processeur 32bit.
  • Si l'engin principal rencontre un fichier exécutable 64bit, le kernel d'émulation invoque alors l'interface d'émulation processeur 64bit.

  • Le processus de scanning lancé depuis un environnement 64bit fonctionne de cette manière :

  • Si l'engin principal rencontre un fichier exécutable 64bit, le kernel d'émulation invoque alors l'interface d'émulation processeur 64bit.
  • Si l'engin principal rencontre un fichier exécutable 32bit, le kernel d'émulation invoque alors l'interface d'émulation processeur Legacy Mode.

Aucun commentaire: