
Plugin per BianryNinja che identifica vulnerabilità nei binari decompilati, con scansioni programmatiche e supporto LLM.
Ricerca di vulnerabilità assistita da LLM per Binary Ninja.
VulnFanatic-NG aggiunge un pannello laterale che analizza il binario corrente e chiede a un LLM — un modello compatibile con OpenAI ospitato localmente per impostazione predefinita, oppure Anthropic Claude, Google Gemini o Azure OpenAI (vedi Backend LLM) — di stabilire se il codice sospetto è davvero vulnerabile. Funziona principalmente dall'output del decompilatore (HLIL) di Binary Ninja, ripiegando sull'assembly quando necessario, e segnala solo problemi confermati con riferimenti cliccabili al codice.
Una scansione viene eseguita in un massimo di tre fasi (la Fase 3 è opzionale e solo online):
Trova i punti di chiamata delle funzioni pericolose definite in
rules/phase1_rules.json — strcpy,
memcpy, sprintf/stringhe di formato, system, alloca, scanf, API
di comandi/exec, RNG debole, la famiglia free/delete (use-after-free / double-free),
letture di input non attendibile in buffer a dimensione fissa (recv/read/fread/ReadFile),
iniezione SQL (sqlite3_exec/mysql_query/PQexec), verifica dei certificati TLS
disabilitata (SSL_CTX_set_verify/curl), SSRF e gestione impropria
dei privilegi (setuid/setresgid), la famiglia memset/bzero e
confronti con una lunghezza controllata dall'attaccante (memcmp/strncmp →
bypass dell'autenticazione), in C/C++, Win32 e (per quanto possibile) Rust FFI. La copertura
include le varianti fortificate _chk (FORTIFY) e quelle _s dell'Annex K. Le funzioni
di output formattato limitato (snprintf e varianti) hanno una propria regola
sicura di default, così un argomento di dimensione corretto non viene segnalato come overflow. I punti di chiamata vengono
trovati in tre modi: chiamate dirette ai simboli nominati; chiamate instradate attraverso
thunk di forwarding / stub PLT (i chiamanti reali vengono recuperati, quindi un import
raggiunto solo tramite stub non viene perso); e — a meno che
vulnfanatic.scanIndirectCalls sia disattivata — chiamate indirette inviate attraverso un
puntatore a funzione o vtable che Binary Ninja ha risolto a una funzione pericolosa.
Per ogni punto di chiamata costruisce un contesto interprocedurale, incentrato sul decompilatore,
limitato a un budget di token (default 100k):
__*_chk e quelle con controllo dei limiti *_s hanno argomenti iniziali
aggiuntivi, spostando la posizione di formato/dimensione/destinazione,s->buf
si risolve nella dimensione reale dell'array del campo piuttosto che nella dimensione del puntatore di s;
anche le definizioni di struct nella sezione dei tipi riportano le dimensioni in byte per campo,0x40
o limitata a [0, 0xff]), che il modello usa come riferimento reale quando confronta una
dimensione con la capacità di un buffer invece di fare supposizioni,vulnfanatic.includeStackLayout),if/loop/switch che proteggono la chiamata),MAIN→ABCD→strcpy, anche le funzioni che MAIN e ABCD chiamano altrove), poiché
potrebbero contenere i controlli di limiti/validazione che condizionano il valore pericoloso
(vulnfanatic.includeCallPathSiblings, riempito finché il budget lo consente), erecv/read/getenv chiamate
nella stessa funzione).Questo contesto, insieme a un prompt specifico per la regola, viene inviato al modello, che restituisce un verdetto strutturato. I non-problemi vengono scartati. I prompt sono ottimizzati per un modello di codice locale potente (ad es. Qwen2.5-Coder) e gli chiedono di analizzare l'intero flusso e di emettere solo JSON.
Al modello viene chiesto di privilegiare il recall — segnalare problemi plausibili e rilevanti per la sicurezza ed esprimere l'incertezza attraverso una Confidence piuttosto che scartare ciò che non può dimostrare completamente. Mostra il suo lavoro in uno scratchpad che cita i frammenti di codice verbatim su cui si è basato (la sorgente di input, ogni guardia, la dimensione/lunghezza, il tipo rilevante e il sink), che viene salvato sulla segnalazione così puoi verificare il ragionamento.
Ogni segnalazione ha una Confidence (alta/media/bassa): alta = l'intera catena è mostrata
nel contesto; media = probabile, con uno o due collegamenti dedotti; bassa = una pista
che merita una revisione manuale. Questa è la metrica principale (la stima della severità del modello è
un campo secondario). Imposta vulnfanatic.minConfidence per scartare tutto ciò che è sotto una soglia.
Per impostazione predefinita VulnFanatic-NG privilegia il recall (trovare i problemi reali). Se ricevi troppi falsi positivi, puoi stringere con una delle seguenti opzioni: