# Détection de logiciels malveillants renforcée par apprentissage automatique

La détection de logiciels malveillants renforcée par apprentissage automatique représente une avancée significative dans la lutte contre les menaces informatiques. Cette méthode s'appuie sur des algorithmes d'apprentissage pour identifier et contrer les attaques.
Les logiciels antivirus se basent sur la détection de signature virale, une approche largement adoptée, mais qui montre ses limites face à des menaces nouvelles et en constante évolution. Cette méthode traditionnelle peut échouer à identifier de nouvelles formes de logiciels malveillants et, face à ce défi, l'adoption de modèles d'analyse en temps réel basés sur l'apprentissage automatique a émergé comme une solution. Cette approche est souvent désignée sous le nom de « Machine Learning-based Malware Detection » en anglais, que l'on peut traduire par « Détection de Malwares basée sur l'Apprentissage Automatique ». Ces modèles sont conçus pour détecter les menaces dès leur première apparition, offrant une protection plus dynamique et adaptative contre l'évolution rapide des menaces informatiques.

## Enjeux

Depuis 2008, on remarque une augmentation significative de la présence de logiciels malveillants sur Internet.
Les logiciels malveillants peuvent être issus de nombreuses sources différentes (infection de systèmes distribués, téléchargement, réseau, Internet des objets...) et se présenter sous différentes formes (binaire exécutable, script, shellcode, firmware...). Ils représentent une menace considérable pour les particuliers comme pour les industriels. Un programme malveillant exécuté sur une machine peut aller jusqu'à compromettre complètement un système informatique et provoquer des dégâts proportionnels à son niveau de privilège.
Les méthodes actuelles de détection de programmes malveillants reposent majoritairement sur la discrimination par signature virale. Très efficaces sur les menaces déjà recensées, elles se révèlent inefficaces face à un programme inconnu. Il devient délicat de maintenir des bases de signatures fiables et riches. Les grands acteurs des solutions anti-virus proposent donc depuis des années de renforcer les algorithmes de détections par des règles heuristiques. Plus efficaces sur les programmes inconnus, ces règles présentent le désavantage d'être statiques et de reposer sur l'appréciation des développeurs qui les rédigent$^,$$^,$.
Avec la volonté de proposer des règles plus universelles et évolutives, s'est construite l'idée de proposer des solutions de détection de menaces renforcées par apprentissage automatique.

## Approches et méthodes d'analyse

Le processus de construction d'une taxonomie de classification virale par apprentissage automatique se divise généralement en deux grandes étapes :
* L'extraction de caractéristiques, appliquée à un large corpus d'analyse constitué d'une proportion variable de logiciels malicieux et bénins ;
* La classification stochastique de chaque programme dans la catégorie qui le définit le mieux.
La pertinence de l'implémentation de ces deux étapes déterminera de façon critique la performance du modèle produit.

### Extraction de caractéristiques
#### Analyse statique

L'approche statique se veut être une approche formelle d'analyse prédictive du comportement d'un fichier brut. Il s'agit d'extraire et de traiter les informations relatives à une ressource, afin d'en déduire son comportement, et de statuer sur le degré de menace pour le système hôte.
Cette méthode d'analyse se veut dans un premier temps relativement sûre, puisqu'elle n'implique pas l'exécution de code sur le matériel. Elle sera naturellement moins consistante qu'une analyse virale in situ, dans la mesure où il est très délicat de déterminer précisément, avant son exécution, les intentions d'un programme compilé.

#### Analyse du code binaire

Tout fichier de taille $T$ octets peut être représenté par un sous-ensemble de mots de taille $N$ (avec $N<T$) appelé « N-gramme ». Par exemple, la séquence 0xCAFE peut est représentée par trois 2-gramme (respectivement 0xCA, 0xAF, 0xFE) ou encore deux 3-gramme (respectivement 0xCAF et 0xAFE).
En s'appuyant sur des méthodes d'exploration de données$^,$$^,$$^,$, il est possible de s'intéresser à la distribution « N-gramme » d'octets au sein d'un fichier pour en faire ressortir des mots typiquement associés à du code malveillant. Cette méthode a la particularité de ne faire aucune interprétation fonctionnelle des données qu'elle analyse, travail complété par cette étude qui met à l'épreuve plusieurs algorithmes et conclut sur un résultat optimal avec un « Boosted Decision Tree ».
Un processus d'analyse naïf pourrait prendre la forme de :
* Extraction de termes n-gramme ;
* Normalisation de la fréquence d’apparition ($NTF$) ;
* Classification (Artificial Neural Networks, Decision Trees, Naïve Bayes, Support Vector Machines).
$NTF={\frac {termfrequency}{max(termefrequencyindoc)}}$

