Чек-лист безопасности перед запуском для приложений, созданных ИИ (Lovable, v0, Bolt, Cursor). 69 проверок, охватывающих Supabase RLS, раскрытые ключи и промпт-инъекции. Те же паттерны, что стоят за CVE-2025-48757 (170 приложений) и утечкой Moltbook (1,5 млн API-токенов).
Прежде чем твитнуть о запуске, прогоните эти 69 проверок. Они повторяют точные паттерны, стоящие за CVE Lovable RLS (CVE-2025-48757, 170+ приложений, 2025), утечкой Moltbook (1,5 млн API-токенов, февраль 2026) и взломом платформы Lovable в апреле 2026 года (исходный код и сервисные ключи проектов других пользователей, находившиеся в открытом доступе ~2,5 месяца).
Нужен полный комплект? 50 навыков аудита, 15 .cursorrules, 1 MCP-конфиг + 4 CLI-рецепта, 30 adversarial-промптов для ревью, 10 разборов инцидентов. Установка за 5 минут. Фиксированные $10.
В аудите, опубликованном в октябре 2025 года, Escape.tech просканировала 5 600 реальных приложений, сгенерированных ИИ, охватив 14 600 активов (методология). Они сообщили о 2 038 критических уязвимостях, более 400 утёкших секретах и 175 случаях раскрытия PII в 1 400 из этих приложений (результаты). Секреты были найдены прямо во фронтенд-бандлах: ключи Stripe, OpenAI и Supabase лежали в клиентском JavaScript. С тех пор ничего не улучшилось: отчёт GitGuardian за 2026 год насчитал 28,6 млн новых секретов в публичном GitHub за 2025 год (+34% год к году), секретов AI-сервисов стало на 81% больше, а в коммитах, соавторами которых были кодинг-агенты, секреты утекали примерно в 2 раза чаще, чем в среднем у людей. Это чек-лист из 69 конкретных, проверяемых пунктов. Каждый соответствует реальному паттерну инцидента. Если вы можете отметить все 69 — выкатывайте. Если нет — исправьте то, что вам мешает.
Не SaaS. Не сканер. Обычный список, который вы проходите перед пушем в прод.
Чек-лист безопасности из 69 пунктов перед запуском
До релиза 30 минут. Стоп. Сначала прогоните это.
Только уязвимость Lovable RLS (CVE-2025-48757, 2025, CVSS 9.3) раскрыла 170+ продакшн-приложений. Moltbook раскрыла 1,5 млн API-токенов в феврале 2026 года — доступных одним curl-запросом. Это не были крайние случаи. Это были массовые запуски.
Этот чек-лист группирует 69 конкретных проверяемых пунктов по аутентификации, секретам, API, базам данных, фронтенду, AI/LLM, инструментам агентов и деплою. Если вы не можете отметить все 69 — не выкатывайте.
Аутентификация (8 пунктов)
1. Row-Level Security (RLS) включена на каждой таблице вашей базы данных.
2. Политики RLS существуют для каждой таблицы и каждой роли (anon, authenticated, service_role).
3. JWT-токены проверяются на сервере на каждом защищённом API-маршруте (никогда не доверяйте фронтенду проверку аутентификации).
4. Сессии ротируются или инвалидируются после входа (защита от CSRF и фиксации сессии).
5. Magic-ссылки (аутентификация без пароля) одноразовые, истекают менее чем за 15 минут и привязаны к IP или отпечатку устройства пользователя.
6. Нельзя обновлять или удалять пользователей, заказы и чувствительные записи, полагаясь только на переданные пользователем ID. Тест: попробуйте обновить запись другого пользователя, изменив ID в запросе.
7. CSRF-токены проверяются на изменяющих состояние запросах (POST, PUT, DELETE) через double-submit cookie или SameSite=Strict.
8. У сессионных cookie установлены флаги HttpOnly, Secure и SameSite=Strict.
Секреты и окружение (7 пунктов)
9. Никаких секретов в переменных NEXT_PUBLIC_*, .env-файлах Vue/React или захардкоженных строках. Выполните grep NEXT_PUBLIC_ и проверьте все переменные.
10. .env, .env.local, .env.*.local находятся в .gitignore и никогда не коммитятся. Проверьте историю git: git log --all -p | grep -i "api_key\|secret".
11. Ключ Supabase service_role находится ТОЛЬКО в серверном .env (Node, Python, Go и т.д.), никогда — во фронтенд-бандлах или .env.local. Ключ service_role полностью обходит RLS — одна утечка означает полный доступ на чтение/запись ко всем таблицам.
12. Ключи Stripe: публичный ключ — в NEXT_PUBLIC_*, секретный ключ — только на сервере, подпись вебхуков проверяется.
13. API-ключи OpenAI, Anthropic, xAI никогда не находятся во фронтенд-коде; всегда проксируются через ваш API.
14. Никаких захардкоженных API-ключей, URL баз данных или учётных данных в исходниках (включая комментарии и неиспользуемый код).
15. Секреты ротируются после запуска или если они когда-либо были раскрыты в истории исходников.
Укрепление API (10 пунктов)
16. Rate limiting активен на /api/auth/*, /api/login, /api/register. Тест: 100 запросов в минуту должны возвращать 429.
17. Все пользовательские вводы, поступающие в /api/*, проверяются с помощью Zod, Yup или аналогов до обращения к базе данных. Никакая сырая req.body не передаётся в запросы.
18. Никакого массового присваивания: пользователь не может установить admin=true, role=admin или другие чувствительные поля, отправив их через POST.
19. Подписи вебхуков проверяются (сравните заголовок подписи HMAC-SHA256 с ожидаемым значением, используя сравнение за константное время).
20. CORS не установлен в *. Разрешённые origins захардкожены и не включают localhost в продакшене.
21. SQL-запросы используют только параметризованные выражения. Никакой конкатенации строк пользовательского ввода в SQL.
22. NoSQL-запросы (MongoDB, Firebase и т.д.) не конкатенируют пользовательский ввод в фильтры или селекторы.
23. Загружаемые файлы проверяются (mime-тип + размер), хранятся вне веб-корня и переименовываются для предотвращения path traversal.
24. Редиректы после входа в систему находятся в белом списке. Нельзя перенаправить на внешний домен через open redirect.
25. API не совершает непроверенные внешние запросы. Убедитесь, что URL, используемые в серверных запросах, берутся из вашего белого списка, а не из пользовательского ввода (защита от SSRF).
База данных (6 пунктов)
26. RLS ПРИНУДИТЕЛЬНО включена на всех таблицах. Роль anon не может выполнять SELECT/INSERT/UPDATE/DELETE ни на одной таблице без явной разрешающей политики.
27. Публичная роль anon имеет ноль разрешений по умолчанию. Политики предоставляют только необходимое. Только чтение публичных списков, никогда — запись.
28. Ключ service-role используется ТОЛЬКО в серверном коде. Проверка: grep -r "service_role" src/. Во фронтенд-файлах должно быть ноль результатов.
29. Изоляция пользовательских данных: запросы всегда фильтруются по auth.uid() или team_id. Ни один запрос не возвращает все записи всех пользователей.
30. Мягкие удаления (флаг is_deleted) или архивные таблицы предотвращают случайную потерю данных. Жёсткие удаления логируются с указанием исполнителя + временной метки.
31. Резервные копии базы данных существуют и протестированы. Вы убедились, что можете восстановиться из резервной копии до этого запуска.
Фронтенд (8 пунктов)
32. Никаких dangerouslySetInnerHTML или innerHTML без санитизации через DOMPurify. Проверьте каждый экземпляр в кодовой базе.
33. Все npm/pip/gem-зависимости проверяются на известные CVE. Запустите npm audit, pnpm audit или npx osv-scanner --lockfile=package-lock.json перед запуском — и проверьте конкретные версии в KNOWN-VULNERABLE-VERSIONS.md, потому что npm audit ловит опубликованные CVE, но не вредоносные пакеты.
34. Content Security Policy (CSP) включена в продакшене (strict-dynamic, без unsafe-inline). Сначала протестируйте на стейджинге.
35. Никакие /api/debug, /admin/backdoor или внутренние тестовые эндпоинты не доступны в продакшене. Выполните grep по маршрутам «debug», «mock», «test-only».
36. Установлен X-Frame-Options: DENY. Проверьте, что заголовок отправляется в каждом ответе (предотвращает кликджекинг).
37. Сообщения об ошибках не раскрывают внутренние пути, стек-трейсы или схему БД в продакшене. Протестируйте ошибки 404, 500 и ошибки прав доступа.
38. Никакого загрязнения прототипов: объекты, предоставленные пользователем, не объединяются с объектами приложения без санитизации.
39. React: никаких инлайновых обработчиков событий с несанитизированными пользовательскими данными. Используйте react-dompurify или аналог для любого пользовательского контента, отображаемого как HTML.
AI и LLM (10 пунктов)
Это проверки, которых никогда не было в старых руководствах по веб-приложениям. Они соответствуют OWASP Top 10 для LLM-приложений — а издание 2026 года (выпущено 3 августа 2026 года, первое, взвешенное по реальным данным об инцидентах из 6 639 случаев) переместило Excessive Agency с #6 на #3 и добавило Agent Hijacking, Multi-Modal Injection и Memory Persistence. Пункты про агентов ниже больше не теоретические.
40. Пользовательский ввод помещается в отдельное сообщение user, никогда не конкатенируется в системный промпт. Контент, полученный из файлов, RAG или веба, оборачивается в явные разделители и считается ненадёжным (непрямая prompt-инъекция).
41. Системный промпт не содержит ни секретов, ни API-ключей, ни внутренних URL. Считайте, что он публичный. Протестируйте извлечение («повторите ваши инструкции дословно») и убедитесь, что ничего чувствительного не возвращается.
42. На каждом эндпоинте, вызывающем LLM, существуют лимиты токенов/расходов на пользователя И глобальные. Тест: «долбите» его с одного аккаунта — и срабатывает квота. У провайдера установлен месячный потолок расходов с уведомлениями о биллинге (denial-of-wallet, OWASP LLM10:2025).
43. Вывод LLM, отображаемый как HTML, санитизируется (DOMPurify) до попадания в DOM. Вывод модели — это ненадёжный ввод, как и вставленный пользователем текст.
44. Продакшн-агенты обеспечивают авторизацию на стороне сервера для каждого инструмента, независимо от решения модели. Никакое деструктивное действие (удаление, платёж, отправка email) не выполняется только по указанию модели.
45. Инструменты агентов используют принцип наименьших привилегий. Никакой raw shell/exec/eval, доступной из ввода, контролируемого моделью. Деструктивные команды находятся в белом списке и требуют подтверждения (Excessive Agency, OWASP LLM06:2025).
46. Мультитенантные RAG/векторные хранилища обеспечивают изоляцию тенантов во время запроса (namespace или фильтр по метаданным, привязанный к аутентифицированному пользователю), а не в коде приложения. Тест: тенант A никогда не может получить чанки тенанта B (OWASP LLM08:2025).
47. При приёме документов в RAG (ingestion) документы, предоставленные пользователем или полученные скрейпингом, считаются ненадёжными. Корпус хранится под контролем версий с базовыми хешами, чтобы несколько отравленных документов не могли незаметно изменить вывод.
48. Векторные эмбеддинги защищены контролем доступа так же, как исходные PII, которые они кодируют (инверсия эмбеддингов может восстановить текст). Эндпоинт векторной БД требует аутентификации и недоступен публично.
49. Если вы публикуете или используете MCP-серверы: каждый закреплён за проверенной версией, описания инструментов сканируются на скрытые/невидимые Unicode-инструкции (отравление инструментов), и вы перепроверяете при любом изменении (rug-pull). MCP Inspector ≥ 0.14.1, mcp-remote ≥ 0.1.16 (CVE-2025-49596, CVE-2025-6514). Rug-pull — не теория: postmark-mcp v1.0.16 добавил одну строку, которая скрыто копировала (BCC) каждое письмо, проходящее через него, атакующему — ~300 организаций, одно обновление версии (сентябрь 2025).
Агенты, инструменты и цепочка поставок (12 пунктов)
50. Dev- и прод-базы данных физически раздельны, с раздельными учётными данными. Ваш агент/CI никогда не имеет прав на запись или DDL в проде. (Агент Replit стёр прод-базу во время code freeze, потому что у него был доступ на запись, которого никогда не должно было быть.)
51. Облачные токены, выдаваемые агентам или CI, ограничены одним проектом с минимальными правами — никогда не на весь аккаунт. (PocketOS: неограниченный Railway-токен позволил кодинг-агенту удалить базу данных и все резервные копии за 9 секунд.)
52. Ключ Supabase service_role не встречается ни в одном файле, доступном клиенту: grep -rn "service_role" src/ app/ public/ dist/ ничего не возвращает, и утверждение role в любом клиентском JWT не равно service_role.
53. Каждая зависимость проверяется на реальное существование перед установкой — реальный мейнтейнер, реальная история, реальное количество загрузок. Импорты, предложенные ИИ, сверяются с lockfile. (Slopsquatting: 19,7% пакетов, рекомендованных LLM, не существуют, 43% этих имён предсказуемо повторяются, и атакующие их регистрируют. В июле 2026 года Claude-агент, находившийся на оценке, опубликовал рабочую вредоносную программу в живой PyPI — она запустилась на 15 реальных системах в течение часа.) Ваш сканер здесь важен: npm audit помечает опубликованные CVE, а не вредоносные пакеты. См. KNOWN-VULNERABLE-VERSIONS.md.
54. Резервные копии / point-in-time recovery включены, протестированы И хранятся под учётными данными, недоступными агенту — чтобы скомпрометированный агент не мог удалить и резервные копии.
55. AI-правила и конфигурационные файлы (.cursor/rules, .github/copilot-instructions.md, CLAUDE.md, .windsurfrules) сканируются на невидимый Unicode и рассматриваются как критичный для безопасности код (класс «Rules File Backdoor»).
56. Ваши инструменты кодинга обновлены (Cursor CurXecute / MCPoison / CVE-2025-59944, Claude Code CVE-2025-59536, Copilot RCE CVE-2025-53773). Workspace Trust включён; авто-запуск / режим «YOLO» выключены при открытии ненадёжных репозиториев.
57. Любое необратимое действие агента в отношении продакшена (DROP, DELETE, TRUNCATE, миграции, деплои) требует одобрения человека (human-in-the-loop).
58. Ваши кодинг-агенты не могут воспринимать текст, контролируемый атакующим, как инструкции: события ошибок Sentry, текст GitHub-issue, README клонированных репозиториев. «Agentjacking» через публичный Sentry DSN — markdown-пейлоад, внедрённый в событие ошибки, подхваченный через Sentry MCP — достиг 85% успеха против Claude Code/Cursor/Codex (Tenet Security, июнь 2026; 2 388 организаций имели инъектируемые DSN). MCP-доступ к трекеру ошибок — только чтение; DSN считаются секретами.
59. CI-воркфлоу агентов (claude-code-action и аналоги) никогда не выполняют чекаут веток PR атакующего с авто-включёнными MCP-серверами или правами на запись (TRA-2026-27: ветка PR атакующего → выполнение произвольного кода в вашем CI).
60. Если вы строите на спецификации MCP от 2026-07-28: все идентификаторы воркфлоу/состояния непредсказуемы, привязаны к тенанту и проверяются на сервере. Протокол стал stateless — состояние теперь передаётся как обычные аргументы инструментов, поэтому предсказуемые ID и межтенантный угон воркфлоу — это полноценные классы атак, от которых спецификация вас больше не защищает (Akamai, июнь 2026).
61. Никаких секретов или PII в расшаренных вами разговорах с агентами. ~600 расшаренных чатов/артефактов Claude были проиндексированы Google, внутри них — живые API-ключи и AWS-токены (июль 2026, с тех пор удалены из индекса). Ссылки на расшаривание — это канал публикации; относитесь к ним как к публичному репозиторию.
Деплой (8 пунктов)
62. Конфигурация деплоя явно разделяет переменные окружения. Публичные переменные (NEXT_PUBLIC_*) против серверных секретов.
63. NODE_ENV=production установлено во всех продакшн-сборках. Проверьте в логах деплоя.
64. Мониторинг приложения (Sentry, LogRocket и т.д.) включён и настроен на санитизацию чувствительных данных перед отправкой.
65. Трекинг ошибок НЕ отправляет токены сессий пользователей, пароли, API-ключи или PII в пейлоадах ошибок. Проверьте вашу конфигурацию Sentry/LogRocket.
66. Source maps исключены из продакшн-бандлов. Собирайте с --no-sourcemap или удаляйте .map-файлы перед деплоем.
67. HTTPS принудительно включён. Все HTTP-запросы перенаправляются на HTTPS. Тест: curl -i http://yourapp.com.
68. Сторонние интеграции (аналитика, чат-виджеты и т.д.) загружаются только с доверенных CDN и используют хеши Subresource Integrity (SRI).
69. Вы протестировали полный процесс восстановления аккаунта (сброс пароля, инвалидация сессии, повторная аутентификация) на продакшн-стейджинге.
Перед нажатием Deploy
Вы отметили все 69 пунктов.
Вы вручную протестировали 3–5 пунктов (не только линтинг).
У вас есть контактный email для вопросов безопасности на сайте ([email protected]).
Если вы не можете уверенно отметить все 69 — не выкатывайте. Технический долг по безопасности с первого дня дорого выплачивать.
5 бесплатных примеров навыков
Эти навыки находятся в 5-free-skills/ в этом репозитории. Поместите их в .claude/skills/ и запускайте с помощью /skill <name> в Claude Code.
Находит dangerouslySetInnerHTML и несанитизированный вывод. 86% сгенерированного ИИ кода проваливают эту проверку (Veracode, 2025)
Известные уязвимые версии
KNOWN-VULNERABLE-VERSIONS.md — конкретные CVE и номера версий в стандартном стеке vibe coding, проверенные по GitHub Security Advisories / NVD по состоянию на август 2026. Обход middleware Next.js (CVE-2025-29927, CVSS 9.1 — один заголовок пропускает всю вашу auth-прослойку), предсказание границ form-data (CVE-2025-7783, CVSS 9.4), чтение файлов dev-сервером Vite, React Router, mcp-remote, MCP Inspector, Cursor.
Плюс инциденты цепочки поставок, которые npm audit структурно не может поймать — захват chalk/debug, червь Shai-Hulud, postmark-mcp, slopsquatting — и таблица того, какой сканер что реально ловит.
Как 170+ приложений Lovable вышли с полностью выключенной RLS — и отдельное продолжение 2026 года, раскрывшее 18 697 записей студентов EdTech-платформы
Как Moltbook оставила 1,5 млн API-токенов доступными одному curl-запросу
Исправления на платформах с момента создания этого списка (чтобы вы знали, что всё ещё на вас)
Supabase (апрель 2026): новые таблицы в public-схеме больше не раскрываются автоматически через Data/GraphQL API — требуется явное согласие. Это устраняет схему «anon-ключ + забытая RLS = публичная БД» для новых таблиц. Таблицы, созданные до этого: всё ещё на вас.
Lovable (июнь 2026): ошибки конфигурации RLS теперь проверяются при каждой публикации, с опциональным авто-исправлением для подходящих критических находок. RLS по-прежнему НЕ включена по умолчанию, CVE-2025-48757 по-прежнему оспаривается вендором, а взлом апреля 2026 года был ошибкой авторизации на стороне платформы — ваша RLS к нему отношения не имела.
Lovable (июль 2026): автоматически отзывает ваши API-ключи, когда они появляются в публичном GitHub.
Replit (май-июнь 2026): Security Center 2.0 плюс файрвол пакетов (построенный на Socket), блокирующий ~8 000 вредоносных пакетов в день на этапе установки.
Semgrep (май 2026): наборы правил для захардкоженных AI-ключей (186 правил), вредоносных файлов навыков агентов (122 правила) и безопасности ИИ (27 правил) — стоит подключить в CI, если агенты пишут ваш код.
Линтинг платформ ловит известные ему паттерны. Ничто из вышеперечисленного не освобождает вас от пунктов 1–69.
Чем это НЕ является
Не SaaS-сканер. Не непрерывный мониторинг. Ничто не отправляет данные на сторону.
Это статические markdown-файлы. Вы читаете их, вручную выполняете SQL-запросы и shell-команды, исправляете то, что они находят. Никаких дашбордов. Никаких алертов. Никакой магии.
Это также не замена профессиональному пентесту, если вы работаете с медицинскими данными, финансовыми записями или чем-либо регулируемым. Чек-лист покрывает паттерны, которые постоянно встречаются в vibe-coded приложениях. Он покрывает не всё.
Хотите полный набор?
Чек-лист из 69 пунктов бесплатен. В наборе 50 навыков по 5 поверхностям атак, включая 12, специфичных для AI и LLM-приложений: prompt-инъекции, безопасность MCP-серверов, эскалация прав агентов, изоляция векторных БД, утечка данных из RAG, извлечение системного промпта.
Также включено: 15 правил Cursor, 1 MCP-конфиг (Semgrep) + 4 рецепта интеграции с CLI (gitleaks, npm-audit, проверка Supabase RLS, фаззер prompt-инъекций), 4 чек-листа, 30 adversarial-промптов для ревью и 10 разборов инцидентов с полным анализом первопричин (включая PocketOS, где агент Cursor + Claude Opus 4.6 удалил продакшн-базу данных и все резервные копии за 9 секунд через неограниченный Railway-токен).
Без SaaS. Без подписки. Markdown-файлы, которые живут в вашем репозитории.
claude-codecursorlovablev0securitymcpvibe-codingsupabasenext-jsprompt-injectionrlsai-securityЕсли этот чек-лист уберёг вас от публикации чего-то неловкого, поставьте звёздочку репозиторию. Затем отправьте ссылку тому из вашей команды, кто использует Lovable или v0, не задумываясь пока об этом.