А сейчас я покажу, откуда на вайбкод готовилось нападение. DevSecOps.. DevSecOps. llm.. DevSecOps. llm. owasp.. DevSecOps. llm. owasp. ruvds_статьи.. DevSecOps. llm. owasp. ruvds_статьи. sast.. DevSecOps. llm. owasp. ruvds_статьи. sast. безопасность.. DevSecOps. llm. owasp. ruvds_статьи. sast. безопасность. безопасность веб-приложений.. DevSecOps. llm. owasp. ruvds_статьи. sast. безопасность. безопасность веб-приложений. Блог компании RUVDS.com.. DevSecOps. llm. owasp. ruvds_статьи. sast. безопасность. безопасность веб-приложений. Блог компании RUVDS.com. вайбкодинг.. DevSecOps. llm. owasp. ruvds_статьи. sast. безопасность. безопасность веб-приложений. Блог компании RUVDS.com. вайбкодинг. Веб-разработка.. DevSecOps. llm. owasp. ruvds_статьи. sast. безопасность. безопасность веб-приложений. Блог компании RUVDS.com. вайбкодинг. Веб-разработка. Информационная безопасность.. DevSecOps. llm. owasp. ruvds_статьи. sast. безопасность. безопасность веб-приложений. Блог компании RUVDS.com. вайбкодинг. Веб-разработка. Информационная безопасность. искусственный интеллект.. DevSecOps. llm. owasp. ruvds_статьи. sast. безопасность. безопасность веб-приложений. Блог компании RUVDS.com. вайбкодинг. Веб-разработка. Информационная безопасность. искусственный интеллект. Управление разработкой.. DevSecOps. llm. owasp. ruvds_статьи. sast. безопасность. безопасность веб-приложений. Блог компании RUVDS.com. вайбкодинг. Веб-разработка. Информационная безопасность. искусственный интеллект. Управление разработкой. уязвимости.. DevSecOps. llm. owasp. ruvds_статьи. sast. безопасность. безопасность веб-приложений. Блог компании RUVDS.com. вайбкодинг. Веб-разработка. Информационная безопасность. искусственный интеллект. Управление разработкой. уязвимости. уязвимости и их эксплуатация.
А сейчас я покажу, откуда на вайбкод готовилось нападение - 1

Часть 1 — С чего всё началось (и немного теории)

Введение

Вайбкод это круто, пока не открываешь первый отчёт сканера безопасности и не видишь 234 проблемы. В статье разберём, как выстроить пайплайн вокруг LLM-проекта: подключить SAST-инструменты, настроить Quality Gate как блокировщик деплоя и использовать модель для исправлений — не вместо инструментов, а поверх них. Покажу на реальном проекте с реальными цифрами. Будет полезно тем, кто активно использует LLM для написания кода, и специалистам в области appsec/devsecops.

Часть 1 — контекст, данные из отчёта DryRun Security и немного теории про DevSecOps.

Часть 2 — подключаем SonarCloud, настраиваем Quality Gate, интегрируем в CI/CD.

Часть 3 — первый скан реального проекта: 234 проблемы, как их разбирать и исправлять через Claude 4.6.

Часть 4 — добавляем Semgrep, смотрим, где инструменты расходятся и где ломается подход.

Начнём издалека, чтобы была понятна суть. В июле 2025 года инженер из команды Claude Code в Anthropic — Brian Cherny — написал в X следующее:

«Практически 100% нашего кода написано Claude Code + Opus 4.5. Лично для меня это уже 100% на протяжении двух с лишним месяцев — я даже не делаю правок вручную. Вчера я закрыл 22 пулл-реквеста, позавчера — 27, и каждый из них написан Claude полностью.» – Brian Cherny, @bcherny

Дальше он добавил: большинство индустрии придёт к похожей статистике в ближайшие месяцы. И что они уже используют claude -p на каждом PR для code review в свежем контексте, и т. д. — Claude может полноценно работать автономно. Но и сравнительно недавно, в марте 2026 года, компания DryRun Security опубликовала «The Agentic Coding Security Report» — небольшой, но очень показательный документ. Они взяли трёх кодинг-агентов — Claude (Sonnet 4.6), Codex (GPT 5.2) и Gemini (2.5 Pro) — и дали каждому одно и то же задание: написать два приложения с нуля, добавляя фичи через pull request’ы, как это делает реальная команда разработчиков. После каждого PR прогонялся сканер безопасности. Результаты оказались, мягко говоря, интересными. Согласно отчёту, 87% pull request’ов содержали хотя бы одну уязвимость и 143 проблемы безопасности суммарно в 38 сканах, а также другие проблемы безопасности. Выделили вот такой небольшой топик в таблицу повторяющихся проблем.

Класс уязвимости

Уровень

Кто допустил

Broken Access Control

Высокий

Все три агента

Hardcoded JWT secrets

Высокий

Все три агента

WebSocket Auth Bypass

Высокий

Все три агента

IDOR

Высокий

Все три агента

User Enumeration

Средний

Все три агента

XSS

Средний

Gemini + все в отдельных случаях

Race Conditions (TOCTOU)

Средний

Преимущественно Gemini

Что меня удивило: лучшие результаты показал Codex (я очень надеялся на Claude), но и у него остались незакрытые JWT-проблемы и отсутствие ревокации токенов.

Вывод из отчёта: LLM пишут код неплохо, но всё же стоит проверять его на безопасность и качество. Поэтому в этой статье мы поговорим о вайбкоде и его безопасности, как довести проект/код, сгенерированный моделью, до состояния, где он станет более качественным и безопасным, чем вообще без проверок :)

Приступим!

Чтобы прочувствовать тот «вайб» вайбкодера, нужно стать им. Но поскольку ещё и параллельно нужно решать проблемы, я их объединил, и так получилась идея создания Opensophy Hub — статической платформы для документации с набором Markdown-блоков, dev-панелью, интерактивными таблицами, UI-компонентами и live-редактором.

Небольшая теория

Просветимся немного в терминологию devsecops-процесса. Что такое Quality Gate и зачем он нужен? Если очень просто, это набор правил, которые код обязан пройти, прежде чем идти дальше по цепочке пайплайна.

Туда входит следующее:

  1. Покрытие тестами не ниже N%.

  2. Отсутствие новых уязвимостей.

  3. Никаких критичных code smell’ов.

  4. Приемлемая оценка надёжности (например, не ниже B).

В процессе разработки, поскольку проект open-source и хочется бесплатной проверки качества, выбираем облачный SAST-инструмент: SonarQube Cloud, который проверяет код на каждый push. Если Quality Gate не пройден, GitHub Actions останавливает процесс, и деплой просто не происходит, пока проблемы не исправлены.

Методы ИИ-интеграции в этом кейсе

Поскольку мы говорим о проекте, который в основном пишет LLM, мы должны избежать эффекта, когда одинаковая модель «пишет код = делает оценку», иначе услышите от модели: «ОЙ. А ОКАЗЫВАЕТСЯ ТЫ ТУТ ПРАВ И ТУТ РЕАЛЬНО УЯЗВИМОСТЬ. СОРИ». Поэтому можно пойти по такому подходу: Claude Sonnet 4.5 пишет код, а Claude Sonnet 4.6 исправляет уязвимость. Сейчас может появиться вопрос: «Так это же одинаковые модели, не?» Не совсем. Хоть и по отчёту от DryRun Security Claude не в «лучших» (а лучший там Codex), я предпочитаю всё же Claude и её свежие модели (в нашем случае Sonnet 4.5 и Sonnet 4.6 — это разные модели по качеству). И наверное, личная неприязнь к Codex — это то, что она делает много лишнего в процессе либо не слушает. Как пример: во время исправлений она зачем-то исправляет код там, где вообще не должна трогать! (Она мне так тёмную тему сделала почти синего цвета.) И ещё не любит писать код полностью, хотя получила полный доступ к информации о проекте, и т. д. У Claude таких проблем нет.

Важно: модель здесь не заменяет сами инструменты анализа, такие как SonarQube Cloud, — они остаются основными. Потому что инструмент даёт конкретику — где проблема, в какой строке, какого она типа и насколько критична. Модель уже работает поверх этого списка, а не пытается «на глаз» оценить код целиком. В этом и есть ключевой момент всего подхода.

Часть 2 – Подключение SonarQube Cloud и настройка Quality Gate

