Évasion d'AV
Dernière mise à jour
Dernière mise à jour
Pour comprendre comment contourner un anti-virus, il faut d'abord comprendre comment ces derniers fonctionnent. Il existe plusieurs méthodes, plus ou moins récentes, voici les principales méthodes de détection utilisée par les anti-virus.
La plupart des anti-virus scannent le code des programmes présents sur les disques (mémoire permanente), mais plus rarement et généralement moins efficacement, dans la RAM (mémoire vive, éphémère). Ils sont à la recherche de bouts de codes connus pour être malveillants. Cette méthode est longue mais efficace contre les malwares répandus et connus. Algorithmiquement parlant, cette détection est effectuée par comparaison de signatures de portions de code (par le moyen de hash) par exemple.
Par un principe similaire de signatures, certains anti-virus sont amenés à créer une signature pour chaque programme présent sur vos disques. Cette signature est effectuée à partir du contenu de l'exécutable. Ainsi, le logiciel anti-virus pourra rapidement savoir si un exécutable a été modifié et prendre des décisions en fonction de plusieurs critères.
Il est possible de signer nos exécutables afin de garantir leur authenticité et apporter un engagement personnel sur le contenu et la sécurité du programme. Le fonctionnement est simple et s'opère en plusieurs étapes :
L'autorité garantissant l'authenticité du programme utilise le contenu du programme pour générer un hash signature de celui-ci.
L'autorité chiffre la signature par le moyen d'un cryptage asymétrique. Elle utilise la clé privée pour chiffrer la signature.
L'utilisateur utilise la clé publique pour déchiffrer le contenu de la signature. S'assurant ainsi par ce chiffrement que l'autorité ayant signée est bien authentique.
L'utilisateur calcule la signature de l'exécutable et la compare à la signature fournie par l'autorité. Si les signatures correspondent, l'intégrité du programme est garantie.
L'analyse heuristique est une méthode d'analyse et de détection d'activité malveillante lorsque le programme est en cours d'exécution. L'analyse heuristique est alors une analyse comportementale d'un programme. Elle est effectuée en environnement réel, ou bien encapsulée dans une sandbox
virtualisée par l'anti-virus pour pouvoir analyser un comportement sans pour autant risquer que le programme observé fasse des dégâts avant sa détection.
Les comportements observés peuvent être :
Une activité sur le réseau, en analysant aussi bien le destinataire que la taille et la nature des paquets.
Des accès sur la machine.
Diverses opérations effectuées par le programme.
Des mesures de temps.
Des interactions avec des programmes tiers.
Le terme heuristique fait référence aux fonctions heuristiques dans le contexte de la théorie des graphes. Pour expliquer cela simplement, considérons qu'un graphe est un ensemble de nœuds/sommets reliés par des arêtes/arcs. Dans notre contexte :
Chaque sommet représente un état de fait observé par l'anti-virus, comme par exemple, la présence d'un comportement chez le programme analysé.
Chaque arête représente une connexion à un autre sommet, mais possède également un poids.
Le poids de chaque arête va être additionné ou multiplié selon des règles s'appliquant à tout le graphe afin de déterminer un poids total à l'issu de l'analyse comportementale. Plus le poids d'une arrête va être important, plus la liaison liant 2 sommets actifs (états de fait détectés par l'anti-virus concernant le programme analysé), plus cette liaison va être un indicateur fort de comportement malveillant.
En réalité, il existe plusieurs variantes de calcul de poids, mais d'une manière générale, chaque sommet possède un poids qui lui est propre et chaque arête possède un coefficient multiplicateur de ces poids, qui une fois multipliés par ces derniers, sont additionnés aux résultats des autres liaisons. Déterminant ainsi le poids total du graphe. Les sommets peuvent également avoir un état plus complexe que binaire (comportement observé : oui/non) et le poids sera alors différent en fonction des différents 'états d'activation du sommet.
Ajouter un timeout dans notre code avant la portion malveillante car l'AV (anti-virus) n'observe le comportement post exécution qu'un certain temps limité pour ne pas ralentir les performances de la machine.
Attendre une interaction avec l'utilisateur avant de déployer le comportement malicieux. Cela permet également de bypass beaucoup d'analyses heuristiques.
Vérifier si le programme tourne dans une sandbox avant de déployer le comportement malveillant.
Pour vérifier que le programme est dans une sandbox, il existe plusieurs techniques et beaucoup sont propres à l'anti-virus que l'on désire bypass. Quelques unes des plus généralistes et populaires :
Vérifier l'identité de l'utilisateur qui a exécuté le programme.
Vérifier l'accès à certains fichiers et leurs existences, qui peuvent être différentes dans une sandbox et en production.
D'autres particularités propres aux logiciels anti-virus comme par exemple le datetime
.
Faire de l'obfuscation de code pour rendre le code très difficilement visible pour l'humain et pour certains scans d'anti-virus.
Voici quelques exemples de techniques d'obfuscation :
Modifier le nom de variables et de fonctions ainsi que les commentaires au sein du code pour porter à confusion et tromper le lecteur concernant les fonctions des divers objets.
Rajouter du code inutile pour noyer les informations utiles et donc le fonctionnement du programme.
Rendre la syntaxe illisible en jouant avec au maximum dans nos choix de variables.
Rajouter plusieurs étapes d'encodage inutilement pour rendre l'analyse plus pénible pour l'humain et pour certains algorithmes de scan.
Chiffrer le code et effectuer un déchiffrement du contenu malveillant au runtime pour bypass certains scan sur disques. Cela s'apparente à l'obfuscation mais selon les techniques utilisées pour déchiffrer, ces méthodes ne rentrent pas dans la définition de l'obfuscation.
Parvenir à faire signer l'exécutable par une autorité, comme vu précédemment ou voler une signature déjà existante.
Modifier la signature malveillante du programme par altération du contenu de la portion de code concernée. Cela permet d'éviter quelques scans par signatures connues si le bout de code utilisé est populaire.
Rendre le malware fileless
, c'est à dire que le programme n'existe que dans la mémoire vive (RAM).
Cela permet de bypass tous les scans sur disque, cependant, le malware est alors éphémère et disparaîtra lorsque la RAM sera vidée si une technique de persistance n'est pas mise en place sur le système avant ce vidage de RAM. Pour créer un tel malware, il suffit de passer par un programme tier tel que PowerShell
pour exécuter le code malicieux. Le programme n'existera alors pas sur un disque.
Injecter le malware dans un processus important de Windows par exemple, ou un programme tier de confiance, le plus rapidement possible. Cela est possible car certains logiciels comme les logiciels de débogue ou bien les anti-virus ont besoin d'effectuer de telles opérations.
Scanner les AV de la machine et prendre des décisions en fonction, afin de favoris le caractère FUD (Fully Undetectable) de notre programme plutôt que son efficacité. On pourrait alors par exemple avorter l'attaque si le programme se sent en danger. On peut également tenter de neutraliser les différents anti-virus présents.
Vous pouvez voir quelques commandes PowerShell qui peuvent être utilisées pour bypass Windows Defender sur la page de ce wiki dédiée à PowerShell.