
Плагин BianryNinja для выявления уязвимостей в декомпилированных бинарных файлах, сочетающий программные проверки и поддержку LLM.
LLM-assisted vulnerability research for Binary Ninja.
VulnFanatic-NG добавляет боковую панель, которая сканирует текущий бинарный файл и спрашивает LLM — по умолчанию локально размещённую модель, совместимую с OpenAI, или Anthropic Claude, Google Gemini, либо Azure OpenAI (см. Бэкенды LLM) — является ли подозрительный код действительно уязвимым. Она работает в основном с выходом декомпилятора (HLIL) Binary Ninja, переходя к ассемблеру при необходимости, и сообщает только о подтверждённых проблемах с кликабельными ссылками на код.
Сканирование выполняется максимум в три фазы (фаза 3 — опциональная и только онлайн):
Находит места вызовов опасных функций, определённых в
rules/phase1_rules.json: strcpy,
memcpy, sprintf/строки формата, system, alloca, scanf, API команд/exec,
слабый ГПСЧ, семейство free/delete (use-after-free / double-free),
чтение недоверенных входных данных в буферы фиксированного размера (recv/read/fread/ReadFile),
SQL-инъекции (sqlite3_exec/mysql_query/PQexec), отключённую проверку сертификатов TLS (SSL_CTX_set_verify/curl), SSRF и некорректное управление привилегиями (setuid/setresgid), семейство memset/bzero и
сравнения с длиной, контролируемой атакующим (memcmp/strncmp →
обход аутентификации) для C/C++, Win32 и (в лучшем случае) Rust FFI. Покрытие
включает укреплённые варианты _chk (FORTIFY) and Annex-K _s variants. Ограниченные
функции форматированного вывода (snprintf и варианты) имеют собственное правило
безопасности по умолчанию, так что корректный аргумент размера не сообщается как переполнение. Места вызовов находятся тремя способами: прямые вызовы именованных символов; вызовы через пересылающие заглушки / PLT-стабы (реальные вызывающие восстанавливаются, поэтому импорт, доступный только через стаб, не пропускается); и — если
vulnfanatic.scanIndirectCalls не выключен — косвенные вызовы через
указатель на функцию или vtable, которые Binary Ninja сопоставил с опасной функцией.
Для каждого места вызова он строит межпроцедурный, ориентированный на декомпилятор контекст,
в пределах лимита токенов (по умолчанию 100k):
__*_chk и проверяющие границы *_s принимают дополнительные ведущие
аргументы, сдвигая позицию формата/размера/назначения,s->buf,
разрешается в реальный размер массива поля, а не в размер указателя s;
определения структур в разделе типов также содержат размеры полей в байтах,0x40
или ограниченная [0, 0xff]), которые модель использует как эталон при сравнении
размера с ёмкостью буфера вместо догадок,vulnfanatic.includeStackLayout),if/циклов/switch, защищающие вызов),MAIN→ABCD→strcpy также функции, которые MAIN и ABCD вызывают в других местах),
поскольку в них могут находиться проверки границ/валидации, управляющие опасным значением
(vulnfanatic.includeCallPathSiblings, заполняется, пока позволяет бюджет), иrecv/read/getenv, вызываемые в той же функции).Этот контекст вместе со специальным для правила запросом отправляется модели, которая возвращает структурированный вердикт. Не-проблемы отбрасываются. Запросы настроены на сильную локальную модель кода (например, Qwen2.5-Coder) и предписывают ей проанализировать весь поток и выдать только JSON.
Модели предписано отдавать предпочтение полноте (recall) — сообщать о правдоподобных, значимых для безопасности проблемах и выражать неуверенность через Confidence, а не отбрасывать то, что она не может полностью доказать. Она показывает свою работу в черновике (scratchpad), который цитирует дословные фрагменты кода, на которые она опиралась (исходный источник, каждую защиту, размер/длину, соответствующий тип и приёмник), и который сохраняется в находке, чтобы вы могли проверить рассуждения.
Каждая находка несёт Confidence (high/medium/low): high = вся цепочка показана в
контексте; medium = вероятно, с одной-двумя предполагаемыми связями; low = зацепка, заслуживающая
ручной проверки. Это главный показатель (оценка серьёзности модели — вторичное поле).
Установите vulnfanatic.minConfidence, чтобы отбрасывать всё ниже порога.
По умолчанию VulnFanatic-NG отдаёт предпочтение полноте (выявлению реальных проблем). Если ложных срабатываний слишком много, ужесточите настройки любым из способов: