
Plugin BianryNinja pour identifier les vulnérabilités dans les binaires décompilés, avec des analyses programmatiques et le support LLM.
Recherche de vulnérabilités assistée par LLM pour Binary Ninja.
VulnFanatic-NG ajoute un panneau latéral qui analyse le binaire actuel et demande à un LLM — un modèle compatible OpenAI hébergé localement par défaut, ou Anthropic Claude, Google Gemini, ou Azure OpenAI (voir Backends LLM) — de juger si un code suspect est réellement vulnérable. Il fonctionne principalement à partir de la sortie du décompilateur (HLIL) de Binary Ninja, en utilisant l'assembleur si nécessaire, et ne rapporte que les problèmes confirmés avec des références cliquables vers le code.
Une analyse s'exécute en jusqu'à trois phases (la phase 3 est optionnelle et en ligne uniquement) :
Trouve les sites d'appel des fonctions dangereuses définies dans rules/phase1_rules.json — strcpy, memcpy, sprintf/chaînes de format, system, alloca, scanf, API de commande/exécution, RNG faible, la famille free/delete (use-after-free / double-free), lectures d'entrées non fiables dans des tampons fixes (recv/read/fread/ReadFile), injection SQL (sqlite3_exec/mysql_query/PQexec), vérification de certificat TLS désactivée (SSL_CTX_set_verify/curl), SSRF, et gestion inappropriée des privilèges (setuid/setresgid), la famille memset/bzero, et comparaisons avec une longueur contrôlée par l'attaquant (memcmp/strncmp → contournement d'authentification), à travers C/C++, Win32, et (au mieux) Rust FFI. La couverture inclut les variantes fortifiées _chk (FORTIFY) et Annex-K _s. Les fonctions de sortie formatée bornées (snprintf et variantes) ont leur propre règle par défaut sécurisée afin qu'un argument de taille correct ne soit pas signalé comme un débordement. Les sites d'appel sont trouvés de trois manières : appels directs aux symboles nommés ; appels acheminés via des thunks de redirection / stubs PLT (les appelants réels sont récupérés, donc une importation atteinte uniquement via un stub n'est pas manquée) ; et — sauf si vulnfanatic.scanIndirectCalls est désactivé — appels indirects envoyés via un pointeur de fonction ou une vtable que Binary Ninja a résolu en une fonction dangereuse. Pour chaque site d'appel, il construit un contexte interprocédural, centré sur le décompilateur, avec un budget de jetons (100k par défaut) :
__*_chk et les variantes vérifiées des limites *_s prennent des arguments supplémentaires en tête, décalant la position du format/taille/destination,s->buf se résolve en la taille réelle du tableau du champ plutôt qu'en la taille du pointeur de s ; les définitions de structure dans la section des types portent également des tailles en octets par champ,0x40 ou bornée à [0, 0xff]), que le modèle utilise comme vérité terrain lorsqu'il compare une taille à une capacité de tampon au lieu de deviner,vulnfanatic.includeStackLayout),if/boucle/switch qui protègent l'appel),MAIN→ABCD→strcpy, également les fonctions que MAIN et ABCD appellent ailleurs), car elles peuvent contenir les vérifications de limites/validation qui contrôlent la valeur dangereuse (vulnfanatic.includeCallPathSiblings, rempli tant que le budget le permet), etrecv/read/getenv appelées dans la même fonction).Ce contexte, ainsi qu'une invite spécifique à la règle, est envoyé au modèle, qui renvoie un verdict structuré. Les non-problèmes sont ignorés. Les invites sont optimisées pour un modèle de code local puissant (par exemple Qwen2.5-Coder) et lui demandent d'analyser l'ensemble du flux et d'émettre uniquement du JSON.
Le modèle reçoit l'instruction de favoriser le rappel — signaler les problèmes plausibles et pertinents pour la sécurité et exprimer l'incertitude via une Confiance plutôt que d'abandonner tout ce qu'il ne peut pas prouver complètement. Il montre son travail dans un bloc-notes qui cite les extraits de code textuels sur lesquels il s'est appuyé (la source d'entrée, chaque garde, la taille/longueur, le type pertinent, et le puits), qui est stocké sur la constatation afin que vous puissiez auditer le raisonnement.
Chaque constatation porte une Confiance (haute/moyenne/basse) : haute = toute la chaîne est montrée dans le contexte ; moyenne = probable, avec un ou deux liens inférés ; basse = une piste méritant un examen manuel. C'est la métrique principale (l'estimation de sévérité du modèle est un champ secondaire). Définissez vulnfanatic.minConfidence pour ignorer tout ce qui est en dessous d'un seuil.
Par défaut, VulnFanatic-NG favorise le rappel (détection des vrais problèmes). Si vous obtenez trop de faux positifs, resserrez avec l'un des éléments suivants :