Détection de logiciels malveillants renforcée par apprentissage automatique
La détection de logiciels malveillants renforcée par apprentissage automatique est une méthode de lutte contre certains types de menaces informatiques reposant sur des algorithmes d'apprentissage.

Bien que la détection de logiciels malveillants sur base de signature virale soit largement répandue au sein des logiciels antivirus modernes, on sait, de façon empirique, que cette méthode échoue à détecter de nouvelles menaces. C'est de ce constat qu'est rapidement née l'idée de proposer des modèles d'analyse en temps réel reposant sur des algorithmes d'apprentissage automatique afin de détecter les menaces dès la première tentative d'infection.

Enjeux 
Depuis 2008, on remarque une augmentation significative de la présence de logiciel malveillants sur Internet.

Les logiciels malveillants peuvent être issus d'un large spectre de sources (infection de système distribué, téléchargements, réseau, internet des objets...) et peuvent se présenter sous différentes formes (binaire exécutable, script, shellcode, firmware...). Ils représentent une menace considérable pour les particuliers comme les industriels, dans la mesure où un programme malveillant exécuté sur une machine peut (dans le pire des scenarios) compromettre complètement un système informatique potentiellement critique, et provoquer des dégâts proportionnels à son niveau de privilège.

Les méthodes actuelles de détection de programme malveillants reposent majoritairement sur de la discrimination par signature virale. Bien qu'étant très  efficace sur les menaces d’ores et déjà recensées, elle se révèle parfaitement inefficace face à un programme encore inconnu. De plus, le nombre de programmes malveillants en circulation augmentant considérablement chaque année, il devient de plus en plus délicat de maintenir de 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. Bien que 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.

C'est dans une volonté de proposer des règles plus universelles et évolutives que 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 déconstruit 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 relative à une ressource afin d'en déduire son comportement, pour par la suite statuer sur le degré de menace qu'il représente 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 cependant 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  octets peut être représenté par un sous-ensemble de mots de taille  (avec ) 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ées à 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 algotithmes et conclut sur un résultat optimal avec un "Boosted Decision Tree" (voir boosting).

Un processus d'analyse naïf pourrait prendre la forme de :

 Extraction de termes n-gramme
 Normalisation de la fréquence d'appartion ()
 Classification (Artificial Neural Networks, Decision Trees, Naïve Bayes, Support Vector Machines)

Autres approches 
 Analyse graphique : Il a été proposé, en générant une représentation graphique en nuances de gris du fichier à analyser, de s'appuyer sur des algorithmes de reconnaissance d'images afin de classifier les fichiers en fonctions de leurs similarités visuelles avec celles des fichiers malveillants présents dans le corpus d'analyse.

 Analyse des métadonnée

 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. Grâce à ce type d'information, il relativement commode de statuer par la suite sur le niveau de danger que peut représenter son exécution au sein du système. De plus, l'analyse dynamique présente l'avantage d'être parfaitement 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.

Permettant une étude plus fine que celle proposée par l'analyse statique, cette méthode présente cependant un risque plus 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 (voir furtivité et méthodes d'évasion).

Analyse des codes d'opération 

L'application d'algorithme de machine learning aux codes d'opération révélés au runtinme a été un sujet vastement étudié dans la littérature scientifique dans l'optique de construire des modèles prédictifs de détection au plus bas niveau, insensible aux mécanismes de furtivités. 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 :
 étude de la distribution de petite séquences N-Gramme des codes d'opérations générés.
 étude de similarités entre fichiers exécutables appuyé 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, qui vise à construire une base de connaissance fiable qui 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 "entrainement") 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'entrainer" 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 fichier malicieux et bénin 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étections 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 et plus difficile dans un système de production avec de nombreux processus s'exécutant parallèlement ou avec un trafic réseau chargé et générera potentiellement plus de résultats erronés que dans un environnement isolé.

Les auteurs de programme malveillant utilisent aussi des techniques qui permettent d'échapper à la détection ou alors de modifier le comportement de leurs logiciels afin qu'il soit catégorisé comme sûr et dégradent ainsi les résultats du détecteur.

Difficulté de construction du modèle 

Les logiciels malveillants sont 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 leurs comportements 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 leurs capacité à changer ces comportements, les algorithmes de détections sont rapidement obsolètes et ont besoin d'être régulièrement entraînés/ré-entraînés, ce qui augmente significativement les coûts énergétiques des systèmes qui élaborent et utilisent les d'algorithmes de détections de logiciels malveillants.

Les techniques d'évasions sont 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 dit en "boîte blanche" afin de maîtriser le comportement des détecteurs et de pouvoir 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 logiciel malveillant utilisant l'apprentissage automatique requièrent cependant des compétences techniques poussées et les solutions déjà présentes sont généralement des détecteurs en dit en "boîte noire" où 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 avoir 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 leurs environnements de détections afin de déterminer s'ils sont dans un véritable système ou dans un bac à sable surveillé.

Afin de déterminer si les logiciels malveillants s’exécutent dans un environnement surveillé, ils analysent l'environnement à la recherche d'empreintes tel que la présence de logiciel d'analyse (débuggeur), la liste des processus qui cohabitent avec le logiciel malveillant.

Lorsqu'ils détectent qu'ils sont dans un bac à sable surveillé, il est possible pour les logiciels de changer de comportement et de ne pas tenter d'actions (exemple : ne pas s’exécuter) afin que le détecteur les catégorisent comme logiciels sûrs.

Les logiciels malveillants peuvent aussi mesurer le temps de chaque instruction qu'ils exécutent dans l'environnement afin de 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 (visite de sites internet, déplacement de curseur, entrées au clavier, présence de moniteur 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 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 leurs développement, ils deviennent très rapidement obsolètes.

 Évasion par escalade de privilège  
Un logiciel malveillant peut s'évader d'un environnement surveillé, avec des privilèges restreint, en tentant d'infecter le système dans lequel il s’exécute pour obtenir des privilèges de plus haut niveau et ainsi pouvoir effectuer ses actions malveillantes en laissant le moins d'informations possible au 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ériel du système...

 Évasion par offuscation de code  
Un logiciel malveillant peut cacher les éventuelles empreintes qu'il laisse lors de son exécution pour 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, 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éter 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 que de différentes copies de  ce même logiciel paraissent différentes, pour le système de surveillance, lors de son exécution.

 Evasion par absence de fichier  
La plupart des antivirus classique 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 leurs 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 tel que 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.

 Evasion 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 chiffrer afin de ne pas laisser d'empreintes.

Généralement, les logiciels malveillants tel 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érales 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 .

Projets et outils notoires 

 dAnubis
 MalTRAK
 Arancino
 LiveDM
 TrumanBox
 MalDy
 DeepAM

Références

Bibliographie 

  

  

 

  

 

 

 

 

  

 

 

 

 

 

 

 

 

 

 

Sécurité informatique