ven, 27/04/2018 - 15:16
Dans la première partie de ce papier, nous allons revenir sur le concept de signatures, point commun à tous les antivirus et revenir sur la façon dont les antivirus ont dû s’adapter pour faire face aux malwares polymorphes. Une signature est une séquence spécifique de code malveillant qui permet à l’antivirus d’identifier un malware.
Donc, en théorie, l’idée est de prélever (manuellement ou automatiquement) un fragment de code (aussi petit que possible pour conserver des petites bases de données), de s’assurer qu’il ne correspond à aucun autre code de malware ni à des applications légitimes et de l’ajouter à la base virale. Par la suite, l’antivirus peut détecter une infection en « regardant » simplement le code d’une application. Mais les pirates sachant également que les antivirus utilisent des signatures, ils peuvent savoir quelle signature va déclencher l’antivirus pour qu’il reconnaisse un malware. Donc, ils modifient la partie du code correspondant à la signature et le malware échappe ainsi à la vigilance de l’antivirus.
Mais si les antivirus peuvent facilement détecter des fichiers malveillants grâce à leurs signatures, les attaquants peuvent-ils créer des malwares qui ne génèrent pas de signatures ? Les malwares polymorphes ne contiennent pas de partie de leur code qui puisse être associée à un type de malwares. Lorsqu’un fichier est infecté, le code malveillant est modifié ou diffusé via le fichier afin qu’aucun signe distinctif d’une infection ne soit détecté. Le premier virus polymorphe connu a été nommé 1260 et a été écrit par Mark Washburn en 1990. Un autre virus polymorphe bien connu a été diffusé en 1992 par un pirate bulgare agissant sous le pseudo Dark Avenger, qui a également créé son propre MtE (Mutation Engine). Il existe plusieurs moyens pour empêcher les antivirus de détecter les malwares par leur signature.
NOP. Ou NOOP (« No Operation ») est une commande spécifique qui indique au CPU de « ne rien faire ». Ses applications sont multiples. Il peut par exemple être utilisé pour créer un retard sur un laps de temps donné.
Dit plus simplement, n’importe quel programme (malware inclus) représente un ensemble d’instructions et de données. Le code d’une application est une séquence d’instructions (de commandes). Dès lors que la commande NOP ne fait rien, elle peut être insérée n’importe où dans le flot d’autres instructions ou disséminée au hasard dans un code : cela n’aura aucun impact sur le fonctionnement du programme (sauf si, bien sûr, un retard affecte son fonctionnement).
Ce piège est relativement simple, mais la réponse de l’antivirus l’est tout autant : en comparant les signatures lors de l’analyse du code, les commandes NOP sont ignorées.
Le chiffrement est la seconde option. En utilisant plusieurs clés pour chiffrer des données, on obtient deux morceaux de code différents. Lorsqu’un fichier est infecté, le code malveillant est chiffré grâce à une nouvelle clé qui est ajoutée au code de déchiffrement. Placez les données chiffrées dans un fichier ciblé, indiquez au déchiffreur le début du code qui est chiffré et ajoutez le code de déchiffrement au fichier ciblé. Dans ce cas, l’antivirus ne peut pas repérer le code chiffré et peut seulement détecter le déchiffreur. Pendant ce temps, lorsqu’un fichier est infecté, le code de déchiffrement est également modifié- la clé et les instructions de branche lui sont ajoutées.
Malheureusement, les utilisateurs regardent plutôt les résultats obtenus par les antivirus lors des tests que les méthodes de test.
Or, la méthodologie est un facteur crucial. Par exemple, si le test contrôle uniquement la façon dont les antivirus détectent les fichiers malveillants sans les lancer, un antivirus peut obtenir de bons résultats même sans analyseur polymorphique, uniquement en regardant des morceaux spécifiques de code régulièrement utilisés dans les tests. Toutes les techniques décrites ci-dessus ont pour seul objet de rendre le travail des antivirus encore plus difficile, rien de plus. La permutation est utilisée pour débarrasser les programmes malveillants de morceaux de code spécifiques qui peuvent être utilisés pour les identifier. Rappelons-nous que le code est une séquence de commandes. Les commandes peuvent se suivre ou être diffusées dans d’autres données. L’instruction JMP (Jump) est utilisée pour naviguer entre les fragments. Dans ce cas, le code malveillant va constituer en de multiples blocs qui seront réarrangés lorsqu’un nouveau fichier sera infecté et connectés en utilisant l’instruction jump. Cela paraît simple ? Pas du tout ! Chaque code d’un programme inclut des appels de fonction, des branches etc. Donc, si des parties du code sont remaniées, le code doit être examiné pour s’assurer que tous les appels pointent bien vers les bons endroits. Et pour empêcher les antivirus de détecter le code par sa signature, les blocs de code doivent être tout petits tandis que l’intégrité du code doit tout de même être maintenue.
Comment les antivirus peuvent-ils contrer les permutations ?
A l’heure actuelle, ils ne recherchent pas uniquement les signatures. Ils scrutent également les instructions et naviguent entre les jumps et les branches. Ainsi, en naviguant entre les séquences d’instructions (c’est-à-dire en exécutant les fichiers dans son moteur), l’antivirus rassemble des morceaux de code et peut comparer les résultats avec sa base de signatures. Cela ne semble pas difficile, mais en réalité, cela signifie que des ressources système doivent être allouées au lancement des fichiers, ce qui peut affecter les performances globales du système. C’est pourquoi l’analyse polymorphique ne peut être effectuée pour chaque fichier lors des scans antivirus. C’est ici que l’analyse heuristique vient à la rescousse (à découvrir dans une seconde partie).
A propos de l'auteur