Qu'est-ce que le fuzz ?

C'est quoi le flou

Intro : Qu'est-ce que le fuzzing ?

En 2014, des hackers chinois piraté dans les systèmes de santé communautaires, une chaîne d'hôpitaux américains à but lucratif, et a volé les données de 4.5 millions de patients. Les pirates ont exploité un bogue appelé Heartbleed qui a été découvert dans la bibliothèque de cryptographie OpenSSL quelques mois avant le piratage.

Heartbleed est un exemple d'une classe de vecteurs d'attaque qui permet aux attaquants d'accéder à une cible en envoyant des requêtes malformées suffisamment valides pour passer les vérifications préliminaires. Alors que les professionnels qui travaillent sur différentes parties d'une application font de leur mieux pour assurer sa sécurité, il est impossible de penser à tous les cas particuliers qui pourraient casser une application ou la rendre vulnérable pendant le développement.

C'est là qu'intervient le "fuzzing".

Qu'est-ce qu'une attaque fuzzing ?

Le fuzzing, le test fuzz ou une attaque fuzzing, est une technique de test de logiciel automatisée utilisée pour introduire des données aléatoires, inattendues ou invalides (appelées fuzz) dans un programme. Le programme est surveillé pour les comportements inhabituels ou inattendus tels que les débordements de tampon, les plantages, les fuites de mémoire, les blocages de thread et les violations d'accès en lecture/écriture. L'outil de fuzzing ou fuzzer est ensuite utilisé pour découvrir la cause du comportement inhabituel.

Le fuzzing est basé sur l'hypothèse que tous les systèmes contiennent des bogues attendant d'être découverts, et qu'on peut leur donner suffisamment de temps et de ressources pour le faire. La plupart des systèmes ont de très bons analyseurs ou une validation des entrées empêchant les cybercriminels d'exploiter des bogues hypothétiques dans un programme. Cependant, comme nous l'avons mentionné ci-dessus, couvrir tous les cas critiques pendant le développement est difficile.

Les fuzzers sont utilisés sur des programmes qui acceptent des entrées structurées ou qui ont une sorte de limite de confiance. Par exemple, un programme qui accepte les fichiers PDF aurait une certaine validation pour s'assurer que le fichier a une extension .pdf et un analyseur pour traiter le fichier PDF.

Un fuzzer efficace peut générer des entrées suffisamment valides pour dépasser ces limites mais suffisamment invalides pour provoquer un comportement inattendu plus loin dans le programme. Ceci est important car le simple fait de pouvoir dépasser les validations ne signifie pas grand-chose si aucun dommage supplémentaire n'est causé.

Les fuzzers découvrent des vecteurs d'attaque très similaires et incluant notamment l'injection SQL, les scripts intersites, le dépassement de mémoire tampon et les attaques par déni de service. Toutes ces attaques résultent de l'introduction de données inattendues, invalides ou aléatoires dans un système. 

 

Types de Fuzzers

Les fuzzers peuvent être classés en fonction de certaines caractéristiques :

  1. Cibles d'attaque
  2. Méthode de création de fuzz
  3. Connaissance de la structure d'entrée
  4. Sensibilisation à la structure du programme

1. Cibles d'attaque

Cette classification est basée sur le type de plate-forme que le fuzzer est utilisé pour tester. Les fuzzers sont couramment utilisés avec les protocoles réseau et les applications logicielles. Chaque plate-forme reçoit un type particulier d'entrée et nécessite donc différents types de fuzzers.

Par exemple, lorsqu'il s'agit d'applications, toutes les tentatives de fuzzing se produisent au niveau des différents canaux d'entrée de l'application, tels que l'interface utilisateur, le terminal de ligne de commande, les formulaires/entrées de texte et les téléchargements de fichiers. Ainsi, toutes les entrées générées par le fuzzer doivent correspondre à ces canaux.

Les fuzzers traitant des protocoles de communication doivent gérer les paquets. Les fuzzers ciblant cette plate-forme peuvent générer des paquets falsifiés, ou même agir comme des proxys pour modifier les paquets interceptés et les rejouer.

2. Méthode de création de fuzz

Les fuzzers peuvent également être classés en fonction de la façon dont ils créent des données avec lesquelles fuzzer. Historiquement, les fuzzers créaient du fuzz en générant des données aléatoires à partir de zéro. C'est ainsi que le professeur Barton Miller, l'initiateur de cette technique, l'a fait initialement. Ce type de fuzzer est appelé un fuzzer basé sur la génération.

