WebValid
WebValid Team

WebValid ловит «первое домино»: кейс взлома McKinsey, BCG и Bain

AI Coding Security JavaScript Vibe Coding API Keys

В этой статье анализируются реальные инциденты безопасности в McKinsey, BCG и Bain & Company, раскрытые стартапом CodeWall в марте–апреле 2026 года. Основное внимание уделяется уязвимостям на стороне клиента — хардкодным секретам в JavaScript-бандлах и отсутствующим настройкам безопасности, которые инструменты автоматического сканирования обнаруживают еще до деплоя в продакшн.

Автономный ИИ-агент только что вскрыл всю «Большую тройку» мирового консалтинга. McKinsey. BCG. Bain. Самые престижные консультационные фирмы планеты пали жертвой хардкодных секретов, зашитых в продакшн-JavaScript. Не из-за атаки спецслужб. Не из-за эксплойтов нулевого дня. А благодаря ИИ-агенту, который прочитал их публичные JS-бандлы и нашел ключи прямо в исходном коде.

В апреле 2026 года стартап CodeWall опубликовал финальную часть серии материалов, документирующих, как их автономный атакующий агент скомпрометировал ИИ-платформы всех трех фирм MBB. Сценарий каждый раз был идентичным: публично доступная API-документация, незащищенный кредешиал или эндпоинт, и SQL-инъекция, открывающая доступ ко всей базе данных. Общий ущерб? Миллиарды строк конфиденциальных данных — извлечены за время от нескольких минут до нескольких часов.

Самое обидное в том, что наиболее критичные из этих цепочек атак начинались с клиентских артефактов, которые стандартный сканер бандлов пометил бы как опасные — останавливая «первое домино» еще до того, как атака успела масштабироваться. Пока одни дыры были связаны с отсутствием авторизации в API-документации, хардкодные ключи в публичных бандлах доказывают: многие команды фактически выставляют артефакты, которыми воспользуются атакующие для начала взлома. Если вы деплоите сгенерированный нейросетями фронтенд, не сканируя результат сборки, вы оставляете без защиты именно ту точку входа, с которой начинается катастрофа.


Сценарий атаки: три фирмы, один учебник

🔴 Критично · Полная компрометация БД · OWASP A02:2021 Cryptographic Failures

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

McKinsey — Lilli (март 2026) Агент CodeWall просканировал 200+ API-эндпоинтов из публичной документации McKinsey. Он нашел 22 эндпоинта, не требовавших никакой авторизации. Через один из них агент обнаружил SQL-инъекцию — названия полей JSON конкатенировались прямо в SQL-запросы без санитизации. Итог: полный доступ на чтение и запись к продакшн-базе за два часа. Улов: 46,5 млн сообщений чатов, 728 000 секретных файлов, 57 000 учетных записей пользователей и 95 системных промптов с правом записи. Возможность менять промпты означала, что агент мог незаметно влиять на ответы ИИ для 40 000+ консультантов без изменения кода.

BCG — X Portal (март 2026) Агент зафиксировал 372 API-эндпоинта. Один из них принимал необработанный SQL-код без какой-либо авторизации. За ним скрывалось 3,17 триллиона строк данных общим объемом 131 терабайт. Ни аутентификации, ни лимитов на запросы, ни валидации ввода.

Bain — Pyxis (апрель 2026) Этот взлом занял 18 минут. Агент скачал JavaScript-бандл фронтенда и нашел логин и пароль сервисной учетной записи, захардкоженные прямо в исходном коде — вероятно, тестовые данные разработчика, попавшие в релиз. Используя эти данные, агент авторизовался в системе и нашел SQL-инъекцию. Результат: 159 млрд строк данных о транзакциях потребителей, 2,5 млрд строк коммерческой разведки, 9 989 диалогов с ИИ-ботом и 36 869 JWT-токенов со сроком жизни 365 дней без двухфакторной аутентификации.

Общий знаменатель? Каждая атака начиналась с чего-то публично видимого — документации, незащищенных эндпоинтов или учетных данных, лежащих в JavaScript-файле, который любой браузер скачивает по умолчанию.


Роковая ошибка Bain: секреты в JavaScript-бандле

