Как нейросеть дает ложные срабатывания
Нейросеть, которая ищет уязвимости в коде, часто кричит «пожар» там, где горит только лампочка кофемашины: тысячи ложных срабатываний хоронят настоящие проблемы под шумом, и опыт «Ростелекома» показывает, как локальная языковая модель берёт этот шум на себя.

Статический анализ кода (SAST) в крупных компаниях генерирует тысячи оповещений, большинство из которых ложные. Инженеры тратят часы на ручную сортировку вместо реальной защиты. Метод, описанный AppSec-инженером «Ростелекома» Юрием Тумановым, позволяет передать первичный отсев локальной языковой модели и оставить человеку только проверяемые находки.
Юрий Туманов, AppSec-инженер блока информационной безопасности «Ростелекома», опубликовал на Хабре подробный отчёт о том, как он запускал инференс (вычисление ответа моделью) на локальных LLM (больших языковых моделях, таких как ChatGPT, только развёрнутых на своём железе) для фильтрации потока SAST-срабатываний. Ключевое слово здесь «локальных»: код, пути файлов и внутренняя логика не уходят ни в какой внешний API. Эксперимент вдохновлён подходом ZeroFalse и проверялся на реальном корпусе, а не на синтетическом бенчмарке.
Почему false positive нейросети опаснее, чем кажется?
SAST (Static Application Security Testing, автоматический поиск уязвимостей в исходном коде) работает как нервный сторож: слышит каждый шорох, но регулярно принимает кофейный автомат за нарушителя. Сканер видит строку TOKEN = "***" и поднимает тревогу, хотя это может быть шаблонная заглушка.
Проблема не в самом сканере, а в масштабе. В крупном корпоративном контуре таких срабатываний тысячи. Каждое формально требует решения: подтвердить, отклонить, уточнить, передать коллеге.
False positive нейросети (ложное срабатывание, когда система ошибочно считает безопасный фрагмент угрозой) разрушает доверие. Если разработчик десять раз подряд открывает находку и видит ерунду, на одиннадцатый он закрывает не читая. Иногда он прав. Иногда нет. Так безопасность превращается в лотерею.
Что понадобится
- Модель: Qwen2.5-Coder-14B в квантизации AWQ (открытые веса, то есть модель можно скачать и запустить у себя без подписки)
- Сервер инференса: vLLM (опенсорсный движок для запуска языковых моделей)
- Железо: видеокарта с 16 ГБ видеопамяти (в эксперименте использовалась RTX 4080)
- Изолированная среда: закрытый контур без доступа к внешним API, потому что в пакет попадают фрагменты исходников, пути файлов и служебные значения
- Корпус SAST-срабатываний: выгрузка из вашего статического анализатора в формате, который можно разобрать скриптом
- Время на разметку: ручная разметка эталонных решений для калибровки промптов
Пошаговая инструкция
-
Разверните vLLM с выбранной моделью на локальном сервере. Никакого облака: данные триажа содержат фрагменты кода, имена переменных, конфигурацию. Внешняя модель может быть мощнее, но для закрытого контура она непригодна.
-
Превратите каждое SAST-срабатывание в «пакет улик» (evidence package). Не отдавайте модели сырой текст находки. Соберите структурированный набор:
- CWE (идентификатор типа уязвимости)
- правило сканера (rule)
- подозрительное значение
- source (откуда данные приходят) и sink (куда попадают)
- trace (путь данных через код)
- sanitizer (функция очистки) или его отсутствие
- контекст кода вокруг срабатывания
- признаки «шумных зон»: тесты, примеры, сгенерированный код
-
история похожих решений
-
Напишите системный промпт (system prompt, инструкция, которая задаёт модели рамки поведения) с жёсткими ограничениями. Модель должна получить не открытый вопрос «это уязвимость или нет?», а закрытое задание:
Вот CWE. Вот rule. Вот trace. Вот контекст.
Допустимые вердикты: CONFIRM / FALSE_POSITIVE / NEEDS_HUMAN.
Если данных недостаточно — обязана вернуть NEEDS_HUMAN.
Ответ строго в JSON по схеме: {verdict, evidence, confidence, cwe_check}.
-
Запретите модели «думать вслух». Без evidence package модель превращается в гадалку с уверенным голосом: красиво объяснит то, чего нет, увидит секрет в случайном UUID, закроет боевой ключ как тестовый. Галлюцинация (когда модель уверенно выдумывает несуществующие факты) при триаже безопасности это не курьёз, а пропущенная уязвимость.
-
Прогоните размеченный корпус через модель и сравните с ручными решениями. Калибруйте промпты итеративно: где модель ошибается, добавляйте уточнения в evidence package или ужесточайте условия для вердикта NEEDS_HUMAN.
-
Встройте проверенный конвейер в CI/CD-пайплайн. Модель берёт на себя первичный отсев, а человек получает только те находки, где есть проверяемые признаки: CWE, trace, контекст кода и строгий JSON на выходе.
Обезличенная карточка одного SAST-срабатывания из отчёта Туманова:
finding_id: ******
rule: Hardcoded Credentials (secret-scan)
cwe: CWE-798
severity: High
status: To Verify
path: src/main/**/AppConfig.java : 42
match: private static final String TOKEN = "****************"
trace: source → assignment → (sink not in payload)
Сканер увидел присваивание строки переменной с именем TOKEN и поднял тревогу. По одной строке не понять, реальный это ключ или плейсхолдер из шаблона. Таких строк тысячи. Модель, получив evidence package с контекстом кода, историей похожих решений и информацией о «шумной зоне» (тестовый модуль), возвращает вердикт FALSE_POSITIVE с указанием конкретных признаков, а не просто «мне кажется, это не опасно».
Открытый вопрос вместо клетки из улик. Промпт «Вот finding. Это уязвимость или false positive?» превращает модель в генератор правдоподобных, но непроверяемых ответов. Без структурированного evidence package любой вердикт это гадание.
Доверие к уверенному тону. Модель не знает ваш проект целиком. Она не видит весь поток данных, если вы ей его не передали. Она охотно заполняет пустоты правдоподобным текстом. Уверенность формулировки не равна точности.
Отправка кода во внешний API. Фрагменты исходников, пути файлов, имена переменных, куски бизнес-логики не должны покидать периметр. Именно поэтому Туманов использовал локальную модель на своём железе.
Ожидание полной автоматизации. Модель не заменяет AppSec-инженера. Она снимает рутину первичной сортировки. Итоговое решение по спорным находкам остаётся за человеком, и это не компромисс, а архитектурное требование.
Что делать с этим прямо сейчас, по ролям
Автору Дзена, который пишет про технологии. Тема false positive нейросети даёт понятный сюжет для разбора: нейросеть не «решает» и не «думает», а проверяет ограниченный набор признаков по жёстким правилам. Это хороший каркас для статьи о границах ИИ, которая не скатывается ни в восторг, ни в страшилку.
Маркетологу и руководителю. Если в вашей компании есть команда разработки и процесс проверки кода, спросите, сколько часов в неделю уходит на ручной триаж. Подход с локальной моделью не требует облачной подписки и не отправляет данные наружу.
Предпринимателю в РФ. Модель Qwen2.5-Coder с открытыми весами (open weights, можно скачать и запустить без ограничений) доступна для скачивания, vLLM тоже опенсорсный. Из российских инструментов для статического анализа работают Solar appScreener и PT Application Inspector, к их выгрузкам можно применить тот же конвейер.
Подход Туманова ценен не моделью и не железом, а архитектурой ограничений. Модель посажена в «клетку из улик»: она не рассуждает свободно, а проверяет конкретные признаки и обязана отказаться от решения, если данных мало. Это применимо далеко за пределами безопасности. Любой, кто использует LLM для классификации (фильтрация комментариев, сортировка заявок, модерация контента), получит лучший результат, если перестанет задавать открытые вопросы и начнёт собирать evidence package.
Честная оговорка: все числа из отчёта получены на конкретном корпусе, конкретной модели и конкретном наборе промптов. Это не универсальный бенчмарк, а документация одного эксперимента. На вашем коде и вашем сканере результаты будут другими.
Попробуйте AI-ассистент dzen.guru
Если вы пишете о технологиях и хотите структурировать материал так, чтобы каждый абзац нёс факт или пользу, протестируйте наш инструмент для авторов.
ПопробоватьПринцип, который стоит забрать из этого эксперимента, укладывается в одну фразу Туманова: вопрос к модели должен звучать не «что ты думаешь?», а «вот улики, вот правила, вот допустимые вердикты, вот формат ответа, вот условия, при которых ты обязана отказаться от решения». Кто выстроит такую клетку, получит помощника. Кто не выстроит, получит генератор уверенных галлюцинаций.

Основатель dzen.guru. Эксперт по монетизации и продвижению на Дзен. Автор курса «Старт на Дзен 2026».
Читайте также

Structured outputs в OpenAI API: 5 сценариев, когда гарантия формата молча ломается
Компания OpenAI ещё в августе 2024 года добавила в API так называемый strict-режим для структурированных выходов (structured outputs), и за полтора года он…

ИИ-агенты это не ускорение, если нет процесса: пилот Авито на 100 инженерах не показал роста
Мультимодальные ИИ-агенты (ИИ-агенты это программы, которые сами выполняют задачи инженера: создают файлы, редактируют код, запускают команды) обещают ускорить…

Семантический поиск без GPU и облака: «Первая Форма» уложила конвейер в 1,3 секунды на CPU
Семантический поиск (способность системы находить документы по смыслу, а не по точному совпадению слов) обычно требует облака, видеокарт и отдельных баз…
Комментарии