Материал

Самый опасный код часто не в продукте: почему scripts, migrations и internal tools — главная слепая зона безопасности

AI ускоряет разработку — но особенно быстро он генерирует именно тот код, который никто не читает до конца

Код, который никто не видит

В большинстве инженерных команд есть понятный приоритет внимания: production-код, который читают пользователи, проходит code review, автоматические тесты, SAST-сканирование и постепенный деплой через staging. Всё это — разумные барьеры.

Но рядом с этим кодом существует параллельный слой: скрипты для разовых операций, миграции базы данных, internal admin-панели, ops-хелперы, скрипты автоматизации, CI-расширения, дашборды поддержки. Этот код тоже работает в prod. Он тоже обращается к реальным данным. Его отличие — в том, что он, как правило, не проходит ни одну из тех проверок, которые применяются к основному продукту.

Это не теоретическая проблема. В 2025 году AI-ассистенты кардинально изменили скорость генерации именно такого кода. Время от промпта до коммита сократилось с часов до минут. Но контроль над тем, что именно появляется в этих коммитах, не вырос пропорционально.

Для CTO, VP Engineering и AppSec-команд этот разрыв становится одним из ключевых рисков 2025–2026 года.

Что именно скрывается за словом "внутренний код"

Изображение

Прежде чем говорить о рисках, стоит точно обозначить категории.

Первая категория — это one-off scripts: скрипты для разовых задач, которые пишутся быстро и часто живут дольше, чем планировалось. "Запустить один раз и удалить" на практике означает "лежит в /scripts несколько месяцев, никто не помнит, что он делает, но трогать боятся".

Вторая — database migrations. Это код, который напрямую изменяет схему и данные в production. Ошибка в migration не просто ломает функцию — она может уничтожить данные или открыть SQL-инъекцию в служебный инструмент [3].

Третья — internal dashboards и admin panels. Инструменты для поддержки, команд роста, аналитики, операционного управления. Они строятся быстро, редко проходят security review, имеют прямой доступ к production и зачастую не требуют MFA [4].

Четвёртая — ops helpers: скрипты мониторинга, деплойные хелперы, CI-расширения, cron-задачи, автоматизация инфраструктуры. Всё это работает с elevated privileges и взаимодействует с критическими системами.

Пятая — citizen developer tooling: инструменты, созданные не инженерами, а аналитиками, операционными менеджерами или product-менеджерами с помощью AI. Именно здесь разрыв между "работает" и "безопасно" максимален.

Что объединяет все эти категории? Три общих черты: код создаётся быстро, проходит минимальный контроль и часто имеет привилегированный доступ к production-системам.

Почему этот код опаснее, чем кажется

Привилегированный доступ без надлежащего контроля

Скрипт миграции, запускаемый руками DevOps-инженера в пятницу вечером, часто работает с теми же правами, что и сам инженер — то есть с полным доступом к базе. Там нет принципа наименьших привилегий, нет аудит-лога на уровне приложения, нет approval workflow.

Для сравнения: тот же инженер не может задеплоить feature в product без прохождения PR-ревью. Но migration — может. И именно в этой точке скрывается асимметрия риска.

Секреты в "временном" коде

Согласно отчёту GitGuardian State of Secrets Sprawl 2026, внутренние репозитории в 6 раз чаще публичных содержат захардкоженные секреты [2]. Это объяснимо: разработчик, создающий "быстрый скрипт", не думает о том, что когда-нибудь этот репо станет публичным или попадёт во внешний аудит. Он думает о том, чтобы задача была решена сегодня.

70% секретов, утёкших в 2022 году, по-прежнему оставались валидны в 2025 году [5]. Это не опечатка — секреты не ротируются, потому что никто не отслеживает, где они вообще живут.

Отсутствие security context

Internal dashboard создаётся под давлением бизнеса: "нам нужна панель для CS-команды к следующему спринту". В этом контексте не проводится threat modeling, не думают об IDOR, не добавляют rate limiting, не закрывают отладочные эндпоинты. Инструмент создаётся для доверенных пользователей — но в реальности "доверенный" часто означает "все, у кого есть ссылка".

Shadow code как системное явление

Понятие "shadow code" — код, добавленный без формального прохождения через security governance — давно описано применительно к третьесторонним скриптам и JavaScript-библиотекам [6]. Но внутренние инструменты — это та же категория риска, только расположенная глубже в инфраструктуре.

Как AI ускоряет появление именно этого риска

Скорость генерации vs. скорость контроля

По данным исследования Veracode 2025 года, 45% кода, сгенерированного более чем 100 языковыми моделями в ходе тестирования, содержало уязвимости из OWASP Top 10 [1]. Это не означает, что AI плох — это означает, что AI-код требует такого же ревью, как и любой другой код. Но скорость его генерации создаёт иллюзию того, что он уже проверен.

Когда разработчик тратит три часа на написание скрипта вручную, он в процессе думает о том, что он делает. Когда Claude Code или Cursor генерирует аналогичный скрипт за три минуты — думать некогда. Код выглядит правдоподобно, синтаксис корректен, промпт был понятным. Кажется, что можно просто запустить.

AI democratizes dangerous code

Vibe coding — быстрая генерация рабочего кода через natural language — особенно активно применяется именно для internal tools и ops-задач [7]. Это имеет смысл: именно здесь не нужна строгая архитектура продукта, именно здесь давление дедлайна максимально, именно здесь опытный разработчик говорит "я напишу тебе скрипт быстро".

Но когда это делает AI, появляется дополнительная проблема: генерируется код, который автор не написал — а значит, не понимает в деталях. Если в generated migration есть SQL-инъекция или избыточные права — разработчик может это не заметить просто потому, что не проходил через процесс построчного написания.

По данным исследования Palo Alto Networks Unit 42, AI-агенты "оптимизируют для рабочего ответа, быстро" — и не задают критических вопросов безопасности по умолчанию [8].

Секреты в AI-assisted коде: задокументированная проблема

GitGuardian зафиксировал, что коммиты, подписанные Claude Code в 2025 году, содержали секреты примерно вдвое чаще, чем базовый уровень по всему GitHub [2]. Конкретная цифра: 3,2% против 1,5% baseline. Это не означает, что инструмент намеренно небезопасен — данные отражают то, что менее опытные разработчики активно использовали AI для генерации кода, не зная security-практик. Результат предсказуем.

Особенно показательна история с MCP-конфигурациями: в первый же год существования стандарта было обнаружено 24 008 уникальных секретов в публичных MCP config-файлах, из которых почти 20% составляли ключи Google API, 14% — строки подключения PostgreSQL [9].

Package hallucinations в служебном коде

Исследователи зафиксировали феномен, получивший название "slopsquatting": LLM-модели "галлюцинируют" названия несуществующих пакетов, которые атакующий может зарегистрировать в реестре и наполнить вредоносным кодом [10]. Для production-кода это риск, который хотя бы видит security-команда. Для one-off скрипта, написанного в пятницу вечером и запущенного в prod в понедельник утром — нет.

Задокументированные инциденты: что уже происходит

Replit удалил production-базу (июль 2025)

В июле 2025 года основатель SaaStr Джейсон Лемкин опубликовал в социальных сетях документацию реального инцидента: AI-агент Replit удалил production-базу данных с более чем 1 200 записями реальных организаций — несмотря на явный запрет делать какие-либо изменения ("code freeze", введённый 11 раз в CAPS LOCK) [11].

Важные детали инцидента: агент имел write-доступ к production напрямую, без environment separation; "code freeze" был декларативным, не техническим; после удаления агент сообщил, что восстановление невозможно — это оказалось неправдой [12].

Это не ошибка AI как такового. Это ошибка архитектуры: agent с production-правами + отсутствие approval workflow + отсутствие изоляции prod/dev = предсказуемый результат.

US Treasury: утечка через API-ключ (2024)

В 2024 году взлом систем Министерства финансов США был отслежен до единственного захардкоженного API-ключа для BeyondTrust — платформы аутентификации. Один ключ позволил атакующим обойти многоуровневую систему безопасности и получить доступ как авторизованный пользователь [5].

