
Plugin do BianryNinja para identificar vulnerabilidades em binários descompilados com varreduras programáticas e suporte a LLM.
Pesquisa de vulnerabilidades assistida por LLM para Binary Ninja.
VulnFanatic-NG adiciona um painel lateral que analisa o binário atual e pergunta a uma LLM — um modelo compatível com OpenAI hospedado localmente por padrão, ou Anthropic Claude, Google Gemini, ou Azure OpenAI (veja Backends LLM) — para julgar se um código suspeito é realmente vulnerável. Funciona principalmente a partir da saída do descompilador (HLIL) do Binary Ninja, recorrendo ao assembly quando necessário, e relata apenas problemas confirmados com referências clicáveis de volta ao código.
Uma varredura é executada em até três fases (Fase 3 é opcional e somente online):
Encontra locais de chamada de funções perigosas definidas em
rules/phase1_rules.json — strcpy,
memcpy, sprintf/strings de formato, system, alloca, scanf, APIs de comando/exec,
RNG fraco, a família free/delete (use-after-free / double-free),
leitura de entrada não confiável para buffers fixos (recv/read/fread/ReadFile),
injeção SQL (sqlite3_exec/mysql_query/PQexec), verificação de certificado TLS
desabilitada (SSL_CTX_set_verify/curl), SSRF, e gerenciamento inadequado
de privilégios (setuid/setresgid), a família memset/bzero, e
comparações com um comprimento controlado pelo atacante (memcmp/strncmp →
bypass de autenticação), em C/C++, Win32, e (melhor esforço) Rust FFI. A cobertura
inclui variantes fortificadas _chk (FORTIFY) e _s (Anexo-K). Funções de saída
formatada com limite (snprintf e variantes) têm sua própria regra segura padrão para que
um argumento de tamanho correto não seja relatado como estouro. Os locais de chamada são
encontrados de três maneiras: chamadas diretas para os símbolos nomeados; chamadas roteadas
através de thunks de encaminhamento / stubs PLT (os chamadores reais são recuperados,
para que uma importação alcançada apenas através de um stub não seja perdida); e — a menos
que vulnfanatic.scanIndirectCalls esteja desligado — chamadas indiretas despachadas através de um
ponteiro de função ou vtable que o Binary Ninja resolveu para uma função perigosa.
Para cada local de chamada, ele constrói um contexto interprocedural, centrado no descompilador,
orçado para um limite de tokens (padrão 100k):
__*_chk e *_s com verificação de limites recebem
argumentos iniciais extras, deslocando a posição do formato/tamanho/destino,s->buf
resolva para o tamanho real do array do campo em vez do tamanho do ponteiro de s;
definições de struct na seção de tipos também carregam tamanhos de campo em bytes,0x40
ou limitado a [0, 0xff]), que o modelo usa como verdade ao comparar um
tamanho com a capacidade do buffer em vez de adivinhar,vulnfanatic.includeStackLayout),if/loop/switch que protegem a chamada),MAIN→ABCD→strcpy, também as funções que MAIN e ABCD chamam em outros lugares), pois
podem conter as verificações de limites/validação que protegem o valor
perigoso (vulnfanatic.includeCallPathSiblings, preenchido enquanto o orçamento permitir), erecv/read/getenv chamadas na
mesma função).Esse contexto mais um prompt específico para a regra é enviado ao modelo, que retorna um veredito estruturado. Não-problemas são descartados. Os prompts são ajustados para um modelo de código local forte (por exemplo, Qwen2.5-Coder) e instruem o modelo a analisar todo o fluxo e emitir apenas JSON.
O modelo é instruído a favorecer recall — relatar problemas plausíveis e relevantes para segurança e expressar incerteza através de uma Confiança em vez de descartar algo que não pode provar completamente. Ele mostra seu trabalho em um rascunho que cita os trechos de código textuais nos quais se baseou (a fonte de entrada, cada guarda, o tamanho/comprimento, o tipo relevante e o sumidouro), que é armazenado no achado para que você possa auditar o raciocínio.
Cada achado carrega uma Confiança (alta/média/baixa): alta = toda a cadeia é mostrada
no contexto; média = provável, com um ou dois elos inferidos; baixa = uma pista que merece
revisão manual. Esta é a métrica principal (a estimativa de severidade do modelo é um
campo secundário). Defina vulnfanatic.minConfidence para descartar qualquer coisa abaixo de um limite.
Por padrão, o VulnFanatic-NG favorece recall (capturar problemas reais). Se obtiver muitos falsos positivos, restrinja com qualquer um destes: