Vercel, Discord, X: Секреты взлома IT-гигантов через supply-chain атаки 2024

Vercel, Discord, X: Секреты взлома IT-гигантов через supply-chain атаки 2024

Что такое supply-chain атака и почему она страшнее DDoS?

В сфере информационной безопасности принято уделять максимум внимания защите периметра: настройке фаерволов, защите от SQL-инъекций и предотвращению DDoS-атак. Однако статистика последних лет показывает, что главная угроза исходит не извне, а изнутри — из инструментов и библиотек, которым вы доверяете. Давайте разберёмся, почему supply-chain атаки стали ночным кошмаром для CISO. ↓

Атака на цепочку поставок (supply-chain attack) — это метод взлома, при котором злоумышленник внедряет вредоносный код не в целевую систему напрямую, а в сторонние компоненты, которые эта система использует. Это может быть NPM-пакет, Docker-образ, CI/CD инструмент или даже SaaS-платформа для документации.

В отличие от DDoS, который «кладёт» сервис и делает его недоступным, supply-chain атаки действуют скрытно. Вредоносный код может месяцами находиться внутри продакшн-сборки, собирая переменные окружения, ключи доступа и данные пользователей.

  • DDoS: Громко, заметно сразу, цель — отказ в обслуживании.
  • Supply-chain: Тихо, обнаруживается постфактум, цель — полный контроль и кража данных.

Уязвимости такого рода особенно опасны тем, что они обходят традиционные средства защиты. Ваш код может быть идеальным, но если вы импортируете библиотеку, автор которой потерял доступ к аккаунту, ваш проект скомпрометирован.

От NPM до CI/CD: 5 главных векторов компрометации

5 главных векторов компрометации: от NPM-пакета до CI/CD-конвейера
5 главных векторов компрометации: от NPM-пакета до CI/CD-конвейера

Современная разработка напоминает сборку конструктора LEGO: до 90% кода в проекте — это сторонние зависимости. Хакеры прекрасно это понимают и смещают фокус атак с поиска дыр в вашем коде на поиск слабых звеньев в вашей инфраструктуре. Рассмотрим основные векторы. ↓

1. Тайпсквоттинг (Typosquatting)
Злоумышленники публикуют пакеты с именами, похожими на популярные библиотеки. Расчет на то, что разработчик опечатается при установке.

  • Пример: npm install reat вместо npm install react. Внутри пакета — оригинальный код библиотеки плюс скрипт для кражи .env файла.

2. Компрометация мейнтейнера
Хакер получает доступ к аккаунту разработчика популярного пакета (через фишинг или перебор паролей) и публикует новую минорную версию с бэкдором. Автоматические обновления зависимостей мгновенно доставляют вредоносный код тысячам пользователей.

3. Dependency Confusion
Если компания использует внутренние приватные пакеты (например, @company/auth), хакер может зарегистрировать пакет с таким же именем в публичном репозитории (npm, PyPI) и выставить более высокую версию. Пакетный менеджер по умолчанию может скачать «более свежую» версию из публичного источника.

4. Внедрение в CI/CD
Атака на инструменты сборки (Jenkins, GitHub Actions, CircleCI). Если злоумышленник получает доступ к конфигурации пайплайна, он может изменить процесс сборки так, чтобы вредоносный код внедрялся в артефакт на этапе компиляции, даже если в исходном коде репозитория всё чисто.

5. Атаки через сторонние сервисы (SaaS)
Это вектор, который набирает популярность в 2024 году. Компания интегрирует сторонний сервис (чат-бот, аналитика, платформа документации) в свой продукт. Взлом этого сервиса автоматически открывает доступ к данным компании-клиента.

Курс AI для разработчиков. Увеличиваем производительность разработчиков за счет внедрения AI-инструментов.

Кейсы с Vercel, Discord и X: главные ошибки, которые они допустили

Один из самых громких инцидентов последнего времени, раскрытый исследователями (включая 16-летнего хакера), наглядно демонстрирует опасность доверия сторонним SaaS-решениям. Жертвами потенциальной атаки стали технологические гиганты: Vercel, Discord, X (бывший Twitter) и Cursor. Давайте посмотрим, как это произошло. ↓

Проблема крылась не в коде самих компаний, а в платформе для документации Mintlify, которую они использовали. Mintlify — это популярный AI-сервис, который превращает Markdown-файлы в красивые сайты с документацией.