Наверное, избыточно рассказывать про то, как проходить регистрацию в SonarQube Cloud — мы перейдём сразу к делу. После регистрации проекта в SonarQube Cloud и первичного сканирования переходим в Administration -> Analysis method — там будут перечислены все доступные варианты интеграции: Automatic analysis, GitHub Actions, CircleCI, Manual.

Для каждого из этих вариантов SonarQube Cloud предоставляет готовые инструкции прямо в интерфейсе — Administration -> Analysis method. После выбора нужного метода там будет пошаговый гайд с конкретными командами и конфигурационными файлами под ваш стек.

Текст

Вот тут настройки выбора анализа.

Для проекта я выбрал автоматический анализ. На первый взгляд может показаться, что GitHub Actions — очевидный выбор: больше контроля, явная интеграция в пайплайн. Но для большинства проектов, особенно на старте, автоматический анализ предпочтительнее, и всё дело в простой настройке. «Нажал — и всё готово». Прям vibestyle!

GitHub Actions имеет смысл, если вам нужно жёстко заблокировать деплой при непрохождении Quality Gate. Automatic analysis работает асинхронно: SonarQube Cloud анализирует код и сообщает результат, но не может остановить уже запущенный деплой. Если между пушем и завершением анализа проходит хотя бы минута — деплой уйдёт вперёд. А с GitHub Actions можно выстроить цепочку, которая блокирует деплой: push -> sonarqube job -> build -> deploy, где build не запустится, пока sonarqube не завершится с успехом.

Если Quality Gate не прошёл, в логах GitHub Actions появится примерно следующее:

ERROR QUALITY GATE STATUS: FAILED
Error: Action failed: The process '...sonar-scanner' failed with exit code 3

И ссылка на дашборд SonarQube Cloud с конкретными проблемами.

Текст

Демонстрация работы Quality Gate (не прошёл качество кода)

Настройка Quality Gate в SonarQube Cloud

По умолчанию SonarQube Cloud применяет Sonar way — стандартный Quality Gate. Для большинства проектов он вполне адекватен. Посмотреть и кастомизировать его можно в Policies -> Quality Gates.

Стандартные условия Sonar way для нового кода:

Метрика

Порог

Security Rating

A

Reliability Rating

A

Maintainability Rating

A

Coverage

≥ 80%

Duplicated Lines

≤ 3%

Для вайбкод-проекта первичная проверка может показать от 50 до 200+ проблем. Поэтому готовьтесь к марафону на пару часов, где, например, Coverage сразу убьёт Quality Gate. Его, конечно, на первое время можно убрать и оставить Security и Reliability Rating на уровне A — это разумная планка для любого проекта. Затем можно уже подключать условие по Coverage, но это по вашему усмотрению.

В дальнейшем мы расширим SAST-инструменты, показав проблему такого процесса, когда LLM полностью работает с отчётами. В рекомендации ещё для полноценной проверки можно добавить инструменты SCA (Snyk или GitHub Dependabot) и DAST (HostedScan) — примеры в скобках имеют бесплатные тарифы.

Часть 3 — Реальная проверка кода Hub, отчёты, исправления через Claude 4.6

Итак. Допустим, ваш проект уже готов к релизу, SonarQube Cloud подключён, и вы только что посмотрели на результаты первого анализа:

Текст

234 проблемы в коде!!

Жёсткий stonks, да? Это результат для проекта, когда впервые запускаешь анализ после долгой разработки (это прям база базовая, поэтому не страшитесь). Если смотреть на факты: большинство из этих 234 проблем — code smell’ы. Явные баги в проекте сравнительно редкие, но качество кода страдает именно из-за них и возможных мест, где требуется рефакторинг по мнению анализа. Поэтому нужно знать, что здесь написано в файле, иначе, если понимаем не до конца, что именно модель сгенерировала в конкретном месте, можем задеть важную часть системы/функции и т. п.

Пример, как можно устранить проблемы

Работать с проблемами и устранять их можно через любой интерфейс — IDE, API, CLI. Лично мне удобнее веб-версия Claude: можно одновременно видеть ход рассуждений модели, прикладывать скриншоты и сразу получать готовый файл. К тому же базовый план бесплатный.

Шаг 1. Пишем промпт

