Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
VulFi — Plugin IDA Pro pour la recherche basée sur des requêtes dans le binaire, utile principalement pour la recherche de vulnérabilités. | Kitploit
Outils/GitHubGitHub/accenture/vulfi
Analyse StatiqueAnalyse des VulnérabilitésRétro-ingénierieAnalyse de Binaires
GitHubaccenture/vulfi

VulFi

Plugin IDA Pro pour la recherche basée sur des requêtes dans le binaire, utile principalement pour la recherche de vulnérabilités.

Voir le dépôt
66974il y a 1 anVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

VulFi v3.0

Introduction

L'outil VulFi (Vulnerability Finder) est un plugin pour IDA Pro qui peut être utilisé pour aider lors de la chasse aux bugs dans les binaires. Son objectif principal est de fournir une vue unique avec toutes les références croisées vers les fonctions les plus intéressantes (telles que strcpy, sprintf, system, etc.). Pour les cas où un décompilateur Hexrays peut être utilisé, il tente d'écarter les appels à ces fonctions qui ne sont pas intéressants du point de vue de la recherche de vulnérabilités (pensez à quelque chose comme strcpy(dst,"Hello World!")). Sans le décompilateur, les règles sont beaucoup plus simples (pour ne pas dépendre de l'architecture) et n'écartent donc que les cas les plus évidents.

Voir Changelog pour plus d'informations sur les mises à jour.

Installation

Placez les fichiers vulfi.py, vulfi_prototypes.json et vulfi_rules.json dans le dossier des plugins IDA (cp vulfi* <IDA_PLUGIN_FOLDER>).

Préparation du fichier de base de données

Avant d'exécuter VulFi, assurez-vous de bien comprendre le binaire avec lequel vous travaillez. Essayez d'identifier toutes les fonctions standard (strcpy, memcpy, etc.) et nommez-les en conséquence. Le plugin est insensible à la casse, donc MEMCPY, Memcpy et memcpy sont tous des noms valides. Cependant, notez que la recherche de la fonction nécessite une correspondance exacte. Cela signifie que memcpy? ou std_memcpy (ou toute autre variante) ne seront pas détectés comme une fonction standard et ne seront donc pas pris en compte lors de la recherche de vulnérabilités potentielles. Si vous travaillez avec un binaire inconnu, vous devez d'abord définir les options du compilateur Options > Compiler. Ensuite, VulFi fera de son mieux pour filtrer tous les faux positifs évidents (comme un appel à printf avec une chaîne constante comme premier paramètre). Veuillez noter que même si le plugin est conçu sans lien avec une architecture spécifique, certains processeurs ne prennent pas entièrement en charge la spécification des types et dans ce cas, VulFi marquera simplement toutes les références croisées aux fonctions standard potentiellement dangereuses pour vous permettre de procéder à une analyse manuelle. Dans ces cas, vous pouvez bénéficier des fonctionnalités de suivi du plugin.

Utilisation

Analyse

Pour lancer l'analyse, sélectionnez l'option Search > VulFi dans la barre de menu supérieure. Cela lancera soit une nouvelle analyse, soit lira les résultats précédents stockés dans le fichier idb/i64. Les données sont automatiquement sauvegardées chaque fois que vous sauvegardez la base de données.

Une fois l'analyse terminée ou une fois les résultats précédents chargés, un tableau sera présenté avec une vue contenant les colonnes suivantes :

  • IssueName - Utilisé comme titre pour le problème suspecté.
  • FunctionName - Nom de la fonction.
  • FoundIn - La fonction qui contient la référence potentiellement intéressante.
  • Address - L'adresse de l'appel détecté.
  • Status - Le statut de révision, initialement Not Checked est attribué à chaque nouvel élément. Les autres statuts sont False Positive, Suspicious et Vulnerable. Ceux-ci peuvent être définis à l'aide d'un menu contextuel (clic droit) sur un élément donné et doivent refléter les résultats de la révision manuelle de l'appel de fonction donné.
  • Priority - Une tentative de priorisation des appels les plus intéressants par rapport aux moins intéressants. Les valeurs possibles sont High, Medium et Low (également Info pour les cas où le scanner n'a pas pu identifier correctement tous les paramètres). Les priorités sont définies avec d'autres règles dans le fichier vulfi_rules.json.
  • Comment - Un commentaire défini par l'utilisateur pour l'élément donné.

Dans le cas où il n'y a pas de données dans le fichier idb/i64 ou si l'utilisateur décide d'effectuer une nouvelle analyse, le plugin demandera s'il doit exécuter l'analyse en utilisant les règles incluses par défaut ou s'il doit utiliser un fichier de règles personnalisé. Veuillez noter que lancer une nouvelle analyse avec des données déjà existantes n'écrase pas les éléments précédemment trouvés identifiés par la règle portant le même nom que celui des résultats précédemment stockés. Par conséquent, relancer l'analyse ne supprime pas les commentaires existants ni les mises à jour de statut.

basic

Dans le menu contextuel du clic droit dans la vue VulFi, vous pouvez également supprimer l'élément des résultats ou supprimer tous les éléments. Veuillez noter que tous les commentaires ou mises à jour de statut seront perdus après cette opération. Depuis la version 2.1, VulFi prend également en charge les opérations effectuées sur plusieurs éléments sélectionnés à la fois. Cela permet de marquer plusieurs éléments avec un certain statut, de les supprimer ou d'ajouter le même commentaire à plusieurs lignes. Il arrive parfois que l'opération ne se rafraîchisse pas correctement. Lorsque cela se produit, rafraîchissez l'interface utilisateur (Ctrl+U) plusieurs fois jusqu'à ce que vous voyiez les changements reflétés.

Investigation

Lorsque vous souhaitez inspecter l'instance détectée d'une fonction potentiellement vulnérable, double-cliquez simplement n'importe où dans la ligne souhaitée et IDA vous amènera à l'emplacement mémoire identifié comme potentiellement intéressant. En utilisant le clic droit et l'option Set Vulfi Comment, vous pouvez saisir un commentaire pour l'instance donnée (pour justifier le statut par exemple).

Ajout de fonctions supplémentaires

Le plugin permet également de créer des règles personnalisées. Ces règles peuvent être définies dans l'interface IDA (idéal pour des fonctions uniques) ou fournies sous la forme d'un fichier de règles personnalisé (idéal pour des règles visant à couvrir plusieurs fonctions).

Dans l'interface

Lorsque vous souhaitez suivre une fonction personnalisée, identifiée au cours de l'analyse, faites un clic droit n'importe où dans son corps et sélectionnez Add <name> function to VulFi. Vous pouvez également surligner et faire un clic droit sur un nom de fonction dans la vue de désassemblage/décompilation actuelle pour éviter de passer dans le corps de la fonction.

add custom

Ensemble de règles personnalisé

Il est également possible de charger un fichier personnalisé avec un ensemble de plusieurs règles. Pour créer un fichier de règles personnalisé avec la structure ci-dessous, vous pouvez utiliser le fichier modèle inclus ici.

root@kitploit:~
[   // Un tableau de règles
    {
        "name": "NOM DE LA RÈGLE", // Le nom de la règle
        "function_names":[
            "nom_de_la_fonction_à_rechercher" // Liste de tous les noms de fonctions qui doivent correspondre aux conditions définies dans cette règle
        ],
        "wrappers":true,    // Rechercher également les wrappers des fonctions ci-dessus (notez que la fonction wrappée doit également correspondre à la règle)
        "mark_if":{
            "High":"True",  // Si évalue à True, marquer avec priorité High (voir Règles ci-dessous)
            "Medium":"False", // Si évalue à True, marquer avec priorité Medium
            "Low": "False" // Si évalue à True, marquer avec priorité Low
        }
    }
]

Un exemple de règle qui recherche toutes les références croisées à la fonction malloc et vérifie si son paramètre n'est pas constant et si la valeur de retour de la fonction est vérifiée est présenté ci-dessous :

root@kitploit:~
{
    "name": "Possible Null Pointer Dereference",
    "function_names":[
        "malloc"
    ],
    "wrappers":false,
    "mark_if":{
        "High":"not param[0].is_constant() and not function_call.return_value_checked()",
        "Medium":"False",
        "Low": "False"
    }
}

Règles

Aides pour les constructions non fonctionnelles

  • Loop Check - Marque toutes les boucles. Dans ce cas, param[0] est le compteur de la boucle (si détecté) et param[1] est la condition par rapport à laquelle le compteur est vérifié pour terminer la boucle.
  • Array Access - Marque tous les accès aux tableaux. Dans ce cas, param[0] est le tableau et param[1] est l'index.

Les mêmes fonctions peuvent être utilisées lors de la création de règles que pour les paramètres de fonction normaux (tout ce qui peut être appelé sur param[<index>]).

Variables disponibles

  • param[<index>] : Utilisé pour accéder au paramètre d'un appel de fonction (l'index commence à 0)
  • function_call : Utilisé pour accéder à l'événement d'appel de fonction
  • param_count : Contient le nombre de paramètres qui ont été passés à une fonction

Fonctions disponibles

  • Le paramètre est-il une constante : param[<index>].is_constant()
  • Obtenir la valeur numérique du paramètre : param[<index>].number_value()
  • Obtenir la valeur chaîne du paramètre : param[<index>].string_value()
  • Le paramètre est-il mis à null après l'appel : param[<index>].set_to_null_after_call()
  • La valeur de retour d'une fonction est-elle vérifiée : function_call.return_value_checked(<constant_to_check>)
  • Le paramètre est-il également utilisé comme paramètre dans l'un des appels à une liste spécifiée de fonctions avant/après : param[<index>].used_in_call_<before|after>(["function1","function2"])
  • L'appel à la fonction sélectionnée est-il accessible depuis une autre fonction spécifique : function_call.reachable_from("<function_name>")
  • Le paramètre fait-il partie d'une comparaison signée : param[<index>].is_sign_compared()
  • Le paramètre est-il utilisé comme index de tableau dans la fonction courante : param[<index>].used_as_index()

Exemples

  • Marquer tous les appels à une fonction où le troisième paramètre est > 5 : param[2].number_value() > 5
  • Marquer tous les appels à une fonction où le deuxième paramètre contient "%s" : "%s" in param[1].string_value()
  • Marquer tous les appels à une fonction où le deuxième paramètre n'est pas constant : not param[1].is_constant()
  • Marquer tous les appels à une fonction où la valeur de retour est validée par rapport à la valeur égale au nombre de paramètres : function_call.return_value_checked(param_count)
  • Marquer tous les appels à une fonction où la valeur de retour est validée par rapport à n'importe quelle valeur : function_call.return_value_checked()
  • Marquer tous les appels à une fonction où aucun des paramètres à partir du troisième n'est constant : all(not p.is_constant() for p in param[2:])
  • Marquer tous les appels à une fonction où l'un des paramètres est constant : any(p.is_constant() for p in param)
  • Marquer tous les appels à une fonction : True
  • Marquer tous les appels à une fonction où le deuxième paramètre n'est pas constant et n'est pas vérifié avec strlen :

Problèmes et avertissements

  • Lorsque vous demandez le paramètre avec un index hors limites, tout appel à une fonction sera marqué avec une priorité Low. C'est une façon d'éviter de manquer des références croisées lorsqu'il n'a pas été possible d'obtenir correctement tous les paramètres (cela s'applique principalement au mode de désassemblage).
  • Lorsque vous effectuez une recherche dans la vue VulFi et que vous changez de contexte hors de la vue puis revenez, la vue ne se chargera pas. Vous pouvez résoudre ce problème soit en terminant l'opération de recherche avant de changer de contexte, soit en déplaçant la vue VulFi dans la vue latérale pour qu'elle soit toujours visible, soit en fermant et en rouvrant la vue (aucune donnée ne sera perdue).
  • Les analyses pour des architectures plus exotiques se terminent avec beaucoup de faux positifs.
  • Avec l'ajout des opérations multi-sélection dans le sélecteur VulFi, les opérations de rafraîchissement échouent parfois à mettre à jour la vue. Si vous remarquez que vos modifications ne sont pas reflétées, utilisez le raccourci Ctrl+U pour rafraîchir manuellement la vue (plusieurs fois).
Télécharger l’outil
not param[1].is_constant() and not param[1].used_in_call_before(["strlen"])
  • Marquer tous les appels à une fonction qui sont accessibles depuis la fonction read : function_call.reachable_from("read")