##### Autres approches

* Analyse graphique : une représentation graphique en nuances de gris du fichier à analyser est générée, et l'analyse s'appuie sur des algorithmes de reconnaissance d'images, afin de classifier les fichiers en fonction de leurs similarités visuelles avec celles des fichiers malveillants présents dans le corpus d'analyse$^,$ ;
* Analyse des métadonnées$^,$ ;
* Mesure de l'entropie pour détecter une tentative d'obfuscation ;
* Interaction avec les registres du processeur ;
* Analyse des opérations de contrôle de flot (call, ret, jump...).

#### Analyse dynamique

L'analyse dynamique désigne le processus d'observation comportementale d'un programme en provoquant volontairement son exécution au sein d'un environnement surveillé, isolé du reste du système (type « bac à sable »). Il est de ce fait possible de prendre connaissance des interactions du programme avec le système, et de la façon dont il l'affecte de façon plus globale. Ce type d'informations permet, de façon relativement commode, de statuer par la suite sur le niveau de danger que représente son exécution au sein du système. De plus, l'analyse dynamique présente l'avantage d'être robuste face aux méthodes de maquillage des fichiers statiques (obfuscation de code, chargement de code dynamique, chiffrement, packing...)$^,$$^,$.
L'observation comportementale peut prendre plusieurs perspectives et s'intéresser à différents niveaux d'exécution, du plus bas pour le code machine, aux niveaux plus élevés pour le système de fichiers ou les registres du système d'exploitation.
Cette méthode permet une étude plus fine que celle de l'analyse statique, mais elle présente un risque important pour le système hôte, dans la mesure où elle implique l'exécution de code étranger sur du matériel (physique ou virtuel) sensible. Une faiblesse de conception dans les outils d'analyse pourrait introduire, pour un programme qui en aurait connaissance, la capacité de réaliser une évasion et de compromettre la plateforme en élevant son niveau de privilèges.

#### Analyse des codes d'opération

L'application d'algorithme de machine learning au code d'opération révélés au runtime a été un sujet largement étudié dans la littérature scientifique, avec l'optique de construire des modèles prédictifs de détection au plus bas niveau, insensibles aux mécanismes de furtivité. Par nature, ces données offrent une représentation exacte du code qui va être exécuté sur le CPU. Bien que techniquement très précis, une des grandes difficultés réside dans l'interprétation qui en sera faite pour discriminer le code malveillant du code bénin.
Plusieurs approches ont été proposées :
* Etude de la distribution de petites séquences N-Gramme des codes d'opérations générés$^,$$^,$ ;
* Etude de similarités entre fichiers exécutables appuyés sur des graphes de codes d'opération$^,$$^,$.

#### Analyse des appels de fonction

Afin de mieux comprendre le comportement d'un programme, il peut être intéressant d'avoir une vision précise de son flot d'exécution, et notamment monitorer les appels de fonctions qui sont effectués. Pour ce faire, il est par exemple possible dans un environnement Windows d'effectuer au préalable un appel à la fonction système LoadLibrary afin d'injecter un DLL en charge de l'introspection du programme en temps réel.
La fréquence des appels à l'API système est un élément étudié avec beaucoup d'attention, car il peut se montrer très révélateur des intentions d'un programme$^,$.

#### Analyse de la mémoire

Analyse forensique de la mémoire volatile lors de l'exécution du programme.

#### Analyse du réseau

Cette méthode de détection repose sur l'analyse du trafic réseau généré par le programme, généralement la communication effectuée avec le centre de contrôle. Il a par exemple été proposé de découper le flot réseau en séquences sur lesquelles appliquer le modèle en comparant l'alignement avec du trafic malveillant témoin.

### Classification

