
Plugin de BianryNinja para identificar vulnerabilidades en binarios descompilados con escaneos programáticos y soporte de LLM.
Investigación de vulnerabilidades asistida por LLM para Binary Ninja.
VulnFanatic-NG añade un panel lateral que escanea el binario actual y pregunta a un LLM — un modelo alojado localmente compatible con OpenAI por defecto, o Anthropic Claude, Google Gemini, o Azure OpenAI (ver Backends de LLM) — para juzgar si el código sospechoso es realmente vulnerable. Funciona principalmente a partir de la salida del descompilador (HLIL) de Binary Ninja, recurriendo al ensamblador cuando es necesario, e informa solo problemas confirmados con referencias en las que se puede hacer clic hacia el código.
Un análisis se ejecuta en hasta tres fases (La Fase 3 es opcional y solo en línea):
Encuentra sitios de llamada de funciones peligrosas definidas en
rules/phase1_rules.json — strcpy,
memcpy, sprintf/cadenas de formato, system, alloca, scanf, APIs de
comando/ejecución, RNG débil, la familia free/delete (uso después de
liberación / doble liberación), lecturas de entrada no confiable en buffers
fijos (recv/read/fread/ReadFile), inyección SQL
(sqlite3_exec/mysql_query/PQexec), verificación de certificado TLS
deshabilitada (SSL_CTX_set_verify/curl), SSRF, y gestión de privilegios
inadecuada (setuid/setresgid), la familia memset/bzero, y
comparaciones con una longitud controlada por el atacante (memcmp/strncmp →
bypass de autenticación), en C/C++, Win32, y (con el mejor esfuerzo) Rust FFI.
Cobertura incluye variantes fortificadas _chk (FORTIFY) y con verificación de
límites _s (Anexo-K). Las funciones de salida con formato acotado (snprintf y
variantes) tienen su propia regla segura por defecto, por lo que un argumento de
tamaño correcto no se reporta como desbordamiento. Los sitios de llamada se
encuentran de tres maneras: llamadas directas a los símbolos nombrados; llamadas
enrutadas a través de stubs de reenvío / PLT (se recuperan los llamadores
reales, de modo que no se pierde una importación alcanzada solo a través de un
stub); y — a menos que vulnfanatic.scanIndirectCalls esté desactivado —
llamadas indirectas despachadas a través de un puntero a función o vtable que
Binary Ninja resolvió a una función peligrosa. Para cada sitio de llamada,
construye un contexto interprocedimental centrado en el descompilador, limitado
a un presupuesto de tokens (por defecto 100k):
__*_chk y con verificación
de límites *_s toman argumentos iniciales adicionales, desplazando la posición
del formato/tamaño/destino,s->buf se resuelva al tamaño real del array del campo
en lugar del tamaño del puntero de s; las definiciones de estructuras en la
sección de tipos también llevan tamaños en bytes por campo,0x40 o acotada a [0, 0xff]), que el modelo usa
como verdad fundamental al comparar un tamaño con la capacidad de un buffer en
lugar de adivinar,vulnfanatic.includeStackLayout),if/bucle/switch que protegen la
llamada),MAIN→ABCD→strcpy, también las funciones que MAIN y ABCD llaman
en otros lugares), ya que pueden contener las comprobaciones de límites/validación
que protegen el valor peligroso (vulnfanatic.includeCallPathSiblings, completado
mientras el presupuesto lo permita), yrecv/read/getenv
llamadas en la misma función).Ese contexto, junto con un prompt específico de la regla, se envía al modelo, que devuelve un veredicto estructurado. Los no-problemas se descartan. Los prompts están ajustados para un modelo de código local potente (por ejemplo, Qwen2.5-Coder) y le indican que analice todo el flujo y emita solo JSON.
Se le indica al modelo que favorezca el recuerdo — reporte problemas plausibles y relevantes para la seguridad y exprese incertidumbre a través de una Confianza en lugar de descartar cualquier cosa que no pueda probar completamente. Muestra su trabajo en un borrador que cita los fragmentos de código literales en los que se basó (la fuente de entrada, cada protección, el tamaño/longitud, el tipo relevante, y el sumidero), que se almacena en el hallazgo para que puedas auditar el razonamiento.
Cada hallazgo lleva una Confianza (alta/media/baja): alta = toda la cadena se
muestra en el contexto; media = probable, con uno o dos enlaces inferidos; baja = una
pista que merece revisión manual. Esta es la métrica principal (la estimación de
severidad del modelo es un campo secundario). Establece vulnfanatic.minConfidence
para descartar cualquier cosa por debajo de un umbral.
Por defecto VulnFanatic-NG favorece el recuerdo (detectar problemas reales). Si obtienes demasiados falsos positivos, ajústalo con cualquiera de: