Цепочки поставок программного обеспечения снова под ударом. Исследователи из JFrog обнаружили в реестре пакетов npm (Node Package Manager) вредоносный пакет, который маскируется под официальный клиент командной строки Bitwarden. Он получил версию 2026.4.0 и имя @bitwarden/cli. Атака нацелена в первую очередь на разработчиков и сборочные среды непрерывной интеграции (CI). Один установленный пакет способен выкачать из системы SSH-ключи, токены доступа к GitHub, npm, облачным сервисам AWS, GCP и Azure, а также конфигурационные файлы инструментов с искусственным интеллектом.
Описание
На первый взгляд пакет выглядит как легитимный. В метаданных указан автор Bitwarden, а встроенная информация внутри скомпилированного приложения ссылается на версию 2026.3.0. Однако в корневой файл package.json внесены изменения. Вместо ожидаемой точки входа в коде прописан вызов скрипта bw_setup.js. Более того, именно этот скрипт запускается на этапе preinstall - до того, как пакет будет установлен. Таким образом, простая команда "npm install @bitwarden/cli" уже инициирует вредоносную активность.
Установщик bw_setup.js выполняет несколько действий. Сначала он проверяет, установлена ли среда выполнения Bun. Если нет, он скачивает исполняемый файл Bun с GitHub (репозиторий oven-sh/bun) и распаковывает рядом с собой. Затем он запускает скрипт bw1.js в этой среде. Такой обходной манёвр позволяет злоумышленникам обойти стандартный путь выполнения на Node.js и снизить вероятность обнаружения. Сам скрипт bw1.js - это сильно обфусцированный код. После деобфускации специалисты JFrog обнаружили настоящий арсенал для кражи секретов.
Вредоносная программа состоит из трёх основных сборщиков. Первый - сборщик файловой системы. Он сканирует домашнюю директорию и ключевые пути на наличие SSH-материалов ("~/.ssh/id_*", "~/.ssh/known_hosts"), Git-учётных данных (".git/config", ".git-credentials"), файлов ".npmrc", "~/.npmrc", а также историю команд bash и zsh. Особое внимание уделяется облачным конфигурациям: "~/.aws/credentials", "~/.config/gcloud/credentials.db", файлы с расширением ".env". Кроме того, скрипт охотится за настройками AI-инструментов, например "~/.claude.json", "~/.claude/mcp.json", ".kiro/settings/mcp.json". Такая избирательность говорит о том, что злоумышленники целенаправленно ищут среды, где разработчики используют кодовых помощников или локальные инструменты автоматизации, которые могут содержать API-ключи.
Второй сборщик - оболочки и окружения. Он запускает команду "gh auth token", чтобы получить действующий токен для GitHub CLI, а затем собирает всё содержимое "process.env". После сериализации он ищет в нём паттерны токенов GitHub ("ghp_...", "gho_...") и npm ("npm_..."). Третий сборщик ориентирован на GitHub Actions. Если токен позволяет, он перечисляет репозитории с доступом на запись, считывает секреты Actions, создаёт новую ветку и workflow-файл, запускает его, ожидает завершения, скачивает артефакт и удаляет все следы. Таким образом атакующие не просто воруют статические данные, а активно проникают в автоматизированные среды сборки.
Данные шифруются перед отправкой. Сначала результаты преобразуются в JSON, сжимаются gzip, затем генерируется случайный 32-байтовый ключ AES-256-GCM и 12-байтовый вектор инициализации. Сам ключ шифруется встроенным открытым ключом RSA через OAEP-SHA256. Зашифрованный конверт и ключ отправляются как JSON-объект на сервер аудита - "hxxps://audit.checkmarx.cx/v1/telemetry". Именно этот домен, связанный с IP-адресом 94.154.172.43, выступает основным каналом вывода данных. Если прямое HTTPS-соединение не удаётся, вступает в дело резервный механизм на основе GitHub.
Злоумышленники запрограммировали три запасных сценария. Первый: они выполняют поиск коммитов с определённым комментарием "LongLiveTheResistanceAgainstMachines" и извлекают из них двойные base64-кодированные персональные токены доступа (PAT). Второй: если основной домен недоступен, они ищут коммиты с фразой "beautifulcastle", подписанные встроенным RSA-ключом, и таким образом получают новый адрес для отправки данных. Третий: используя добытый PAT, они создают репозиторий на учётной записи жертвы и загружают туда зашифрованные файлы в каталог "results/". Примечательно, что названия этих репозиториев генерируются из слов вселенной "Дюна": sardaukar, fremen, atreides, sandworm, а описание репозитория содержит "Shai-Hulud: The Third Coming". Это совпадает с тематикой более ранней кампании Shai Hulud, однако точной связи пока не установлено.
Последствия этой атаки трудно переоценить. Один неосторожный запуск может привести к компрометации не только локального окружения разработчика, но и всего инфраструктурного ландшафта компании. Утекшие SSH-ключи и Git-токены позволяют злоумышленникам получить доступ к исходному коду. Облачные секреты AWS, GCP и Azure дают возможности для дорогостоящих инцидентов - от запуска майнеров до кражи данных. Кроме того, под ударом оказываются конфигурации AI-инструментов, которые зачастую содержат ключи к платным сервисам.
Реагируя на инцидент, специалистам по безопасности следует немедленно удалить поддельный пакет глобально: "npm uninstall -g @bitwarden/cli". После этого нужно очистить кеш npm ("npm cache clean --force") и настроить игнорирование скриптов при установке ("npm config set ignore-scripts true"). Затем необходимо проверить рабочие каталоги на наличие артефактов загрузчика: файлов "bun", "bun.exe", "bw1.js", "bw_setup.js". Команда "rg -n "audit\\.checkmarx\\.cx|LongLiveTheResistanceAgainstMachines|beautifulcastle" ." поможет найти возможные остаточные следы. Обязательно отозвать все GitHub-токены, найдённые на скомпрометированной системе, и ротировать npm-токены. Следует перевыпустить ключи доступа AWS, просмотреть журналы Azure Key Vault и GCP Secret Manager на предмет несанкционированных запросов. Кроме того, стоит проверить GitHub Actions на предмет необычных рабочих процессов и веток, а также проанализировать историю команд оболочки на предмет утечек. На сетевых шлюзах необходимо заблокировать домен "audit.checkmarx.cx" и IP "94.154.172.43". В дополнение рекомендуется использовать инструменты контроля цепочки поставок, такие как JFrog Xray, чтобы предотвратить установку подобных захваченных пакетов.
В целом данный инцидент показывает эволюцию киберугроз в мире разработки. Вместо простых похитителей токенов мы видим многоступенчатый фреймворк, который умеет переключаться между каналами вывода, шифровать украденные данные и использовать саму платформу GitHub в качестве сервера управления. Подобные атаки требуют от команд не только своевременного обнаружения, но и проактивной блокировки подозрительных пакетов до того, как они попадут в рабочее окружение.
Индикаторы компрометации
Package
- @bitwarden/cli
Malicious Version
- 2026.4.0
IPv4
- 94.154.172.43
Domains
- audit.checkmarx.cx
URLs
- https://api.github.com/search/commits?q=beautifulcastle%20&sort=author-date&order=desc
- https://api.github.com/search/commits?q=LongLiveTheResistanceAgainstMachines&sort=author-date&order=desc&per_page=50
- https://audit.checkmarx.cx/v1/telemetry
- https://github.com/oven-sh/bun/releases/download/bun-v1.3.13/<asset>.zip
SHA256
- 167ce57ef59a32a6a0ef4137785828077879092d7f83ddbc1755d6e69116e0ad
- 18f784b3bc9a0bcdcb1a8d7f51bc5f54323fc40cbd874119354ab609bef6e4cb
- 8605e365edf11160aad517c7d79a3b26b62290e5072ef97b102a01ddbb343f14