Вайб-кодинг и риски безопасности: проанализировано 20 000 приложений

Содержание
  1. Создание 20 тысяч приложений с помощью вайб-кодинга
    1. Технологии, используемые в приложениях
    2. Примеры сгенерированных приложений
      1. ExpenseFlow: Трекер расходов, созданный с помощью claude-sonnet-4.5-604
      2. RestoOrder Pro: Приложение для онлайн-заказов, созданное с помощью gpt-5-511.
    3. Возможность скачать сгенерированные приложения для собственных исследований и тестирования
  2. Сканирование программ с помощью инструментов статического анализа
    1. 20 самых распространенных найденных уязвимостей
    2. Общий уровень безопасности программ на основе вайб-кодинга
  3. Выявление типичных проблем вайб-кодинга с помощью ручного тестирования
    1. Повторное использование жестко закодированных распространенных секретов
    2. 50 самых популярных секретов
    3. GPT-5
    4. Claude Sonnet 4.5
    5. Gemini 2.5 Pro
    6. Почему распространенные секреты могут привести к уязвимостям
    7. Пример атаки: Подделка JWT-токена с помощью предполагаемого секрета
    8. Повторное использование учетных данных
    9. 10 наиболее распространенных вариантов учетных данных
    10. Повторное использование распространенных API-интерфейсов
    11. 20 наиболее распространенных API-интерфейсов
  4. Новые проверки безопасности в Invicti DAST на наличие распространенных уязвимостей, связанных с вайб-кодингом
  5. Вывод: безопасность улучшается, но LLM имеют свои недостатки
    1. Запрос на бесплатное тестирование Invicti

Все больше разработчиков используют большие языковые модели (LLM) для создания кода для веб-приложений. Для анализа насколько безопасны такие приложения, команда Invicti (на основе Acunetix и Netsparker) создала большое количество сайтов исключительно с помощью разных LLM, а затем исследовала их безопасность с помощью ручного и автоматизированного тестирования.

Создание 20 тысяч приложений с помощью вайб-кодинга

Были использованы разные модели LLM, как gpt-5, claude-sonnet-4.5, gemini-2.5-pro, deepseek-chat-v3-0324, qwen3-max и другие. Это также включает некоторые меньшие модели, такие как gpt-5-mini, gpt-oss-120b, gemini-2.5-flash.

Для создания веб-приложений был использован API OpenRouter, который обеспечивает легкий доступ к нескольким LLM через один прикладной программный интерфейс. Чтобы убедиться, что программы достаточно разнообразны, был использован широкий спектр подсказок.

  • Применено много разных тем, фреймворков, технологий, требований и языков.
  • Параметры менялись, чтобы получить разные результаты от LLM.
  • Для архитектурного разнообразия некоторые программы это только REST/GraphQL API, другие являются полноценными приложениями с фронтендами и бекендами, некоторые монолитны, а другие базируются на микросервисах.
  • Большинство приложений контейнеризированы с помощью Docker и Docker Compose.

В конце концов, удалось сгенерировать 20 656 веб-приложений. Ниже можно увидеть распределение программ, сгенерированных каждой моделью LLM:

vibe coded applications by LLM

Технологии, используемые в приложениях

technologies used in vibecoded apps

Примеры сгенерированных приложений

ExpenseFlow: Трекер расходов, созданный с помощью claude-sonnet-4.5-604

Полнофункциональное приложение для отслеживания расходов, созданное с помощью Spring Boot, MySQL и Vue.js. Включает аутентификацию пользователей, административную панель, расширенные возможности поиска/фильтрации, документацию Swagger API и обратный прокси-сервер Nginx. Готовое к использованию контейнерное развертывание.

vibe coded expenceflow
RestoOrder Pro: Приложение для онлайн-заказов, созданное с помощью gpt-5-511.

Готовое к работе веб-приложение для онлайн-заказов в ресторанах, созданное с помощью Express (Node.js), React, PostgreSQL и Nginx. Технологии: Node.js, Express, PostgreSQL, JWT Auth с RBAC, React (Vite), Swagger/OpenAPI, Docker, Docker Compose, Nginx.