Après normalisation des données issues de l'étape d'extraction de caractéristiques, intervient le processus de classification. Il vise à construire une base de connaissances fiable ; elle permettra de déterminer, à l'aide d'algorithmes de classification renforcés par apprentissage statistique, si la ressource concernée est bénigne ou présente une menace réelle pour le système.
À l'image de la majorité des projets conditionnés par l'apprentissage automatique, ce travail se divise en deux étapes : la construction (ou « entraînement ») du modèle de détection, puis l'application de ce modèle au monde réel. Lors de la première étape, le système est alimenté par le corpus d'analyse constitué précédemment, afin de « l'entraîner » et de construire un classifieur. La seconde étape consiste à confronter ce classifieur à des fichiers aléatoires afin de trancher entre menace et inoffensivité.
Plus le modèle sera pertinent et le corpus d'analyse complet, plus la discrimination entre fichiers malicieux et bénins sera fine.

## Limites et contre-mesures
### Crédibilité des résultats

La qualité des résultats d'un détecteur de programme malveillant dépend de la complexité des fonctions de détection et des fonctions de classifications utilisées dans le modèle de conception du réseau neuronal.
L'environnement de détection est aussi sujet à une baisse de la précision des algorithmes de détection. En effet, la mise en place de tels algorithmes est plus difficile dans un système de production avec de nombreux processus s'exécutant parallèlement, ou dans un trafic réseau chargé. Elle générera potentiellement plus de résultats erronés que dans un environnement isolé.
Les auteurs de programmes malveillants utilisent aussi des techniques qui permettent d'échapper à la détection, ou qui modifient le comportement de leur logiciel, afin qu'il soit catégorisé comme sûr, ce qui dégrade les résultats du détecteur.

### Difficulté de construction du modèle

Les logiciels malveillants sont de plus en plus nombreux, proviennent d'une multitude de sources, exploitent un grand nombre de failles, toutes différentes les unes des autres. Par conséquent, collecter des informations sur leur comportement et anticiper les menaces possibles sont des tâches complexes qui requièrent un temps considérable.
Du fait de l'homogénéité des comportements des différents logiciels et de leur capacité à changer ces comportements, les algorithmes de détection sont rapidement obsolètes et ont besoin d'être régulièrement entraînés/ré-entraînés. Cela augmente significativement les coûts énergétiques des systèmes qui élaborent et utilisent les algorithmes de détection de logiciels malveillants.
Les techniques d'évasion sont toujours plus nombreuses et plus sophistiquées ; ce qui augmente la difficulté de conception des modèles et des algorithmes de détection.
Généralement, les analystes utilisent des détecteurs dits en « boîte blanche », afin de maîtriser le comportement des détecteurs et affiner les résultats sur des cas spécifiques, ce qui nécessite de concevoir le détecteur.
La conception d'un détecteur de logiciels malveillants utilisant l'apprentissage automatique requiert des compétences techniques poussées, et les solutions déjà présentes sont généralement des détecteurs dits en « boîte noire ». Dans ce cas, on ne contrôle pas le comportement du détecteur, mais on lui fournit simplement des entrées, et il produit un résultat, sans que l'on ait connaissance des états intermédiaires. Il est souvent difficile d'interpréter les résultats fournis par ce type de détecteurs.

### Furtivité et méthodes d'évasion
#### Analyse de l'environnement d'exécution

Les logiciels malveillants sont capables d'analyser leur environnement de détection afin de déterminer s'ils sont dans un véritable système ou dans un bac à sable surveillé.
Afin de déterminer si le logiciel malveillant s’exécute dans un environnement surveillé, il analyse l'environnement à la recherche d'empreintes telles que la présence de logiciels d'analyse (débuggeurs), dans la liste des processus qui cohabitent avec le logiciel malveillant$^,$.
Lorsqu'il détecte qu'il est dans un bac à sable surveillé, il lui est possible de changer de comportement et de ne pas tenter d'actions (par exemple, ne pas s’exécuter) afin que le détecteur le catégorise comme logiciel sûr.
Les logiciels malveillants peuvent aussi mesurer le temps de chaque instruction qu'ils exécutent dans l'environnement ; ils peuvent alors déterminer si la durée est plus longue que dans un système classique et en déduire qu'ils sont surveillés.
Les logiciels malveillants peuvent mettre en place un test de Turing inversé, afin d'analyser l'environnement à la recherche de traces d'un utilisateur, pour déterminer s'ils sont dans un environnement surveillé ou dans un véritable système.
Un bac à sable est généralement un système récemment instancié, de manière automatique, sans action humaine courante (visites de sites internet, déplacement de curseurs, entrées au clavier, présence de moniteurs, etc.)$^,$. Si le logiciel ne trouve pas ces actions, il peut en déduire qu'il se trouve dans un environnement surveillé.