Исследователи обнаружили критическую уязвимость (Stored XSS) в том, как Mintlify рендерил контент. Суть проблемы заключалась в следующем:

  1. Платформа позволяла внедрять пользовательские React-компоненты.
  2. Злоумышленник мог создать вредоносный компонент или манипулировать существующим.
  3. При посещении страницы документации в браузере жертвы выполнялся произвольный JavaScript-код.

Почему это критично для Discord и Vercel?
Документация часто размещается на поддоменах основного сайта (например, docs.discord.com или vercel.com/docs). Современные браузеры и механизмы cookies часто имеют настройки, позволяющие скриптам на поддомене получать доступ к данным основного домена (если cookies установлены с флагом Domain=.discord.com).

В случае успешной эксплуатации, атакующий мог бы:

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

Главная ошибка
Ошибка заключалась в избыточном доверии к поставщику услуг. Компании интегрировали стороннее решение, которое обрабатывает и отображает контент, не изолировав его должным образом от основной авторизационной сессии. Это классический пример supply-chain атаки через SaaS-провайдера.

Как Snyk и Trivy спасут ваш проект: аудит зависимостей за 20 минут

Вручную проверить тысячи зависимостей в nodemodules невозможно. Для этого существуют специализированные инструменты SCA (Software Composition Analysis). Рассмотрим два самых популярных решения, которые должны быть в арсенале каждого разработчика. ↓

Snyk: поиск уязвимостей в коде и зависимостях

Snyk — это стандарт индустрии для поиска уязвимостей в open-source библиотеках. Он интегрируется с GitHub, GitLab и CI/CD, но мы рассмотрим использование через CLI.

Установка и запуск:

Для macOS:

brew tap snyk/tap
brew install snyk

Для Linux/Windows (через npm):

npm install -g snyk

После установки необходимо авторизоваться:

snyk auth

Теперь, находясь в корне проекта, запустите сканирование:

snyk test

Snyk проанализирует ваш package.json и package-lock.json, сверит версии с базой данных уязвимостей и выдаст отчет. Вы увидите не только список проблем, но и пути их исправления (например, "Upgrade react to version 18.2.0").

Trivy: комплексный сканер от Aqua Security

Trivy — это универсальный сканер, который проверяет не только зависимости файловой системы, но и Docker-образы, а также конфигурации IaC (Terraform, Kubernetes).

Установка:

Для macOS:

brew install trivy

Для Linux (Debian/Ubuntu):

sudo apt-get install wget apt-transport-https gnupg lsb-release
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
echo deb https://aquasecurity.github.io/trivy-repo/deb $(lsbrelease -sc) main | sudo tee -a /etc/apt/sources.list.d/trivy.list
sudo apt-get update
sudo apt-get install trivy

Примеры использования:

Сканирование локального проекта:

trivy fs .

Сканирование Docker-образа (критически важно перед деплоем):

trivy image python:3.9-alpine

Trivy покажет уязвимости системных библиотек внутри контейнера (например, старая версия openssl в базовом образе), о которых разработчики часто забывают.

Принципы 'нулевого доверия': как построить непробиваемую защиту

Принципы 'нулевого доверия': построение непробиваемой защиты
Принципы 'нулевого доверия': построение непробиваемой защиты

Концепция Zero Trust («Никому не доверяй») становится единственно верным подходом в условиях, когда периметр сети размыт. В контексте supply-chain безопасности это означает отказ от презумпции невиновности по отношению к любым внешним и внутренним компонентам. ↓

Zero Trust базируется на трех китах:

  1. Явная верификация. Всегда проверяйте и авторизуйте каждый запрос, независимо от того, пришел он из внутренней сети или из интернета.
  2. Минимальные привилегии. Доступ выдается только на необходимое время и только к необходимым ресурсам (Just-In-Time access).
  3. Допущение компрометации. Стройте архитектуру так, как будто вас уже взломали. Это минимизирует радиус поражения (Blast Radius).

Как применить это к разработке?

  • Сетевая сегментация: Сборочные серверы (CI/CD) не должны иметь прямого доступа к продакшн-базам данных. Даже если хакер внедрит код в пайплайн сборки, он не должен получить доступ к пользовательским данным.
  • Изоляция зависимостей: Запуск npm install должен происходить в изолированном контейнере без доступа к секретам. В скриптах preinstall и postinstall часто прячется малварь, которая пытается прочитать ~/.ssh или переменные окружения.
  • Пининг версий: Никогда не используйте диапазоны версий (^1.2.3) для критических зависимостей. Всегда фиксируйте точную версию в lock-файле. Обновление — это осознанный процесс, а не автоматическое действие.

