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 entreprises. 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.
Pour proposer des règles plus universelles et évolutives, l'idée de solutions de détection des menaces renforcées par apprentissage automatique a émergé.
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 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é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 () ; Classification (Artificial Neural Networks, Decision Trees, Naïve Bayes, Support Vector Machines).
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 : étude de la distribution de petites séquences N-Gramme des codes d'opérations générés ; étude 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 chargé 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 et 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.