J'ai commencé à m'intéresser au fuzzing en avril 2007 alors que je testais la solidité de mon projet Hachoir. J'ai ensuite écrit divers scripts bash, puis Python, pour fuzzer d'autres programmes. Perfectionniste, j'ai commencé en novembre dernier à réécrire tous mes scripts depuis zéro en partant sur une nouvelle architecture basée sur un système multi-agents. Deux mois plus tard, j'ai fini de réécrire tous les scripts (Mplayer, ClamAV, Firefox, etc.). Pour marquer le coup, j'ai publié la version 0.7 du projet Fusil.

Nouveautés de la version 0.7

  • Projet Firefox utilisant un serveur HTTP écrit depuis zéro, un processus Firefox, et un agent qui envoie la touche F5 à Firefox
  • Début du portage sous Windows : Fusil devrait maintenant fonctionner sur Linux, *BSD et Windows
  • Corrections du système multi-agents et divers bugs mineurs

La complexité du scénario du projet Firefox montre que Fusil est maintenant prêt pour n'importe quel type de scénario :

  • Exécution d'un processus Firefox
  • Génération d'images invalides (ou n'importe quel type fichier, comme un animation Flash)
  • Exécution d'un serveur HTTP : port TCP 8080 en écoute, puis réponse aux diverses requêtes du navigateur web
  • Envoi de la touche F5 à Firefox pour rafraichir l'affichage

Chaque étape est activée à la fin de la précédente, ce qui se décrit simplement avec les événements Fusil (session_start, mangle_filenames, http_server_ready, ...).

Fusil gagne en fonctionnalités

L'idée de Fusil est de simplifier l'écriture d'un projet de fuzzing. Il suffit de décrire le scénario pour préparer et surveiller l'environnement, sans avoir à s'occuper des détails techniques (rediriger la sortie du processus, détecter un plantage, etc). Fusil va plus loin en offrant des fonctionnalités communes à tous les projets :

  • Reconnaissance des comportements anormaux : utilisation excessive du processeur (+75% durant 3 secondes), motif de texte dans la sortie standard ou logs Linux (« assertion », « segfault », « glibc detected », ...)
  • Recherche automatique des paramètres optimaux capables de planter une application (en particulier, le nombre d'erreur injectées dans un fichier valide)
  • Protection du système d'exploitation : limitation des ressources (mémoire / temps) des processus crées, copie partielle des variables d'environnement, etc.
  • Pause pour attendre que la charge de la machine retombe sous un certain seuil (CPU à 50%)
  • Création d'un dossier temporaire pour chaque session (exécution) du projet, sauvegardé en cas de succès
  • Fichier de log contenant l'ensemble des commandes permettant d'analyser un crash voir de rejouer le scénario manuellement

Dans sa version 0.7, Fusil offre des outils pour compiler du code C, créer et surveiller des processus, des clients et serveurs réseaux non blocants (en particulier, un serveur HTTP), etc.