Корпус — 600 реальных файлов из CVEfixes, базы исправлений опубликованных уязвимостей (CVE). Для каждой уязвимости взяты две версии одного файла: до исправления (уязвимая, инструмент должен её найти) и после исправления (безопасная, находок быть не должно). Так проверяется и полнота поиска, и число ложных срабатываний.
Гибрид «сканеры SecureCode + DeepSeek» находит больше уязвимостей, чем любая конфигурация по отдельности: recall 35,8% против 34,3% у Semgrep. На отложенной выборке разница составляет 32,8% против 32,5%, 95% доверительный интервал от −8,9 до +10,0 п.п. включает ноль. Гибрид на уровне Semgrep, статистически значимого превосходства нет.
Precision всех конфигураций около 50%: исправление обычно меняет несколько строк, а остальной код файла совпадает, поэтому детектор часто срабатывает и на исправленную версию. Для такого корпуса это ожидаемо и одинаково для всех инструментов, включая Semgrep.
semgrep/semgrep-rules.| Конфигурация | Precision | Recall | F1 | Проанализировано |
|---|---|---|---|---|
| Сканеры SecureCode | 49,0% | 25,7% | 33,7% | 84,7% |
| DeepSeek, прямая классификация | 50,5% | 16,8% | 25,2% | 100% |
| DeepSeek, one-shot | 52,0% | 22,7% | 31,6% | 100% |
| Гибрид: сканеры + DeepSeek | 49,9% | 35,8% | 41,7% | 84,7% |
| Semgrep 1.177.0 | 50,0% | 34,3% | 40,7% | 100% |
«Проанализировано» — доля файлов, которые сканеры смогли разобрать. Оставшиеся 92 файла (код на Python 2, фрагменты JS) учтены как непроверенные, а не как «чистые».
| Язык | Конфигурация | Precision | Recall | F1 |
|---|---|---|---|---|
| Python | Гибрид | 48,4% | 50,0% | 49,2% |
| Python | Semgrep | 50,0% | 45,0% | 47,4% |
| JavaScript/TypeScript | Гибрид | 49,2% | 25,8% | 33,9% |
| JavaScript/TypeScript | Semgrep | 48,1% | 32,5% | 38,8% |
| Go | Гибрид | 52,9% | 22,5% | 31,6% |
| Go | Semgrep | 53,3% | 20,0% | 29,1% |
Гибрид лучше Semgrep на Python и Go и уступает на JavaScript/TypeScript.
Исправление сравнения узлов синтаксического дерева и ошибок в Go-сканерах подняло recall сканеров с 19,7% до 25,7%, а число файлов, которые не удавалось проанализировать, сократилось с 253 до 92.
На демонстрационном файле с SQL-инъекцией Аудитор на локальной модели Qwen 2.5 Coder 7B (Q4_K_M, Ollama) нашёл уязвимость CWE-89 в той же строке, что и детерминированный сканер. Архитектор предложил параметризованный запрос, патч прошёл разбор и повторное сканирование во временной копии. Тот же сценарий на DeepSeek дал такой же результат за $0,00014.
Подробные таблицы по языкам и CWE, хеши и команды воспроизведения — в репозитории.