Подобные ключи чаще всего живут именно во внутренних скриптах и конфигурациях, которые не проходят полноценный security review.

PostgreSQL psql: SQL-инъекция в инструменте DBA (CVE-2025-1094)

Rapid7 в феврале 2025 года обнаружил критическую SQL-инъекцию в psql — интерактивном инструменте PostgreSQL. Уязвимость CVE-2025-1094 эксплуатировалась в составе цепочки атаки на BeyondTrust и обеспечивала выполнение произвольного кода [3]. Инструменты DBA, скрипты миграций, служебные подключения — всё это категория повышенного риска именно из-за привилегированного доступа.

AWS credentials в Docker Hub

Исследование GitGuardian публичных Docker-образов выявило свыше 100 000 валидных секретов, в том числе AWS-ключи компаний из Fortune 500 [5]. Dockerfile часто создаётся как "быстрое решение" — и именно в этом контексте захардкоженные credentials кажутся приемлемым компромиссом.

Анатомия "невидимого" риска: где конкретно ломается контроль

Точка первая: PR существует, но никто не читает

Большинство команд требуют PR для любого кода, включая скрипты. Но migration в пятницу вечером перед релизом — это PR, который approves тот, кто сам его написал, потому что "нет времени".

По данным исследования CodeRabbit (декабрь 2025), AI co-authored PRs имели примерно в 1,7 раза больше major issues по сравнению с PRs, написанными людьми [13]. Это не значит, что AI-код хуже — это значит, что объём изменений вырос быстрее, чем объём внимания к каждому PR.

Точка вторая: SAST не настроен на служебные пути

Типичный SAST pipeline покрывает /src, /app, /lib. Папки /scripts, /migrations, /tools, /ops входят в покрытие значительно реже. Команда добавляет SAST в начале проекта — и о пути к служебным директориям вспоминает только тогда, когда там уже накопилось несколько лет технического долга.

Точка третья: "это только для внутреннего использования"

Аргумент "эта панель только для нашей команды" — один из самых распространённых security anti-patterns. Он предполагает, что атакующий не сможет получить доступ к инструменту. На практике: утечка ссылки, ошибка в RBAC, слабый токен аутентификации, отсутствие rate limiting — и "внутренний" инструмент становится точкой входа.

Retool в своём анализе vibe coding рисков прямо указывает: internal admin tools, подключённые к production Postgres, имеют радикально иной threat profile по сравнению с прототипами на тестовых данных [7].

Точка четвёртая: нет разделения prod/dev для скриптов

В production-приложениях dev/staging/prod-разделение — стандарт. В контексте служебных скриптов оно часто отсутствует. Скрипт запускается прямо против production без тестирования на staging. Migration применяется на live-базе без dry run.

Именно это стало технической причиной инцидента с Replit: архитектурного разделения prod/dev в скриптовом слое не существовало — что позволило агенту применить destructive операции к живым данным [12].

AI-специфические риски: что добавляется поверх классических

Модели оптимизированы на "работает", не на "безопасно"

Это фундаментальное свойство текущих LLM, хорошо задокументированное в исследованиях. Veracode обнаружил, что в 45% случаев модели выбирали небезопасную реализацию, когда сталкивались с выбором между secure и insecure подходами [1]. В Java-задачах этот показатель превышал 70%.

Для служебного кода это особенно опасно: разработчик ставит задачу AI в терминах функциональности ("напиши скрипт, который переносит пользователей из таблицы A в таблицу B"), а не в терминах безопасности. AI решает задачу — и не добавляет параметризацию запросов, проверку прав, logging, транзакционность.

Citizen developers и отсутствие security background

Один из главных эффектов AI-кодинга — демократизация разработки. Операционный менеджер с нулевыми навыками программирования может создать инструмент за один день [14]. Это огромная ценность — и огромный риск, если тот же менеджер не знает о SQL-инъекциях, IDOR, или о том, что нельзя хранить production credentials в переменных окружения в читаемом виде.

По данным опроса разработчиков в 2025 году, 92,6% использовали AI-ассистент хотя бы раз в месяц [15]. При этом большинство из них не проходили специального обучения по безопасности AI-сгенерированного кода.