🔴 Критично · Утечка учетных данных в клиентском коде · OWASP A02:2021 Cryptographic Failures

Взлом Bain/Pyxis заслуживает особого внимания, потому что точка входа была самой примитивной и легко предотвратимой. Логин и пароль сервисного аккаунта были захардкожены в JS-бандле. Это ровно тот же класс уязвимости, который вайб-кодеры создают ежедневно, когда ИИ-ассистенты «чинят» неработающие API-запросы, добавляя префикс NEXT_PUBLIC_ к секретным переменным окружения.

Паттерн универсален:

// ❌ Что, вероятно, было в коде Pyxis
// Разработчик или ИИ захардкодили данные во время разработки
const PYXIS_SERVICE_ACCOUNT = {
  username: "svc-pyxis-prod",
  password: "internal-credential-here",
};

async function authenticate() {
  const response = await fetch("/api/auth/login", {
    method: "POST",
    body: JSON.stringify(PYXIS_SERVICE_ACCOUNT),
  });
  return response.json();
}

Когда этот код проходит через бандлер (Webpack, Vite, Turbopack), секреты превращаются в строковые литералы в скомпилированном .js файле. Любой может нажать F12, открыть вкладку Sources и забрать их. Не нужно быть хакером — браузер отдает их бесплатно.

// ✅ Как должны обрабатываться данные
// Только на стороне сервера — никогда не отдавать в клиент
"use server";

export async function authenticateService() {
  // Данные остаются на сервере, никогда не попадают в JS-бандл
  const response = await fetch(process.env.PYXIS_API_URL + "/auth/login", {
    method: "POST",
    body: JSON.stringify({
      username: process.env.PYXIS_SERVICE_USER,
      password: process.env.PYXIS_SERVICE_PASS,
    }),
  });
  return response.json();
}

Это не новая уязвимость. Это OWASP A02:2021 — Проблемы криптографии, описанная еще на заре веб-безопасности. Но скорость вайб-кодинга заставляет разработчиков пропускать этап проверки того, что именно улетело в скомпилированный бандл. Подробный технический разбор того, как это происходит в React и Next.js проектах, читайте в нашем гайде: Leaked API Keys: Как ИИ компрометирует разработчиков при генерации кода.


Факт-чек: Масштабы не гипотетичны

🔍 Публичный кейс-стади · Верифицированные отчеты · Ответственное раскрытие завершено

Все цифры в этой статье взяты из опубликованных исследований CodeWall и подтвержденных публичных раскрытий:


Долина разрывов: Почему Git-сканеры пропускают секреты перед продакшном

Инженерный состав Bain — это не новички. В McKinsey работают тысячи топовых инженеров. Тем не менее, все три фирмы пропустили одну и ту же уязвимость, потому что смотрели не в ту часть пайплайна.

Золотой стандарт безопасности сегодня — это SAST (Static Application Security Testing). Инструменты вроде GitGuardian или TruffleHog сканируют ваш репозиторий на наличие секретов. Они отлично находят пароль, который вы случайно закоммитили в config.ts. Но у них есть смертельная слепая зона: Инъекция на этапе сборки.

В современной веб-разработке (Next.js, Vite, Webpack) мы используем переменные окружения. В исходном коде это выглядит так:

const API_URL = process.env.NEXT_PUBLIC_API_URL;
const SERVICE_TOKEN = process.env.SERVICE_TOKEN;

Сканер репозитория видит это и считает код «чистым». Секрета в Git нет — он безопасно лежит в хранилище CI/CD (GitHub Secrets, Vercel Env).

Но затем происходит этап сборки (Build Step). Бандлер берет ваш код и заменяет обращения к process.env на их реальные значения из окружения. Именно в этот момент «чистый» код превращается в «дырявый» бандл. Итоговый JS-файл для продакшна уже содержит секрет открытым текстом. Но так как этот файл является временным артефактом сборки, ваши стандартные инструменты сканирования репозитория его никогда не увидят.

Это — главная фишка WebValid. Мы не сканируем ваш «чистый» исходный код. Мы сканируем ваш «грязный» продакшн-бандл — тот самый финальный результат, который получает пользователь (и хакер). Мы ловим утечки, которые появляются только после того, как отработал ваш пайплайн сборки.


