Comment fonctionne un antivirus ?
Dans l’article d’aujourd’hui, je vais essayer d’expliquer en détail le fonctionnement d’un antivirus classique.
Je ne suis pas un programmeur d’antivirus, ni même chercheur en sécurité informatique mais juste un simple curieux qui veut obtenir plus de détails que :
« L’antivirus cherche une signature de virus dans un fichier »
Si comme moi, vous estimez qu’il serait intéressant d’en savoir plus, vous êtes au bon endroit, et vous pouvez même participer si vous en connaissez davantage.
On commence.
Table des matières
Comment fonctionne un antivirus ?
L’antivirus lors du démarrage de l’ordinateur
Nous sommes bien d’accord que si l’antivirus se lance après les programmes malveillants, il devient totalement inutile.
Comment se fait il alors que l’antivirus se lance toujours avant les autres programmes ?
Et bien il y a tout simplement un ordre de lancement.
Voici l’ordre de lancement des composants logiciels lorsque vous démarrez votre système :
FSFilter Infrastructure
FSFilter System
FSFilter Bottom
FSFilter Copy Protection
FSFilter Security Enhancer
FSFilter Open File
FSFilter Physical Quota Management
FSFilter Virtualization
FSFilter Encryption
FSFilter Compression
FSFilter Imaging
FSFilter HSM
FSFilter Cluster File System
FSFilter System Recovery
FSFilter Quota Management
FSFilter Content Screener
FSFilter Continuous Backup
FSFilter Replication
FSFilter Anti-Virus
FSFilter Undelete
FSFilter Activity Monitor
FSFilter Top
Filter
Boot File System
Base
Pointer Port
Keyboard Port
Pointer Class
Keyboard Class
Video Init
Video
Video Save
File System
Event Log
Streams Drivers
NDIS Wrapper
COM Infrastructure
UIGroup
LocalValidation
PlugPlay
PNP_TDI
NDIS
TDI
NetBIOSGroup
ShellSvcGroup
SchedulerGroup
SpoolerGroup
AudioGroup
SmartCardGroup
NetworkProvider
RemoteValidation
NetDDEGroup
Parallel arbitrator
Extended Base
PCI Configuration
MS Transactions
Bon, ça fait beaucoup de choses, et moi-même je ne sais pas ce que veulent dire la plupart.
Par contre, cela nous montre que l’antivirus (FSFilter Anti-Virus) démarre avant les clés USB et autres périphériques de ce type (PlugPlay), avant l’audio & vidéo et avant même que vous soyez connecté au réseau (NetworkProvider).
Notre antivirus est donc bien actif dès le démarrage du système, et même si on ajoute d’autres processus par la suite au démarrage, il ne pourront pas se lancer avant l’antivirus.
« Oui mais…si le programme malveillant se fait passer pour un antivirus et se place lui-aussi dans ce FsFilter Anti-Virus ? »
Windows Vista (et supérieur) demande à ce que les codes sources des pilotes (drivers) soient signés numériquement. Et pour cela il faut un certificat 😉
Notre pauvre programme malveillant n’obtiendra bien sûr pas ce certificat.
Interruptions des Entrées/Sorties
L’antivirus démarre donc avant les autres processus, pour cela c’est bon.
Mais l’antivirus arrête aussi un virus avant son exécution lorsque le système est déjà démarré. Alors comment fait il pour agir avant le lancement d’un programme quelconque ?
Si maintenant on voulait développer un programme qui vérifie les programmes lancés, on utiliserait naïvement un code semblable à l’exemple suivant :
Si NouveauProgrammeLancé Alors
Si VérifierLeProgramme() == Malveillant Alors
ArrêterLeProgramme()
Fin Si
Fin Si
Le problème est présent dès le début : Si le programme est lancé, c’est déjà trop tard !
Imaginez un ransomware qui crypte tous vos fichiers dès son lancement, l’antivirus pourra toujours nous dire qu’il a trouvé un programme malveillant, ça sera trop tard.
Il nous faut donc ce qu’on appelle un Filter Driver, « pilote filtre » en français. On en parlait avant avec FSFilter Anti-Virus.
Un pilote filtre est un pilote qui étend ou améliore la fonction d’un périphérique.
Ici le périphérique en question sera le disque dur (système de fichiers) sur lequel le programme prêt à être lancé est stocké.
On pourra donc filtrer les opérations d’entrée/sorties pour un ou plusieurs systèmes de fichiers. Filtrer signifie ici : observer, enregistrer, modifier, ou empêcher un évènement.
Ce filtre va nous permettre d’intervenir dès le moment où l’utilisateur effectue une action, typiquement lorsqu’il double clique sur le programme à exécuter.
Pour bien comprendre, prenons le schéma suivant :
Tout en haut, nous sommes dans le mode utilisateur (user mode). En tant qu’utilisateur vous avez deux façons d’accéder à un fichier : Soit vous le lisez (vous le lancez) soit vous l’écrivez (vous le créez/copiez).
Ces deux façons sont appelées les Entrées/Sorties, ou Input/Output (I/O) en anglais.
Admettons que vous venez par exemple de double cliquer sur un programme. Vous faites donc une demande de lecture (entrée) du fichier.
À partir de là, le noyau prend la main (kernel mode), vous n’avez plus aucun pouvoir.
Le gestionnaire d’entrée/sortie (I/O Manager) prend en compte votre demande et l’envoie au gestionnaire de filtre (Filter Manager).
Le gestionnaire de filtre va filtrer la demande via les filtres installés, il tombera ici sur le filtre B qui est celui de l’antivirus.
À ce moment, un scan rapide est effectué, et si le fichier est détecté comme malveillant, le filtre indique de stopper la requête. Le fichier n’est pas exécuté, l’antivirus lance l’alerte et Windows indique qu’il n’a pas pu accéder au programme.
Dans le cas contraire, si l’antivirus ne détecte rien de suspect, la requête est validée, elle arrive dans le driver du système de fichier (File System Driver) qui lit (ou écrit) le fichier sur le disque.
Tout cela se passe en quelques millisecondes entre le moment ou vous cliquez sur un programme et le moment où il s’affiche à l’écran.
Comment se passent les scans ?
Maintenant qu’on sait que l’antivirus démarre en premier, et qu’il a le privilège de vérifier et éventuellement annuler des opérations sur les fichiers, intéressons nous aux scans.
Nous avons 3 types principaux de scans :
Scans par signatures
Il s’agit du scan le plus simple qui vient à l’esprit immédiatement : On calcule une signature unique à chaque programme, et on vérifie si il s’agit d’une signature d’un programme malveillant.
Cette signature est habituellement ce que l’on appelle un hash.
Un hash est une empreinte d’un fichier ou d’une donnée de manière générale. Cette empreinte est unique est peut être calculée facilement en implémentant une telle fonction de hachage.
Par exemple, je peux voir les hashs d’un fichier via VirusTotal (utilitaire en ligne pour scanner vos programmes avec plusieurs antivirus à la fois) :
Il existe plusieurs fonctions de hachage, les plus connues sont MD5 et SHA256.
Nous avons donc calculé un hash de notre programme à scanner et nous avons déjà une base de données virales contenant des centaines de milliers de hashs de programmes malveillants.
Premier problème : Comment scanner un programme lorsque l’on a 300 000 signatures de programmes malveillants différents ? En effet cela devrait prendre 10 minutes par fichier !
Nous avons en fait deux algorithmes utilisés pour cela :
Boyer-Moore: Pour chercher une chaîne dans une autre.
Aho-Corasick: Pour chercher plusieurs modèles en même temps.
Exemple de l’utilisation de l’algorithme Aho-Corasick en anglais.
Il semble que le second soit donc couramment utilisé dans les logiciels antivirus commerciaux car il permet d’analyser très rapidement un fichier sans tester les centaines de milliers de signatures une par une.
Deuxième problème : Scanner c’est bien, scanner vite c’est parfait, mais…un seul petit changement dans le fichier change le hash, donc la signature.
Voir : Quel est Vraiment LE MEILLEUR antivirus ?
Effectivement c’est là que le scan par signatures pose problème, il est facile (certains programmes automatisent cela) de changer la signature d’un programme malveillant pour le rendre totalement sain.
Scans heuristiques
Les scans heuristiques servent à compenser le problème des scans par signatures : On essaie de deviner si un programme est malveillant en observant son comportement et non pas sa signature.
Ces scans se divisent eux encore en trois sous-types.
Émulation de programme
C’est ce qu’on appelle aussi « l’exécution dans un bac à sable » (sandbox). Il s’agit en fait d’exécuter directement le programme dans un environnement d’exécution sécurisé pour observer ce qu’il fait.
Analyse de programme
Dans ce cas, on va essayer de décompiler le programme, et d’observer son code source pour mieux comprendre son comportement. C’est donc un scan plus complet et détaillé qui part à la recherche d’actions potentiellement malveillantes.
Détection de signatures génériques
Cette technique sert elle aussi à combler le problème des signatures changeantes. Il s’agit d’une détection aussi appelée détection génétique dans laquelle on va classer les virus par familles.
Ils sont de la même famille si ils ont des empreintes (ADN) similaires. L’exemple des jumeaux est intéressant : On a deux jumeaux presque identiques, mais leur ADN est différent.
Scans proactifs
Les scans proactifs sont ceux qu’on pourrait appeler « en temps réel ».
Lorsqu’un programme est exécuté, et se trouve donc en mémoire vive (RAM), on observe si ses actions ne sont pas malveillantes. Si il se met tout-à-coup à agir de façon malveillante comme supprimer des fichiers massivement, on lance l’alerte et on l’empêche de continuer.
Tous les programmes lancés sont vérifiés dès leur exécutions et à intervalles réguliers. C’est également comme ça que l’on repère les programmes malveillants qui cachent leur activités malveillantes avant d’être exécutés.
La différence entre ce scan et les autres, c’est qu’il vérifie les programmes après leur lancement.
Fonctionnalités supplémentaires
Les antivirus de nos jours contiennent des fonctionnalités supplémentaires comme la vérification des liens visités dans le navigateur (on vérifie l’URL ou le contenu de la page).
Les antivirus pour mobiles existent également, ainsi que la protection des données personnelles (sauvegarde des données) , la protection des e-mails, etc…
Pour finir, je vous invite à lire le Quel est Vraiment LE MEILLEUR antivirus ? pour avoir un aperçu de celui qui est le meilleur (?) antivirus.