SLSA и Sigstore: методы защиты от компрометации репозиториев

Чтобы гарантировать, что код, который вы запускаете в продакшене, действительно соответствует исходному коду в репозитории, индустрия разработала новые стандарты. Познакомимся с SLSA и Sigstore. ↓

SLSA (Supply-chain Levels for Software Artifacts)

SLSA (читается как "salsa") — это фреймворк безопасности, который позволяет классифицировать надежность цепочки поставок. Он определяет 4 уровня защиты:

  • Уровень 1: Процесс сборки задокументирован (есть скрипт сборки).
  • Уровень 2: Сборка происходит на выделенном сервере (build service), а не на ноутбуке разработчика. Генерируется "происхождение" (provenance) — подписанный файл, описывающий, кто, как и из чего собрал артефакт.
  • Уровень 3: Среда сборки изолирована, и "происхождение" невозможно подделать.
  • Уровень 4: Наивысшая степень защиты с требованием рецензирования кода двумя людьми (two-person review) и герметичной сборкой.

Внедрение SLSA позволяет ответить на вопрос: "Действительно ли этот бинарный файл был собран из этого коммита на GitHub?".

Sigstore: цифровая подпись для всех

Sigstore решает проблему управления ключами для подписи кода. Раньше разработчикам нужно было хранить GPG-ключи, которые часто теряли или крали. Sigstore предлагает подход "Keyless signing" (подпись без долгоживущих ключей), используя OpenID Connect (например, вход через GitHub или Google) для генерации краткосрочных сертификатов.

Используя инструмент Cosign (часть проекта Sigstore), вы можете подписывать свои Docker-образы:

# Генерация ключей
cosign generate-key-pair

# Подпись образа
cosign sign --key cosign.key user/demo-image:v1

# Проверка подписи (на стороне сервера перед запуском)
cosign verify --key cosign.pub user/demo-image:v1

Это гарантирует, что образ не был подменен в реестре (Docker Hub) после того, как вы его загрузили.

Чек-лист разработчика: 7 шагов для мгновенной защиты проекта

Защита от supply-chain атак требует системного подхода. Мы составили чек-лист, который поможет вам закрыть основные бреши в безопасности вашего проекта уже сегодня. ↓

Выполните эти действия по порядку:

  1. Активируйте 2FA везде.
    Включите двухфакторную аутентификацию на GitHub, GitLab, NPM, PyPI, Docker Hub и облачных провайдерах. Это защита №1 от компрометации аккаунта и внедрения вредоносного кода от вашего имени.
  2. Зафиксируйте зависимости (Lockfiles).
    Убедитесь, что файлы package-lock.json (JS), go.sum (Go), poetry.lock (Python) добавлены в Git. Никогда не деплойте проект, просто выполняя установку последних версий.
  3. Настройте автоматическое сканирование.
    Добавьте Snyk или Trivy в ваш CI/CD пайплайн. Сборка должна падать (exit code 1), если обнаружены уязвимости высокого уровня (High/Critical).
  4. Проведите аудит прав доступа (Least Privilege).
    Проверьте токены доступа (Access Tokens) в CI/CD. Имеет ли токен для деплоя права на чтение всех репозиториев организации? Ограничьте права до минимума.
  5. Изолируйте документацию и внутренние инструменты.
    Если вы используете сторонние SaaS для документации (как в кейсе с Mintlify), размещайте их на отдельном домене (например, docs-company.com), а не на поддомене основного продукта. Это спасет ваши cookies при XSS-атаке.
  6. Используйте Scoped Packages.
    При использовании внутренних пакетов всегда используйте скоупы (например, @mycompany/utils). Настройте .npmrc так, чтобы пакеты с этим скоупом искались только в вашем приватном реестре, чтобы избежать атаки Dependency Confusion.

Отключите скрипты установки (где возможно).
Для NPM используйте флаг --ignore-scripts, если вы не уверены в безопасности пакетов. Это предотвратит выполнение произвольного кода при установке.

npm install --ignore-scripts

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