SonarQube Cloud сообщает о проблемах в коде. Проверь и полностью исправь файл. Твоя задача – сделать код максимально простым, читаемым и оптимизированным. При этом учитывай, что необходимо проверять предупреждения на ложные срабатывания (false positive).
Примечание: все комментарии должны быть на русском языке. Не добавляй лишние комментарии – только по функционалу. Никаких комментариев об исправлениях.

Почему такие требования к комментариям: если не указать явно, модель склонна добавлять пометки вида // FIX: исправлен nested ternary или // SONAR: S3358. Это мусор в коде — он иногда не несёт функциональной ценности и захламляет историю. К примеру, модель исправила код, но не до конца или сделала другие ошибки при изменении файла, из-за чего в нашем случае код будет ещё больше из-за комментариев = больше затрат токенов. Поэтому в идеале нужно давать файл/код с минимальными комментариями, которые прям нужны. Также стоит учесть, что LLM при исправлении может добавить NOSONAR-комментарий, из-за чего вероятно реальная проблема, например XSS, может оставаться в проекте.

Шаг 2. Код

Копируем содержимое файла/код, либо если у вас Claude подключён к GitHub — вставляем код с проблемами в чат через репозиторий. В моём случае файл был большой, и Claude автоматически переключает его в режим pasted — это нормально, контекст сохраняется.

Шаг 3. Скриншоты проблем

Переходим в SonarQube Cloud -> Issues или в Security Hotspots (если говорить по приоритету, то лучше решить сразу Security Hotspots), делаем скриншоты нужных проблем и прикладываем к сообщению:

Текст

Примерно получается так по шагам.

Важный момент: одна и та же проблема может встречаться в файле несколько раз. Например, Prefer globalThis over window у меня было 9 вхождений. Если все они видны на скриншоте — отлично. Если нет — возможно, стоит явно указать в промпте: «исправь все вхождения этой проблемы по всему файлу».

По этой же схеме проходим через Security Hotspots и остальные категории issues — делаем до тех пор, пока список не опустеет.

Текст

Спустя пару часов исправлений

В результате получаем код, который прошёл статический анализ и соответствует заданному Quality Gate. Это не значит, что он идеален, — но это значит, что он объективно лучше, чем до проверки.

Часть 4 – Внедряем дополнительные инструменты и разбираем их подводные камни

Допустим, предыдущие части пройдены: SonarQube Cloud подключён, CI/CD настроен, проблемы исправлены. Теперь усилим покрытие и добавим ещё один SAST-инструмент — Semgrep.

SonarQube Cloud хоть и покрывает многие проблемы, но всё же он ориентирован прежде всего на качество кода, тогда как для проверки безопасности предпочитают комбо инструментов. Второй инструмент для этого — Semgrep: он сфокусирован на поиске уязвимостей и больше на безопасность. При этом, как и SonarQube Cloud, он предоставляет бесплатный облачный тариф.

Регистрация и настройка Semgrep

Регистрация аналогична SonarQube Cloud. Подмечу только по интерфейсу: найденные проблемы отображаются в разделе Code, тогда как управление проектами и повторный запуск сканирований — в разделе Projects.

Запуск сканирований

В Semgrep доступно два режима анализа: стандартный (на основе правил) и «ИИ-режим». Поэтому в идеале запускаем оба режима — они могут выявить пересекающиеся, но не идентичные наборы проблем.

Текст

2 варианта скана

Сюрприз!

Здесь начинается главная проблема подхода. После того как SonarQube Cloud показал чистый результат, Semgrep обнаружил 25 проблем в тех же файлах.

Это демонстрирует, почему несколько сканеров дополняют друг друга: каждый инструмент работает по своему набору правил и эвристик, и зоны покрытия у них пересекаются лишь частично.

Текст

SonarQube Cloud чистый
Текст

Semgrep показывает 24 проблемы в проекте

Задача усложняется: нужно исправить то, что нашёл Semgrep, не сломав при этом то, что уже устроило SonarQube Cloud. Это принципиальный момент при работе с несколькими сканерами — исправление под один инструмент может вызвать новые предупреждения в другом.

Попытаемся дать эту таску Claude.

Текст

Выдаём задачу LLM-ке

Итог: модель возвращает исправленный файл. Коммитим, запускаем повторное сканирование и… ничего. Проблемы никуда не делись.