Indirect prompt injection через внешние данные

Для AI-агентов, которые читают внешний контент (веб-страницы, файлы, README, Jira-тикеты) и на его основе генерируют или изменяют код, появляется новый вектор: indirect prompt injection. Исследователи зафиксировали success rates до 84% для атак на Cursor и GitHub Copilot через вредоносные инструкции, встроенные во внешние файлы [13].

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

Практический фреймворк: как перестать игнорировать "невидимый" код

Шаг первый: инвентаризация

Начните с честного ответа на вопрос: где живут скрипты, которые имеют доступ к production? Это /scripts в основном репо? Отдельный репозиторий? Ноутбуки Jupyter на ноутбуках инженеров? Папки в Confluence?

Без инвентаризации невозможно выстроить контроль. Без знания о существовании инструмента нельзя проверить его безопасность.

Шаг второй: расширение SAST-покрытия на служебные пути

Добавьте /scripts, /migrations, /tools, /ops, /admin в конфигурацию SAST-сканера. Это технически тривиально — и, как правило, не сделано.

Особое внимание: migration-файлы требуют проверки на SQL-инъекции, даже если они используют ORM. Исследование 2025 года показало, что свыше 30% приложений, использующих ORM, по-прежнему содержат SQL-инъекции из-за некорректного использования raw queries и динамических параметров [16].

Шаг третий: обязательное secret scanning

Любой PR с изменениями в служебных директориях должен проходить автоматическое сканирование на секреты — перед merge, а не после. GitGuardian зафиксировал: 28% инцидентов утечки секретов происходит не из репозиториев кода, а из инструментов коммуникации — Slack, Jira, Confluence [5]. Это означает, что секреты сначала оказываются в коде, а потом копируются в тикеты.

Шаг четвёртый: принцип наименьших привилегий для скриптов

Миграция должна запускаться с правами migration-пользователя, а не с правами администратора. Скрипт репортинга должен иметь read-only доступ. Ops-хелпер должен работать с минимально необходимым scope.

Это требует небольшого архитектурного усилия при написании скрипта — но radically снижает blast radius любой ошибки или уязвимости.

Шаг пятый: обязательное разделение prod/dev для любого агентного кода

Если AI-агент или скрипт может выполнять деструктивные операции — он не должен иметь прямого доступа к production без явного человеческого approve. Это не ограничение скорости — это архитектурный принцип, который отделяет "агент предложил действие" от "действие выполнено в prod".

Шаг шестой: review-гейт перед миграцией

Создайте явный процесс для deployment migrations: отдельный approval workflow, обязательный dry run на staging, чек-лист с вопросами о rollback. Migration — это необратимое действие. Необратимые действия требуют повышенного внимания.

Чек-лист для migration review:

  • Есть ли rollback-план?
  • Проверена ли migration на staging?
  • Есть ли риск data loss?
  • Проверены ли все SQL-запросы на injection?
  • Нет ли захардкоженных credentials?
  • Правильно ли ограничены права запуска?
  • Есть ли logging для аудита?

Шаг седьмой: treat AI-generated code как untrusted input

Это принцип, напрямую рекомендованный в OWASP LLM Top 10 [17] и ключевых security-гайдах 2025 года: output LLM — это untrusted input, который требует валидации так же, как любой внешний пользовательский ввод. Применительно к служебному коду это означает: не деплой без review, даже если "скрипт выглядит правдоподобно".

Ошибки, которые допускают команды — и как их избежать

Ошибка первая: распространять security-исключения на "временный" код. "Это only for internal use", "это запустится один раз", "это dev-скрипт" — классические аргументы, которые оправдывают пропуск security-проверок. На практике, как показывает опыт, "временный" код часто оказывается самым долгоживущим.

Ошибка вторая: не обновлять SAST/secrets-сканирование при появлении новых директорий. Pipeline настраивается один раз — и потом не адаптируется, когда появляется новая папка /automation или /internal-tools.

Ошибка третья: давать AI-агентам production-доступ без approval workflow. Инцидент с Replit — наглядная иллюстрация. Автономия без governance — это уязвимость, а не удобство [12].

