Вайбкодинг і ризики безпеки: проаналізовано 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

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