Поиск уязвимостей в коде ClickHouse с помощью ИИ: опыт инженера без навыков ИБ
Прод ClickHouse не падал. Бэкенды не рушились. Но один бывший инженер из Akamai, который никогда не занимался ИБ, положил на стейдж несколько реальных уязвимостей в коде C++ этой базы — и получил за это деньги из баг-баунти программы.

Схема: один агент, руки, цепочка логов
Цветан Стойчев описывает подход без магии. Берём GitHub Copilot, Claude Opus или Gemini, садим агента смотреть свежий коммит в репозитории ClickHouse. Просим выдвинуть гипотезы: где в C++ может прятаться дырка? Агент генерирует список. Мы выбираем одну гипотезу и поручаем тому же агенту написать Python-скрипт, который попробует воспроизвести проблему на тестовом инстансе ClickHouse в Docker. Если результат выглядит убедительно — проверяем руками.
Ключевой вывод, который Стойчев выбил жирным: цепочки из нескольких агентов не работают. Один управляемый агент, за которым вы следите, — лучше, чем сложная автоматизация, где никто не понимает, что происходит.
Ловушка: галлюцинации и ложные срабатывания
Тут начинается самое интересное. Модели почти всегда возвращают красивые находки с пометками «высокая» и «критическая» опасность. Большинство из них — мусор. Выдумать CVE-подобную находку для LLM — пара секунд, а отличить настоящую от выдуманной можно только руками.
На подготовку одного честного отчёта Стойчев тратит от трёх до четырёх часов. Этот этап он принципиально не автоматизирует. И вот здесь парадокс: отсутствие опыта в ИБ оказалось плюсом. Там, где бывалый исследователь видит защиту и решает «тупик», новичок продолжает давить на агента вопросами «а почему?» и «а как иначе?». По словам Стойчева, пару раз именно это вывело на реальные баги — там, где эксперт бы остановился.
Практика: что делать, чтобы агент меньше врал
Стойчев делится конкретными приёмами. Все они сводятся к одному: ограничьте агенту видимость и не давайте ему ходить по кругу.
- Удаляйте из репозитория файлы с инструкциями для ИИ — вроде `.github/copilot-instructions.md`. Они написаны для разработчиков и сбивают агента с задачи поиска уязвимостей.
- Удаляйте папки с тестами, документацией и утилитами. Именно там агент чаще всего находил несуществующие проблемы.
- Ставьте локальные заплатки на уже найденные баги, иначе агент снова и снова «открывает» одну и ту же дырку.
- Следите за трюком, когда агент читает память чужого процесса через `/proc/[pid]/mem` и объявляет победу. На деле это обход границы безопасности, а не доказательство уязвимости.
- Если агент выдаёт код с ошибками — смените язык. Стойчев перешёл с Node.js на Python, и проблемы исчезли.
- Готовый отчёт прогоняйте через две модели. Opus и GPT замечают то, что упустила другая.
Отдельно Стойчев отмечает: ИИ радикально ускорил создание PoC. Раньше, чтобы разобрать незнакомый бинарный формат или собрать payload, ушли бы дни. Теперь модель делает это за минуты.
Контекст: тенденция, а не единичный случай
История Стойчева — не изолированный кейс. OpenAI запустила инициативу Patch the Planet совместно с Trail of Bits: ИИ ищет уязвимости в критических open-source проектах — Python, Go, cURL, Sigstore, NATS Server и других. По заявлению компании, в ходе пилотной работы найдены сотни проблем безопасности, десятки исправлений уже включены в проекты. Для анализа используют модели OpenAI и инструмент Codex Security, а инженеры Trail of Bits проверяют результаты и отсеивают ложные срабатывания.
Эксперты, которых цитирует ixbt, подчёркивают: скорость — главное преимущество, но роль специалистов не исчезает. Автоматически найденная уязвимость обязана пройти независимую проверку: подтверждение эксплуатируемости, фильтрация ложных срабатываний.
Что это значит на практике
Если у вас на проде крутится ClickHouse — это повод не паниковать, а проверить версию и посмотреть, не попали ли найденные дырки в ваш релиз. Если вы занимаетесь аудитом кода — пробуйте схему Стойчева: один агент, Docker, Python-скрипт, ручная проверка. Не тратьте время на мультиагентные пайплайны с оркестрацией: как показывает этот случай, они дают ложное чувство контроля.
А главное — не путайте скорость с надёжностью. LLM нашёл вам «критическую» уязвимость за три секунды? Отлично. Теперь сядьте и проверьте её руками. Три-четыре часа. Без вариантов. Костыли в виде «агент сам всё проверит» на проде не прокатывают.