Cependant, alors que l'on pourrait théoriquement générer des données qui contourneront une frontière de confiance, cela prendrait beaucoup de temps et de ressources pour le faire. Par conséquent, cette méthode est généralement utilisée pour les systèmes avec des structures d'entrée simples.

Une solution à ce problème consiste à faire muter des données connues pour être valides afin de générer des données suffisamment valides pour passer une frontière de confiance, mais suffisamment invalides pour causer des problèmes. Un bon exemple en est un Fuzzer DNS qui prend un nom de domaine et génère ensuite une longue liste de noms de domaine pour détecter les domaines potentiellement malveillants ciblant le propriétaire du domaine spécifié.

Cette approche est plus intelligente que la précédente et réduit considérablement les permutations possibles. Les fuzzers qui utilisent cette méthode sont appelés fuzzers basés sur la mutation

Il existe une troisième méthode plus récente qui utilise des algorithmes génétiques pour converger vers les données fuzz optimales nécessaires pour éliminer les vulnérabilités. Il fonctionne en affinant continuellement ses données fuzz, en tenant compte des performances de chaque donnée de test lorsqu'elle est introduite dans un programme. 

Les ensembles de données les moins performants sont supprimés du pool de données, tandis que les meilleurs sont mutés et/ou combinés. La nouvelle génération de données est ensuite utilisée pour tester à nouveau le fuzz. Ces fuzzers sont appelés fuzzers évolutifs basés sur les mutations.

3. Connaissance de la structure d'entrée

Cette classification est basée sur le fait qu'un fuzzer est conscient et utilise activement la structure d'entrée d'un programme pour générer des données fuzz. UN connard stupide (un fuzzer qui ne connaît pas la structure d'entrée d'un programme) génère du fuzz de manière essentiellement aléatoire. Cela pourrait inclure à la fois des fuzzers basés sur la génération et sur la mutation. 


Si un fuzzer est fourni avec le modèle d'entrée d'un programme, le fuzzer peut alors essayer de générer ou de muter des données de sorte qu'elles correspondent au modèle d'entrée fourni. Cette approche réduit davantage la quantité de ressources dépensées pour générer des données invalides. Un tel fuzzer est appelé un fuzzer intelligent.

4. Connaissance de la structure du programme

Les fuzzers peuvent également être classés en fonction de leur connaissance du fonctionnement interne du programme qu'ils fuzzent et utiliser cette prise de conscience pour faciliter la génération de données de fuzz. Lorsque les fuzzers sont utilisés pour tester un programme sans comprendre sa structure interne, cela s'appelle un test de boîte noire. 

Les données de fuzz générées lors des tests en boîte noire sont généralement aléatoires, à moins que le fuzzer ne soit un fuzzer basé sur une mutation évolutive, où il "apprend" en surveillant l'effet de son fuzzing et en l'utilisant. d'information pour affiner son jeu de données fuzz.

Les tests en boîte blanche, quant à eux, utilisent un modèle de la structure interne du programme pour générer des données fuzz. Cette approche permet à un fuzzer d'accéder à des endroits critiques d'un programme et de le tester. 

Outils de fuzz populaires

Il y a beaucoup de fuzz les outils là-bas utilisé par les testeurs de stylo. Certains des plus populaires sont :

Limites du fuzzing

Bien que le fuzzing soit une technique de test de pénétration vraiment utile, il n'est pas sans défauts. Certains d'entre eux sont :

  • Il est assez long à courir.
  • Les plantages et autres comportements inattendus détectés lors des tests en boîte noire d'un programme peuvent être difficiles, voire impossibles, à analyser ou à déboguer.
  • La création de modèles de mutation pour les fuzzers intelligents basés sur la mutation peut prendre du temps. Parfois, cela peut même ne pas être possible car le modèle d'entrée est propriétaire ou inconnu.

 

Néanmoins, c'est un outil assez utile et nécessaire pour quiconque veut découvrir les bogues avant les méchants.

Conclusion

Le fuzzing est une puissante technique de test d'intrusion qui peut être utilisée pour découvrir les vulnérabilités des logiciels. Il existe de nombreux types de fuzzers et de nouveaux fuzzers sont constamment développés. Bien que le fuzzing soit un outil incroyablement utile, il a ses limites. Par exemple, les fuzzers ne peuvent trouver qu'un nombre limité de vulnérabilités et ils peuvent être très gourmands en ressources. Cependant, si vous voulez essayer cette technique étonnante par vous-même, nous avons un API DNS Fuzzer gratuite que vous pouvez utiliser sur notre plateforme. 

Alors, qu'est-ce que vous attendez ?  

Commencez à fuzzer dès aujourd'hui !