#### Méthodes d'évasion

Les techniques d'évasions sont aussi toujours plus nombreuses et plus sophistiquées, ce qui augmente la difficulté de conception des modèles et des algorithmes de détection ou des antivirus ; de plus, même après leur développement, ils deviennent rapidement obsolètes$^,$.

##### Évasion par escalade de privilège

Un logiciel malveillant peut s'évader d'un environnement surveillé, avec des privilèges restreints, en tentant d'infecter le système dans lequel il s’exécute, pour obtenir des privilèges de plus haut niveau, et pouvoir effectuer ses actions malveillantes en laissant le moins d'informations possible dans le système de surveillance.
Les logiciels malveillants peuvent infecter le système en utilisant diverses techniques : installation d'un pilote de kernel infecté, hyperviseur corrompu, utilisation de failles matérielles du système.

##### Évasion par offuscation de code

Un logiciel malveillant peut cacher les éventuelles empreintes qu'il laisse lors de son exécution, et tromper le système de détection en utilisant l'offuscation de code.
Il existe plusieurs techniques d'offuscation de code telles que le polymorphisme et le métamorphisme$^,$ :
* Le polymorphisme est une technique qui permet de chiffrer le code binaire du logiciel malveillant afin que ce code ne puisse être interprété qu'en possession de la clé de déchiffrement.
* Le métamorphisme est une technique qui permet de modifier les instructions du logiciel malveillant, tels que l'insertion de code d'opérations ou le changement de registre, mais sans changer la finalité des instructions. Cela a pour but de masquer les empreintes du logiciel ; et cela permet que différentes copies de ce même logiciel paraissent différentes pour le système de surveillance lors de son exécution.

##### Évasion par absence de fichier

La plupart des antivirus classiques effectuent une analyse des fichiers présents sur le disque dur du système à la recherche de logiciels malveillants. Une approche possible pour ces logiciels pour masquer leur présence est de ne stocker aucun fichier sur le disque, mais plutôt dans la mémoire vive. Le point faible de cette technique est la fréquence de redémarrage du système ; c'est pourquoi elle est plus efficace sur les serveurs que sur les ordinateurs personnels.
Cette technique est majoritairement utilisée par les virus de type « cryptojacking ».
Avec la démocratisation du Big Data et l'utilisation massive des outils de grilles en mémoire tels qu'Apache Spark ou Redis, ce genre d'attaque est particulièrement redoutable car le programme malveillant est présent dans la mémoire du système et son redémarrage est synonyme de perte d'informations$^,$.

##### Évasion par le réseau

Généralement, les pare-feu bloquent le trafic entrant sur un serveur et laisse le trafic sortant pour communiquer avec les autres machines sur Internet. Si un programme malveillant réussit à infecter le système, il peut aisément communiquer avec l'extérieur pour recevoir des instructions grâce aux tunnels ou communiquer de manière chiffrée afin de ne pas laisser d'empreintes.
Généralement, les logiciels malveillants tels que les botnets ont recours à la technique d'évasion par le réseau.
Dans d'autres mesures, les différentes librairies et méthodes utilisées pour faciliter la mise en place de l'apprentissage automatique permettent aux auteurs de programmes malveillants de découvrir et d'utiliser de nouvelles techniques d'évasion.
D'autres techniques, plus généralisées dans le monde de l'apprentissage automatique, existent et sont utilisées pour diminuer la précision des détecteurs, c'est le cas notamment du adversarial machine learning (en)$^,$$^,$.

## Projets et outils notoires

* dAnubis
* MalTRAK
* Arancino
* LiveDM
* TrumanBox
* MalDy
* DeepAM