Месяца три назад мне досталась задача: нужно было прошерстить небольшой проект на Python на предмет уязвимостей. Не гигантский монолит, но и не hello world — тысяч пять строк кода, несколько зависимостей, работа с базой данных и пара API-эндпоинтов. Сделать это руками я мог. Но честно — не хотелось. И я решил посмотреть, как далеко можно уехать с ИИ-инструментами, прежде чем всё-таки придётся думать самому.
Спойлер: уехал довольно далеко. Но не без приключений.
Что вообще поддаётся автоматизации
Первым делом я попробовал статический анализ через Semgrep в паре с GPT-4. Semgrep сам по себе неплох: находит SQL-инъекции, небезопасные вызовы subprocess, хардкод паролей и прочие очевидные грехи. Проблема в другом — он плохо понимает контекст. Видит паттерн, кричит об уязвимости, а ты смотришь и понимаешь: ну да, выглядит страшно, но входные данные там проверяются тремя строками выше.
Я стал скармливать эти отчёты GPT-4 с просьбой разобрать каждый флаг в контексте конкретного файла. Тут началось что-то интересное. Модель довольно уверенно отделяла ложные срабатывания от настоящих. Не всегда — но раза в два быстрее, чем я бы делал это сам. Час работы руками превратился в двадцать минут с моделью.
Второй слой — зависимости. pip-audit и Safety находят CVE в библиотеках за секунды, это вообще не вопрос. Я просто встроил эти проверки в CI и забыл. Если что-то появляется — получаю уведомление. ИИ здесь не нужен, честно говоря.
Где ИИ реально помог
Самое неожиданное для меня — анализ логики авторизации. Я дал GPT-4o кусок кода с роутами Flask и попросил найти места, где авторизация либо отсутствует, либо выглядит подозрительно. Модель нашла один роут, который я сам пропустил: декоратор @login_required стоял, но на самом деле он был переопределён в другом месте и по факту ничего не проверял. Ошибка тупая, классическая — и я бы её поймал, только если бы читал весь код подряд с карандашом в руке.
Ещё хорошо заходит генерация тест-кейсов для пограничных случаев. Описываешь функцию, которая принимает пользовательский ввод, просишь придумать сценарии для фаззинга — и получаешь список того, что стоит проверить руками или автоматизированными тестами. Не все сценарии умные, но среди них обычно есть два-три, до которых я бы дошёл не сразу.
Документирование находок тоже ускорилось. Раньше я писал отчёт по итогу аудита — это муторно и скучно. Теперь я прохожу по уязвимостям, надиктовываю голосом (или пишу кратко в чат) что нашёл и почему это проблема, а модель собирает из этого нормально оформленный раздел отчёта с описанием риска и рекомендацией. Это не лень — это просто разумное использование времени.
Где я обжёгся
Я потратил, наверное, час, пытаясь заставить ИИ надёжно находить race condition. Описывал паттерн, давал примеры, менял промпты — модель каждый раз уверенно отвечала что-то правдоподобное, но ни разу не дала ответа, которому я мог бы доверять без перепроверки. Дело в том что race condition — это про рантайм-поведение, а не про статику кода, и никакой языковой модели здесь не хватит без специализированных инструментов.
Похожая история с криптографией. Спросить есть ли тут слабое место в схеме шифрования — модель ответит. Но я не могу проверить этот ответ без того, чтобы самому понимать тему. А если я сам понимаю — зачем мне модель? Тут ИИ скорее создаёт иллюзию проверки, чем реальную безопасность.
Ещё один тупик — большие кодовые базы. Когда файлов много и они зависят друг от друга, модели теряют нить. Я пробовал разные способы подавать контекст, использовал embeddings чтобы находить релевантные куски — частично работает, но это уже отдельная инженерная задача, не быстрое решение.
Что у меня получилось в итоге
Сейчас мой пайплайн выглядит примерно так. Semgrep и pip-audit работают в CI на каждый пуш — это фоновый шум, который иногда ловит реальные вещи. Когда нужно сделать нормальный аудит, я беру отчёт Semgrep, скармливаю его в GPT-4o с контекстом файлов, прошу отделить шум от сигнала. Потом руками смотрю логику авторизации и всё, что связано с вводом данных — тут без глаз не обойтись. На выходе модель помогает оформить отчёт.
Это не ИИ делает аудит вместо меня. Точнее, ИИ делает скучную часть работы, пока я занимаюсь интересной. Разница важная. Если думать что модель заменяет эксперта — будут неприятные сюрпризы.
Стоит ли вообще этим заниматься
По времени: примерно 40% рутинной работы ушло. Это честная цифра для небольших проектов. На чём-то большом или со сложной архитектурой — меньше, потому что контекст не влезает и нужно больше ручной навигации.
Главное, что я понял за эти три месяца: ИИ хорош в том, чтобы ничего не пропустить из известного. Хардкод паролей, очевидные SQL-инъекции, кривая авторизация по паттерну — это он ловит нормально. С другой стороны, найти что-то нестандартное, понять бизнес-логику и почему конкретный флоу опасен именно в этом продукте — это всё ещё моя работа.
Что меня занимает сейчас: насколько далеко можно зайти с агентными системами, которые сами бегают по коду, сами запускают инструменты и возвращают уже структурированный результат. Пробовал пару прототипов — пока сыро, но направление рабочее. Напишу отдельно, когда будет что-то конкретное.
