ИИ ищет уязвимости в коде: я собрал свой инструмент и проверил его на 36 реальных CVE
Проверка кода на безопасность устроена скучно и дорого. Специалист берёт стандарт (у крупной компании это десятки страниц требований), берёт репозиторий и неделями сверяет одно с другим: здесь проверяется ли доступ, там не утекают ли ключи, вот тут не собирается ли SQL-запрос из пользовательского ввода. Потом код меняется, и половину работы надо делать заново.
Когда появились ИИ-агенты вроде Claude Code, я, как и многие, попробовал отдать эту работу им. Попросил «проверь модуль на уязвимости» и получил отчёт, который выглядел убедительно. А на следующий день, на тот же вопрос, получил другой отчёт. Какие требования агент проверил, а какие пропустил, понять было нельзя. Хранить результат негде, сравнить с прошлой проверкой нечем.
Чего не хватало
Агент умеет читать код и рассуждать, но у него нет того, что есть у живого аудитора:
- списка требований, по которому идёт проверка;
- карты, где у приложения входы снаружи и кто их охраняет;
- отчётов классических сканеров, которые компании и так запускают;
- памяти о прошлых проверках, о ложных тревогах и о том, что уже исправлено.
Обычные сканеры кода, наоборот, всё помнят и работают одинаково, но не понимают контекст. Они выдают сотни предупреждений, и разбирать их приходится человеку.
Готового инструмента, который соединяет одно с другим, я не нашёл. Поэтому сделал свой и назвал aiegis.
Как это выглядит
aiegis это приложение для компьютера (macOS, Windows, Linux) и сервер для Linux. Своей нейросети в нём нет: он запускает Claude Code или открытый агент pi, который уже стоит у вас, и даёт ему доступ к данным проекта.
Главный экран это таблица. По строкам требования из ваших документов, по столбцам части проекта. В каждой клетке агент ставит вердикт: «соответствует», «нашёл проблему», «нужен человек» или «к этой части не относится». К каждому вердикту приложены ссылки на конкретные файлы, и он привязан к версии кода. Если файлы потом поменялись, клетка помечается как устаревшая, и перепроверять нужно только её.
Несколько вещей я запретил агенту на уровне программы, а не просьбой в тексте, потому что просьбы он выполняет через раз:
- Сказать «всё в порядке» без ссылок на код нельзя. Обоснование «сканеры ничего не нашли» тоже не принимается.
- Закрыть найденную проблему или признать её ложной может только человек. ИИ лишь предлагает.
- Найденную проблему перепроверяет отдельная сессия, которая не видит рассуждений первой. Первая склонна защищать свой вывод, вторая нет.
Перед каждым запуском приложение показывает, сколько это будет стоить в токенах. На большом проекте одна кнопка легко стоит дороже, чем ожидаешь.
Сколько он находит на самом деле
Красивый интерфейс ничего не доказывает, поэтому я проверил aiegis на открытом наборе реальных уязвимостей в Java-проектах (CWE-Bench-Java). Взял 15 уязвимостей для основного замера и ещё 21 отложил для контроля, чтобы не подгонять настройки под результат.
Условия были жёсткие: код без тестов, без истории изменений и без любых подсказок. Агент получал только общее требование вроде «пути к файлам из запроса должны быть ограничены разрешённой папкой» и должен был сам найти, где оно нарушено.
Результаты:
- Нашёл уязвимость в нужном файле: Основной набор 57%; Контрольный набор 40%
- Ложные тревоги на исправленном коде: Основной набор 9%; Контрольный набор 11%
- Стоимость одной проверки: Основной набор около $0,22; Контрольный набор около $0,22
Три повтора дали одинаковый результат: если уязвимость находится, она находится каждый раз. Проверка исправлений тоже работает. На неисправленном коде агент 24 раза из 24 сказал «не исправлено», на исправленном 18 раз из 24 сказал «исправлено». Остальные шесть ответов пришлись на случаи, где рядом в том же файле осталась похожая проблема.
Чего я не ожидал: правки инструкций для агента не дали ничего. Я попробовал шесть вариантов, потратил на это около $40, и все варианты находят одни и те же 8 уязвимостей. Значит, улучшать результат придётся новыми возможностями, а не переписыванием промптов.
Честная оговорка: нейросеть могла видеть эти уязвимости при обучении, так что реальные цифры на вашем коде, скорее всего, будут ниже. Набор маленький, и одна уязвимость весит около 7 процентных пунктов.
Что дальше
Проект открытый, лицензия MIT, версия ранняя. Я делаю его один и ищу людей, которые готовы:
- запустить его на своём проекте и рассказать, что пошло не так;
- проверить сборки для Windows и Linux;
- попробовать его с другими моделями через агент pi;
- помочь кодом, переводами или документацией.
Код и сборки: github.com/seelentov/aiegis.