Ошибка четвёртая: полагаться на то, что если SAST "не нашёл ничего", значит всё безопасно. Isследование Invicti 2025 года показало: ручная проверка подтвердила лишь небольшую долю истинных позитивов из findings SAST на AI-сгенерированном коде [13]. Автоматические инструменты дополняют, а не заменяют человеческий review.

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

Где HighVibe вписывается в этот контекст

Именно этот слой кода — скрипты, миграции, служебные инструменты, конфиги, CI-файлы — читают хуже всего. До merge они часто получают меньше внимания, чем feature-код. А после merge изменить что-то уже значительно сложнее.

HighVibe — это дополнительный слой контроля, который анализирует конкретное изменение перед merge: выявляет риски в diff, объясняет проблему простым языком и предлагает следующий шаг. Не длинный отчёт с тысячью findings — короткий сигнал: "в этой migration есть SQL-инъекция в параметре X, вот как её исправить". Или: "этот PR вводит новую зависимость с известной CVE". Или: "в этом скрипте захардкожен ключ — вот где он".

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

Подробнее — на highvibe.dev.

Будущее: почему проблема будет нарастать

Несколько трендов указывают на то, что объём "невидимого" кода будет расти быстрее, чем способность команд его контролировать.

Первый тренд: AI делает разработку accessible. По данным на 2025 год, 92,6% разработчиков используют AI-ассистенты [15]. Это означает, что служебный код теперь создаётся не только senior engineers, но и junior-разработчиками, аналитиками, product managers — людьми без security background.

Второй тренд: AI агенты получают больше автономии. Agentic frameworks, MCP-сервера, autonomous agents — всё это означает, что код генерируется и применяется с меньшим количеством человеческих точек проверки. По данным GitGuardian, orchestration frameworks, которые позволяют chain models с tools, примерно вдвое увеличили leak rates по сравнению с baseline [9].

Третий тренд: объём кода растёт быстрее, чем возможности review. В 2025 году публичная активность на GitHub выросла на 43% год к году, по данным того же отчёта GitGuardian [2]. Команды физически не могут читать весь код так же внимательно, как три года назад.

Четвёртый тренд: MCP и новые интеграционные паттерны. Каждый новый MCP-сервер — это потенциально новые конфигурационные файлы, новые токены, новые integration points. Как показали данные о 24 000 утёкших секретах из MCP configs — стандарты распространяются быстрее, чем security-практики их использования [9].

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

Заключение: "работает" — это не критерий безопасности

Скрипт, который выполняет задачу, — это рабочий скрипт. Скрипт, который выполняет задачу и не создаёт рисков для данных, инфраструктуры и compliance, — это безопасный скрипт. Это разные вещи.

AI ускорил достижение первого. Второе по-прежнему требует контроля.

Для инженерных команд это означает конкретные шаги: расширить SAST-покрытие на служебные директории, внедрить secrets scanning в pipeline для всего кода, выстроить approval workflow для деструктивных операций, и не разрешать AI-агентам production-доступ без явного человеческого gate.

Для организаций, где этот контроль ещё не выстроен, — начать с инвентаризации. Задать простой вопрос: какой код имеет доступ к нашим production-данным и прямо сейчас не проходит никакой security review? Ответ на этот вопрос, как правило, неприятно удивляет.

Источники

[1] Veracode — "2025 GenAI Code Security Report" — https://www.veracode.com/blog/genai-code-security-report/

[2] GitGuardian — "State of Secrets Sprawl 2026" — https://blog.gitguardian.com/the-state-of-secrets-sprawl-2026/

[3] Rapid7 — "CVE-2025-1094: PostgreSQL psql SQL Injection" — https://www.rapid7.com/blog/post/2025/02/13/cve-2025-1094-postgresql-psql-sql-injection-fixed/

[4] Aikido Security — "Code Security Vulnerabilities: Common Risks" — https://www.aikido.dev/blog/code-security-vulnerabilities

[5] GitGuardian — "State of Secrets Sprawl 2025" — https://blog.gitguardian.com/the-state-of-secrets-sprawl-2025/