Возможность скачать сгенерированные приложения для собственных исследований и тестирования

Веб-приложения, созданные для этого анализа, можно скачать с Hugging Face по этой ссылке: harisec/vibe-coded-web-apps.

Сканирование программ с помощью инструментов статического анализа

Все сгенерированные веб-приложения были просканированы с помощью нескольких инструментов статического анализа (SAST) и был составлен список наиболее распространенных уязвимостей, найденных в программах.

20 самых распространенных найденных уязвимостей

УязвимостьЧастотаКоличество приложений
Отсутствует ограничение частоты запросов70541039
Утечка информации за исключением539174
Отображенный межсайтовый скриптинг на стороне сервера322226
Запрос в базу данных, построенный из источников, контролируемых пользователем24287
Использование сломанного или слабого криптографического алгоритма хеширования для конфиденциальных данных209170
Программа Flask работает в режиме дебага180178
Защита от CSRF не включена13794
Использование неконтролируемых данных в пути на ресурс8162
Защита от CSRF слабая или выключена7457
Запрос в базу данных, построенный из источников, контролируемых пользователем6123
Утечка информации через трассировку стека4631
Текст исключения, интерпретированный как HTML4418
Внедрение регулярного выражения (RegEx)2716
Включение функциональности из ненадежного источника2217
Хранение конфиденциальной информации в открытом тексте2116
Использование слабого хеша пароля1912
Неконтролируемые данные используются в выражении пути1810
SQL-запрос, построенный из источников, контролируемых пользователем1713
Логирование конфиденциальной информации в открытом тексте1514
Слабая конфигурация CORS1515

Большинство из них это ложноположительные результаты, но часть уязвимостей все равно присутствует.

Общий уровень безопасности программ на основе вайб-кодинга

По сравнению с некоторыми старыми ИИ-помощниками, код, сгенерированный современными LLM, сейчас гораздо лучше с точки зрения безопасности, особенно в более крупных моделях. Было найдено гораздо меньше случаев SQL-инъекций, XSS, обхода пути и других распространенных уязвимостей, чем ожидалось.

Выявление типичных проблем вайб-кодинга с помощью ручного тестирования

После запуска автоматизированного сканирования, специалисты вручную просмотрели результаты. Затем был проведен полный ручной анализ небольшого подмножества сгенерированных веб-приложений (несколько десятков) и были найдены некоторые повторяющиеся проблемы безопасности, которые, кажется, типичны для приложений, созданных с помощью вайб-кодинга. Они в большинстве своем связаны с использованием жестко закодированных секретов, распространенных учетных данных и конечных точек.

Повторное использование жестко закодированных распространенных секретов

Было обнаружено, что многие веб-приложения используют жестко закодированные секреты для подписей JWT, ключей API, паролей базы данных и другой конфиденциальной информации. Интересно, что каждая модель LLM, кажется, имеет свой собственный набор распространенных секретов, которые она повторно использует в разных сгенерированных приложениях.

Причина этого заключается в том, что LLM учатся на коде, содержащем много примеров жестко закодированных секретов. При генерации нового кода LLM склонны повторно использовать эти секреты из своих обучающих данных, вместо того чтобы генерировать новые.

Как ни странно, supersecretkey используется несколькими LLM в нескольких сгенерированных приложениях. Было обнаружено, что из 20 тысяч проанализированных приложений 1182 где-то использовали такой ключ.

Вот самые распространенные секреты, найденные в сгенерированных веб-приложениях:

50 самых популярных секретов

Значение секретаЕго частота
your-super-secret-jwt-key-change-in-production138
your-super-secret-jwt-key23
your-secret-key-here-change-in-production45
your-secret-key-here163
your-secret-key-change-in-production301
your-secret-key-change-in-prod20
your-secret-key178
your-production-secret-key-change-this75
your-production-secret-key16
your_super_secret_jwt_key32
your_secret_key_here139
your_secret_key25
your_jwt_secret_key_here74
your_jwt_secret_key47
your_jwt_secret_here67
verysecretkey24
supersecrettoken20
supersecretkeyforjwt32
supersecretkey12343
supersecretkey1182
supersecretjwtkey235
supersecretjwt69
supersecretchangeme20
supersecretchangeinprod20
supersecret_jwt_key_change_me26
supersecret_jwt_key27
supersecret_change_me29
supersecret570
super-secret-key-change-in-production19
super-secret-key179
super-secret-jwt-key-change-in-production34
super-secret-jwt-key72
super-secret27
super_secret_key34
secretpassword46
secretkey39
secret123211
secret-token39
secret_password24
secret_key34
secret661
production-secret-key-change-me17
mysecretpassword75
mysecretkey211
mysecret30
my-secret-key18
my_secret_key80
my_jwt_secret_key23
devsecret31
change_this_secret46