Это нередкая ситуация: Semgrep работает по строгим паттернам, и если исправление семантически корректно, но не соответствует ожидаемому паттерну правила — сканер по-прежнему будет его отмечать. В таких случаях стоит попробовать использовать встроенный ИИ-автофикс самого Semgrep, который сделает pull request нам в репо, и проблема снимется.

Автофикс через Semgrep

Чтобы Semgrep мог делать правки напрямую в репозиторий, нужно выдать ему права на read and write Content доступ к содержимому репозитория. После этого инструмент сам создаёт pull request с исправлениями — остаётся только проверить и смержить.

Текст

Автофикс с помощью ИИ-режима.

Подмечу как пример: в ходе работы через pull request была обнаружена одна некритичная проблема, которая при ближайшем рассмотрении оказалась false positive (коммит). Это тоже часть процесса: ни один сканер (пока что) не даёт нулевого уровня ложных срабатываний, и умение их идентифицировать — такой же навык, как и исправление реальных уязвимостей.

Это небольшое напоминание о том, что стоит следить за результатами сканов после каждого коммита от Semgrep и других инструментов, во время которых может сломаться функциональность или стать ещё хуже.

Итоги

Мы смогли сделать вайб-проект намного чище и безопаснее, чем до его проверки, прошли путь от «LLM написал код и задеплоил» до воспроизводимого пайплайна, где каждый коммит проходит через несколько слоёв проверки. Это:

  • снижает количество уязвимостей и code smell’ов;

  • даёт структурированный отчёт вместо абстрактного «код плохой»;

  • встраивается в пайплайн и работает автоматически на каждый коммит.

Но нет гарантий, что SAST-анализ ловит всё. Архитектурные проблемы вроде WebSocket Auth Bypass остаются за его пределами. И текущая схема, где агент генерирует -> инструмент анализирует -> агент исправляет, — не замена code review, а лишь бафф для проекта, где код пишет в основном LLM. И лучше иметь её, чем не иметь ничего.

Про проблемы:

  1. Галлюцинации при повторных исправлениях. Codex у меня не прижился, и тому есть конкретная причина. На третьей-четвёртой итерации он начинает чудить: уязвимость формально закрыта, но где-то в другом месте файла что-то изменилось. Однажды после его правок тёмная тема стала синей. Не тёмно-синей, а прям синей. Я потратил время, чтобы понять, откуда это вообще взялось. Поэтому для длинных сессий с большим количеством файлов — Codex мой личный антирекомендейшн. С Claude такого не было, хотя она тоже не святая: если контекст раздувается, модель может попросить скинуть код заново, иначе начнёт работать по памяти о диалоге, а не по реальному файлу.

  2. «А докажи». Бывает такая ситуация: пентестер говорит «вот уязвимость», модель говорит «это false positive». Кто прав? Разбираться можно долго. Самый быстрый способ закрыть вопрос — попросить пентестера показать воспроизводимый эксплойт. Обычно после этого дискуссия заканчивается сама. Если пентестера нет и вы работаете соло — просите модель показать хотя бы команды, которыми теоретически можно активировать уязвимость. Если она не может — возможно, и правда false positive.

  3. Человек в процессе всё ещё нужен. LLM декларирует уязвимость. Не доказывает её, не воспроизводит, не показывает реальный вектор атаки — просто говорит «вот проблема». Это не то же самое, что её реально найти. Поэтому если вы соло без бэкграунда в безопасности — стоит хотя бы базово разобраться в теме, чтобы не принимать вывод модели на веру там, где она может ошибаться.

Что ещё стоит попробовать:

Если есть подозрение, что с архитектурой что-то не так, — можно дать модели полный доступ к кодовой базе и попросить провести security review без привязки к конкретным файлам. Это работает, но готовьтесь к тому, что после такого анализа начнётся новый цикл правок, а значит, снова придётся запускать сканеры.

Из интересных связок, которые я не рассматривал подробно: CodeFactor + SonarQube Cloud. Они покрывают немного разные классы проблем, CodeFactor шумнее по false positive, но иногда ловит то, что SonarQube пропускает.

И последнее — почему только облако. Просто хотелось показать, что это доступно без сервера, без настройки инфраструктуры, бесплатно, прямо сейчас. Если проект попадает под бесплатные тарифы — это нулевой порог входа для нормального анализа.

© 2026 ООО «МТ ФИНАНС»

Автор: opensophy

Источник