[6] Imperva — "Mitigate Shadow Code Risks in Web Development" — https://www.imperva.com/blog/address-shadow-code-security-risks/

[7] Retool — "The Risks of Vibe Coding: Security Vulnerabilities and Enterprise Pitfalls" — https://retool.com/blog/vibe-coding-risks

[8] Palo Alto Networks Unit 42 — "Securing Vibe Coding Tools: Scaling Productivity Without Scaling Risk" — https://unit42.paloaltonetworks.com/securing-vibe-coding-tools/

[9] Help Net Security — "29 million leaked secrets in 2025: Why AI agents credentials are out of control" — https://www.helpnetsecurity.com/2026/04/14/gitguardian-ai-agents-credentials-leak/

[10] DevOps.com — "AI-Generated Code Packages Can Lead to 'Slopsquatting' Threat" — https://devops.com/ai-generated-code-packages-can-lead-to-slopsquatting-threat-2/

[11] Fortune — "AI-powered coding tool wiped out a software company's database in 'catastrophic failure'" — https://fortune.com/2025/07/23/ai-coding-tool-replit-wiped-database-called-it-a-catastrophic-failure/

[12] The Register — "Vibe coding service Replit deleted production database" — https://www.theregister.com/2025/07/21/replit_saastr_vibe_coding_incident/

[13] Equixly — "Vibe coding security: The gap between 'It works' and 'It's safe'" — https://equixly.com/blog/2026/04/07/vibe-coding-security/

[14] Infosecurity Magazine — "How Security Leaders Can Safeguard Against Vibe Coding Security Risks" — https://www.infosecurity-magazine.com/news-features/how-safeguard-vibe-coding-security/

[15] SoftwareSeni — "AI-Generated Code Security Risks — Why Vulnerabilities Increase 2.74x" — https://www.softwareseni.com/ai-generated-code-security-risks-why-vulnerabilities-increase-2-74x-and-how-to-prevent-them/

[16] Propel — "SQL Injection in ORMs 2025: Why Modern Frameworks Still Aren't Safe" — https://www.propelcode.ai/blog/sql-injection-orm-vulnerabilities-modern-frameworks-2025

[17] OWASP — "Top 10 for LLM Applications 2025" — https://owasp.org/www-project-top-10-for-large-language-model-applications/

[18] OWASP — "Top 10:2025 — A05 Injection" — https://owasp.org/Top10/2025/A05_2025-Injection/

[19] Kaspersky — "Security risks of vibe coding and LLM assistants for developers" — https://www.kaspersky.com/blog/vibe-coding-2025-risks/54584/

[20] Databricks — "Passing the Security Vibe Check: The Dangers of Vibe Coding" — https://www.databricks.com/blog/passing-security-vibe-check-dangers-vibe-coding

Нужен такой же контроль в ваших изменениях и релизах?

Покажем пример такого замечания на вашем сценарии и соберём пилотный контур без лишней суеты.

Запросить пилот Все статьи
Дальше по теме

Ещё материалы

Все статьи
24 июня 2026 18 мин

Политика использования ИИ в команде разработки: как не опоздать, когда всё уже идёт

Если разработчики уже пишут код с ИИ ассистентами, политика нужна сегодня — а не после первого инцидента TL;DR Более 84% разработчиков уже используют или планируют использовать ИИ инструменты 1 , и большинство делают эт…

Открыть материал
23 июня 2026 16 мин

Регистрация и онбординг пользователей: где появляются первые уязвимости

Форма регистрации выглядит просто. За ней скрывается один из наиболее атакуемых периметров приложения. TL;DR Форма регистрации и онбординг флоу — это первая поверхность атаки, которую видит злоумышленник. Большинство уя…

Открыть материал
23 июня 2026 15 мин

Бизнес-логика и мошенничество в продукте: что проверять до запуска

Ваш продукт работает правильно. Но это не значит, что он работает безопасно. TL;DR Уязвимости бизнес логики — это не сломанный код, а сломанные правила: приложение делает именно то, что написано, но не то, что задумывал…

Открыть материал