Самые распространенные секреты для каждой из 3 лучших моделей LLM:

GPT-5

Значение секретаЕго частота
supersecretjwt54
secret12330
devsecret19
supersecretjwtkey19
dev_super_secret_change_me11
supersecret_change_me11
supersecret_jwt_key_change_me9
dev_secret_change_me9
supersecret7
supersecretchangeme6

Claude Sonnet 4.5

Значение секретаЕго частота
your-secret-key-change-in-production149
change-this-secret-in-production12
dev-secret-key-change-in-production12
production-secret-key-change-me11
super-secret-jwt-key-change-in-production9
secret1237
docker-secret-key-change-in-production6
change-this-secret-in-production-please6
development-secret-key-change-in-production5
jwt-secret5

Gemini 2.5 Pro

Значение секретаЕго частота
a-very-secret-key-that-you-should-change11
supersecretkey11
a_very_secret_key_that_should_be_changed_in_production9
a-very-secret-key-that-should-be-changed-in-production8
secret1238
your-super-secret-key-that-is-long-and-secure8
supersecret7
a-very-strong-and-secret-key-for-jwt7
a-very-secret-key-that-should-be-changed7
your-super-secret-key-change-me

Почему распространенные секреты могут привести к уязвимостям

Использование жестко закодированных секретов может привести к серьезным проблемам безопасности, таким как несанкционированный доступ, захват аккаунта, утечка данных и т.д.

JWT_SECRET установлен на supersecretjwt, что является наиболее распространенным секретом, используемым GPT-5. Очевидно, что такое значение может легко угадать злоумышленник.

Хотя это может показаться тривиальной проблемой, это может позволить злоумышленнику подделать JWT-токены и получить несанкционированный доступ к программе. Они могут даже создать JWT-токен с правами администратора и использовать его для доступа к защищенным конечным точкам. Ниже приведен пример, как это будет работать на практике.

Пример атаки: Подделка JWT-токена с помощью предполагаемого секрета

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

Для программы, использующей JWT-токены, когда человек входит как обычный пользователь (не администратор), она получит ответ HTTP, который будет содержать токен. JWT-токен закодирован, но его можно декодировать с помощью любого инструмента декодирования JWT, такого как этот онлайн-декодер.

Чтобы подделать токен JWT с правами администратора, можно изменить поле роли из клиента на администратора. Однако, чтобы закодировать и подписать полезную нагрузку, которая предоставит злоумышленнику доступ администратора, нужно знать секретный ключ, используемый для его подписания. В этом случае это легко – он может догадаться, что это просто supersecretjwt.

Используя секретный ключ, можно подписать измененную полезную нагрузку и сгенерировать новый JWT-токен, используя тот же онлайн-инструмент, что и раньше, но в режиме кодировщика. Новый подписанный токен будет выглядеть так:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6Miwicm9sZSI6ImFkbWluIiwibmFtZSI6IlNhbXBsZSBVc2VyIiwiZW1haWwiOiJ1c2VyQGV4YW1wbGUuY29tIiwiaWF0IjoxNzYxODE0MTYzLCJleHAiOjE3NjI0MTg5NjN9.fTQz8A3zbiDRN8YWdbE9Asoo4w2lPiQtYEMQJEc8Rg8
Forging a JWT token using a predictable secret 1

Без подделанного токена был бы доступ только к конечным точкам клиента. Вот как выглядит приложение для клиента:

Forging a JWT token using a predictable secret 2

Рассматривая приложение, видно, что JWT-токен сохранен в локальном хранилище браузера:

Forging a JWT token using a predictable secret 3

Это означает, что можно просто заменить токен в локальном хранилище поддельным токеном, созданным ранее, и тогда будет получен доступ администратора к программе:

Forging a JWT token using a predictable secret 4

Повторное использование учетных данных

Веб-приложения, созданные с помощью вайб-кодинга, часто используют жестко закодированные общие учетные данные для входа и регистрации, такие как user@example.com:password123, admin@example.com:password, user@example.com:password и другие. Подобно проблеме распространенных секретов, каждая модель LLM, кажется, имеет свой набор учетных данных, которые она использует неоднократно в различных сгенерированных приложениях.

Использование таких учетных данных может быть даже хуже, чем жестко закодированные секреты, поскольку это может привести к захвату учетной записи, несанкционированному доступу и другим проблемам безопасности.

10 наиболее распространенных вариантов учетных данных

EmailПарольЕго частота
user@example.compassword123110
admin@example.compassword55
user@example.compassword46
john@example.compassword12341
john.doe@example.compassword12322
newuser@example.compassword12319
admin@example.comadmin12318
admin@example.compassword12318
user@example.comsecret12314
john@example.comsecret12313

Повторное использование распространенных API-интерфейсов

Когда создается новая программа, она часто содержит распространенные API-интерфейсы входа и регистрации, такие как /api/login, /api/register, /auth/login, /auth/register, /login, /register и другие.

Хотя такие API-интерфейсы не всегда уязвимы, они становятся легкой мишенью для злоумышленников, которые могут злоупотреблять ими для регистрации новых аккаунтов, входа с помощью распространенных аккаунтов и исследования или использования других уязвимостей в программе.

20 наиболее распространенных API-интерфейсов

/login5,446
/auth/login5,343
/swagger4,763
/auth/register3,248
/register2,735
/api/auth/login1,366
/swagger-ui1,022
/health 948
/api/login888
/items878
/api/auth/register870
/users868
/docs641
/admin/users633
/api/register448
/products434
/logout421
/token396
/graphql391

Новые проверки безопасности в Invicti DAST на наличие распространенных уязвимостей, связанных с вайб-кодингом

В результате этого и других исследований Invicti Security создали и расширили несколько проверок безопасности в инструменте Invicti DAST, чтобы выявлять больше подобных уязвимостей.

  • Invicti DAST теперь сканирует на наличие распространенных секретов, учетных данных и API-интерфейсов в веб-приложениях, сгенерированных с помощью вайб-кодинга.
  • Каждый раз, когда сканер находит JWT-токен, проходит проверка, находится ли секрет, используемый для подписания токена, в списке распространенных секретов.
  • Теперь Invicti также тестирует все конечные точки входа и регистрации со всеми учетными данными, часто встречающимися в таких веб-приложениях.
  • Проверки безопасности включают сложные процессы, такие как попытка регистрации новой учетной записи, вход в новую учетную запись и проверка предсказуемости сгенерированного токена входа (JWT или другого).

Вот два примера уведомлений безопасности, которые Invicti может генерировать для этих уязвимостей:

Weak JWT secret alert in Invicti DAST
Уведомление о слабом секрете JWT в Invicti DAST
Weak password alert in Invicti DAST
Уведомление о слабом пароле в Invicti DAST

Вывод: безопасность улучшается, но LLM имеют свои недостатки

Три года назад команда Invicti проанализировала безопасность кода сгенерированного GitHub Copilot, который был первым широко используемым помощником для написания кода на основе искусственного интеллекта. Этот анализ, проведенный Кадиром Арсланом, пришел к выводу: “Результаты моего исследования подтверждают предварительные выводы о том, что предложения часто вообще не учитывают безопасность”. И это был только помощник – тогда никто серьезно не предлагал создавать целое приложение, используя лишь искусственный интеллект.

Сегодня вайб-кодинг везде, и доступно много разных инструментов. Однако следует не забывать о безопасности. Это поможет Invicti DAST, и если вы хотите бесплатно протестировать эту платформу, оставьте ваши контактные данные ниже:

Запрос на бесплатное тестирование Invicti

Подписаться на новости