Почему это касается каждого: от Enterprise до Vibe-Coding

Уязвимость класса А в Bain, McKinsey и BCG возникла не из-за лени, а из-за инфраструктурного хаоса (Infrastructure Sprawl). В глубоком энтерпрайзе секреты утекают через:

Для современного Vibe-кодера (инди-хакеры, стартапы) точка назначения та же, но путь другой. Вы страдаете не от сложности инфраструктуры, а от AI-ускорения.

ИИ-ассистенты (Cursor, Copilot) контекстно-слепы. Они оптимизируют тот файл, который вы редактируете прямо сейчас, не задумываясь о вашей архитектуре. Когда fetch падает, потому что переменная окружения undefined на клиенте, ИИ радостно советует: «Просто добавь префикс NEXTPUBLIC, чтобы сделать ее доступной клиенту».

Запрос заработал. Вы замержили. Вы только что автоматизировали путь к взлому.

Будь вы консультантом в Bain, сражающимся с глобальной инфраструктурой, или одиночкой, «вайбящим» в Cursor над новым SaaS — фундаментальный риск один: вы пропускаете этап верификации того, что реально улетело в скомпилированный результат.


Что ловит автоматический сканер бандлов

Взлом Bain занял 18 минут. Сканирование бандла занимает 20 секунд. Вот что ловит автоматика, а что требует других проверок:

Категория уязвимостиWebValid Security ScannerПример из взломов MBB
Хардкодные логины/пароли в JS✅ Находит паттерны в тексте бандлаBain/Pyxis — данные сервисного аккаунта
API-ключи и токены в коде✅ Сканирует на Stripe, OpenAI, JWT и др.Bain — 36 869 JWT-токенов
Отсутствие заголовков (CSP, HSTS)✅ Проверяет HTTP-заголовки ответаВсе 3 фирмы — слабые настройки защиты
Смешанный контент (HTTP на HTTPS)✅ Сигнализирует о небезопасных запросахОшибки сетевых конфигураций
SQL-инъекции в API-эндпоинтах❌ Нужно тестирование бэкендаMcKinsey, BCG, Bain — везде были инъекции
Логика аутентификации API❌ Нужно ревью бизнес-логикиBCG — эндпоинт без авторизации
Утечка системных промптов❌ Это не артефакт бандлаBain — утечка промпта на 18к символов

WebValid — это сканер клиентской безопасности. Он анализирует скомпилированный фронтенд: JS-бандлы, HTTP-заголовки и сетевые запросы. Он не заменяет пентест, не ищет SQL-инъекции и не аудирует API бэкенда. Он ловит «первое домино» — утечку мандата или отсутствие заголовка, с которых начинается атака.


Почему ручной аудит — это путь к провалу

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

Vibe-кодер деплоит несколько раз в день. Энтерпрайз-команды шипят сотни микросервисов. Никакой человеческий процесс не может проверять результат сборки каждого хотфикса со 100% стабильностью. Это не вопрос дисциплины, это вопрос отсутствия автоматизации на последней миле безопасности.

Поймайте «первое домино» до того, как оно упадет

Взлом Bain занял 18 минут. Первичную утечку можно было обнаружить за 20 секунд.

Обнаруживая открытые учетные данные и сетевые ошибки в ваших бандлах, вы останавливаете атаку до того, как она доберется до вашего бэкенда. Вам не нужен публичный продакшн-URL, чтобы защититься. Большинство современных команд используют туннели (например, Ngrok или Cloudflare Tunnel) для аудита своих локальных билдов или закрытых стейджингов перед тем, как они станут публичными.

  1. Запустите проект (или локальный билд) через туннель.
  2. Вставьте URL туннеля в WebValid.
  3. Получите готовый ai-fix-prompt в Markdown — вставьте его в свой ИИ-ассистент и закройте дыры еще до того, как код попадет на основной сервер.

Запустите бесплатный аудит безопасности вашего сайта или локального билда (через туннель) прямо сейчас:

Протестировать проект бесплатно на WebValid

Есть вопросы по результатам аудита? Начать бесплатный аудит


Официальная документация

Стандарты безопасности

Кейс-стади и отчеты

Безопасность фреймворков

Эта статья была полезна?