Взлом Bitwarden CLI на npm: 1,5 часа кражи токенов и SSH-ключей
Подменили @bitwarden/cli в npm на 1,5 часа — успевали воровать GitHub/npm-токены, SSH-ключи и конфиги ИИ-ассистентов Claude, Kiro, Cursor, Codex CLI и Aider. Vault-пароли Bitwarden не затронуты — взломали только npm-канал доставки CLI. Ставили 2026.4.0 — ротируйте ключи прямо сейчас.
Новости TprogerПодменили @bitwarden/cli в npm на 1 час 33 минуты — за это окно успевали воровать GitHub/npm-токены, SSH-ключи и конфиги ИИ-ассистентов Claude, Kiro, Cursor, Codex CLI и Aider у всех, кто зашёл поставить пакет. Окно атаки — с 17:57 до 19:30 по времени Нью-Йорка 22 апреля (с 00:57 до 02:30 МСК 23 апреля). Vault-пароли самого менеджера Bitwarden не трогали — взломали только npm-канал доставки CLI. Если ставили версию 2026.4.0 — считайте ключи с этой машины скомпрометированными и ротируйте их прямо сейчас.
Ключевые выводы
- Скомпрометирована одна npm-версия @bitwarden/cli@2026.4.0. Окно атаки — 1 час 33 минуты 22 апреля 2026 года.
- Vault-данные пользователей Bitwarden не затронуты. Пострадал только npm-канал доставки CLI и те, кто успел поставить эту сборку.
- Вектор — скомпрометированный action checkmarx/ast-github-action, который Bitwarden подтягивал в свой CI. По словам исследователей, это первый зафиксированный взлом пакета через npm trusted publishing.
- Малварь таргетит ИИ-ассистенты Claude, Cursor, Codex CLI, Aider и AWS-based Kiro — отдельный модуль собирает их конфиги и API-ключи.
- Если ставили — ротируйте npm/GitHub-токены, SSH-ключи и облачные креденшлы AWS/Azure/GCP; проверьте CI/CD-пайплайны и публичные репозитории со строкой «Shai-Hulud» в имени.
Что случилось с пакетом
По данным The Hacker News, в ночь с 22 на 23 апреля 2026 года в npm-реестре появилась версия @bitwarden/cli@2026.4.0 с дополнительным файлом bw1.js внутри. Сборка была доступна 1 час 33 минуты — с 17:57 до 19:30 по времени Нью-Йорка, — после чего её сняли с публикации. Первыми на неё обратили внимание исследователи Socket, JFrog и OX Security. JFrog описал поведение как «кражу GitHub/npm-токенов, содержимого .ssh, .env, истории shell, секретов GitHub Actions и облачных провайдеров с выгрузкой на внешние домены и в виде коммитов в GitHub».
Bitwarden подтвердил инцидент и уточнил, что «расследование не обнаружило признаков доступа к данным пользовательских хранилищ и компрометации продакшн-систем». По словам компании, доступ нарушителя был отозван, вредоносный релиз помечен как deprecated, по версии 2026.4.0 заводится отдельный CVE. Пострадавшие — только те, кто успел скачать пакет в полуторачасовом окне и выполнил его установку.
Как устроен троян
Механика по отчёту Socket проста, но многоступенчата. В package.json зловредной версии добавлен preinstall-хук, который запускает скрипт bw_setup.js. Тот проверяет наличие Bun — альтернативного JS-рантайма — и, если его нет, скачивает. Затем Bun-ом запускается обфусцированный загрузчик bw1.js. Bun тащат с собой не случайно: на машине жертвы его, скорее всего, нет, а корпоративный EDR (антивирус нового поколения для рабочих станций и серверов) реагирует на неожиданный бинарник хуже, чем на стандартный npm-скрипт. Preinstall-хук при этом срабатывает ещё до того, как код пакета формально «установлен».
- npm- и GitHub-токены из локальных конфигов и переменных окружения;
- приватные SSH-ключи из
~/.ssh; - содержимое
.env-файлов и историю shell (.bash_history,.zsh_history); - секреты GitHub Actions из переменных окружения CI;
- креденшлы облачных провайдеров — AWS, Azure, Google Cloud;
- конфиги и API-ключи ИИ-ассистентов Claude, Cursor, Codex CLI, Aider и AWS-based Kiro.
Собранные данные шифруются AES-256-GCM и выгружаются двумя каналами. Основной — POST на домен audit.checkmarx[.]cx (конкретно путь /v1/telemetry), который притворяется инфраструктурой Checkmarx. Резервный — малварь создаёт публичные GitHub-репозитории в аккаунте жертвы и кладёт туда зашифрованный payload. В названиях репозиториев встречается строка «Shai-Hulud: The Third Coming» — отсылка к прошлогодней одноимённой кампании в npm. OX Security подчёркивает, что такой тайник (по терминологии безопасников — dead-drop) через GitHub опасен отдельно: утёкшие секреты становятся доступны любому, кто ищет по публичным репозиториям, — а системы защиты почти не следят за исходящим трафиком в GitHub.
Поверх этого в бинарнике есть модуль-червь: с украденным npm-токеном малварь находит все пакеты, которые жертва имеет право публиковать, и вбрасывает в них тот же payload. Endor Labs называет его «CanisterSprawl» и считает один из самых полных npm supply chain-пейлоадов на сегодняшний день: шесть разных поверхностей для сбора секретов, OIDC- и cloud-кража, самораспространение через npm-публикации и отдельный модуль для ИИ-ассистентов.
Отдельный удар по ИИ-ассистентам
Отдельный модуль малвари специально ищет артефакты ИИ-кодеров — API-ключи OpenAI и Anthropic из конфигов Claude, Cursor и Codex CLI, токены Aider, настройки AWS-based Kiro. Endor Labs считает, что это один из первых публично задокументированных случаев, когда supply chain-атака отдельной веткой целится на «кошельки разработчиков у ИИ». Ключ к Anthropic или OpenAI — это не только деньги на балансе аккаунта жертвы, но и возможность с его помощью заставить ИИ-ассистента писать закладки в код при следующих авто-запросах.
Почему малварь пропускает русскую локаль
Малварь завершается без выполнения, если в системе выставлена русская локаль. Socket отмечает три возможных причины: отдельный оператор, использующий общую инфраструктуру, отколовшаяся группа с идеологическими мотивами или эволюция самой кампании. На практике для российских разработчиков это не даёт защиты: большинство dev-машин, серверов и CI-раннеров работают с англоязычной локалью по умолчанию (обычно en_US.UTF-8), поэтому пропуск по локали чаще всего не срабатывает.
Что делать, если могли установить 2026.4.0
- Сначала убедитесь, что пакет действительно попал в ваши машины и раннеры: прогрепайте
package-lock.json,pnpm-lock.yamlиyarn.lockна@bitwarden/cliверсии 2026.4.0, посмотрите логи npm-установок в ночь на 23 апреля МСК. - Ротируйте все токены с этих машин: npm-токены, GitHub PAT (включая fine-grained), SSH-ключи, AWS access/secret keys и STS-сессии, Azure SP, GCP service accounts.
- Замените секреты в GitHub Actions и других CI-системах, где пакет мог запускаться, — включая secrets, variables и OIDC-конфигурации.
- Пройдитесь по API-ключам ИИ-ассистентов (Anthropic, OpenAI, Cursor, Aider) и отзовите их в кабинетах провайдеров; сверьте биллинг на предмет аномальных трат.
- Проверьте публичные репозитории в своём GitHub-аккаунте: ищите имена в формате
<слово>-<слово>-<3 цифры>(например,fremen-muaddib-042) со строкой «Shai-Hulud» в README и удалите. - Откатитесь на безопасную версию CLI — 2026.3.x или актуальную стабильную, которую Bitwarden опубликовал после инцидента. Ставьте её через
npm i @bitwarden/cli@<версия>, а не черезlatestили диапазон.
Связь с Checkmarx и первый взлом через npm trusted publishing
Накануне, 21 апреля, Checkmarx раскрыла собственный инцидент — компрометацию KICS Docker-образов, GitHub-расширений и пакета checkmarx/ast-github-action, который используется во многих CI-пайплайнах. По данным Endor Labs, репозиторий Bitwarden подтягивал именно этот action, и через него злоумышленники получили доступ к npm-каналу. Socket приводит прямые пересечения: тот же домен audit.checkmarx[.]cx, тот же паттерн обфускации __decodeScrambled с seed-значением 0x3039 — технический отпечаток, указывающий на одних и тех же авторов, — плюс тот же приём «украсть → выгрузить в GitHub → распространиться дальше».
Исследователь Аднан Хан утверждает, что это первый зафиксированный случай компрометации пакета, использующего npm trusted publishing — механизм OIDC-публикации, при котором GitHub Actions обменивается на короткоживущий npm-токен без долгоживущих секретов в CI. Его как раз продвигали в ответ на регулярные утечки npm-токенов у мейнтейнеров. На деле trusted publishing оказался не панацеей: если нарушитель получает доступ к GitHub Actions-воркфлоу с правом публиковать пакет, OIDC-токен ему выдаёт сам npm. Атрибуция у исследователей — группа TeamPCP, уже засветившаяся на взломах LiteLLM и Trivy. Аккаунт TeamPCP в X на момент выхода материала заблокирован.
Часто задаваемые вопросы
Я пользуюсь менеджером паролей Bitwarden — мой vault в опасности?
Нет. Атака затронула только npm-канал доставки CLI-клиента. Vault-данные, логины, пароли и 2FA-секреты лежат в отдельной инфраструктуре и, по заявлению Bitwarden, не затронуты. Мобильные и десктопные приложения, браузерные расширения и веб-клиент распространяются другими каналами и не пострадали.
Как понять, выполнилась ли малварь на моей машине?
Если preinstall-хук отработал при установке 2026.4.0 — считайте, что да. Дополнительные индикаторы компрометации: исходящие запросы к audit.checkmarx[.]cx в логах прокси или EDR, появление незнакомых публичных репозиториев в вашем GitHub-аккаунте в ночь на 23 апреля МСК, новые workflow-файлы в репозиториях с правом записи у скомпрометированного токена. Если найдёте хоть один из признаков — переходите сразу к ротации.
Почему малварь не запускается в русской локали?
Точную причину атрибутировать сложно. Socket предлагает три версии: отдельный оператор, использующий общую инфраструктуру, отколовшаяся группа с идеологическими мотивами или эволюция самой кампании. Для практики важно одно: проверка идёт по локали ОС, а не по географии. Большинство dev-машин и CI-раннеров в России работают на en_US.UTF-8, поэтому пропуск по локали защиты не даёт.
Что такое npm trusted publishing и почему этот инцидент — прецедент?
Trusted publishing — механизм публикации npm-пакетов через OIDC-токен от GitHub Actions, без долгоживущих npm-токенов в секретах. Его как раз продвигали в ответ на регулярные утечки токенов у мейнтейнеров. Bitwarden настроил публикацию именно так — и именно это не спасло: нарушитель через цепочку Checkmarx получил контроль над воркфлоу, а npm по стандартной OIDC-процедуре выдал ему валидный короткоживущий токен. Аднан Хан считает, что это первый публично задокументированный случай такой эксплуатации.
Связан ли инцидент с Checkmarx и кампанией Shai-Hulud прошлого года?
Да. Bleeping Computer и The Hacker News подтвердили у Bitwarden и Socket общие индикаторы: endpoint audit.checkmarx[.]cx, обфускация с seed 0x3039, имена репозиториев в формате <слово>-<слово>-<3 цифры> и строка «Shai-Hulud: The Third Coming». Атрибуция ведёт к группе TeamPCP, уже засветившейся на взломах LiteLLM, Trivy и Checkmarx.
У нас пакет тянется через CI автоматически — с чего начать?
Сначала изолируйте затронутый проект: отключите автосборки на время разбора. Затем ротируйте все секреты раннера — npm-токен, GitHub PAT и OIDC-роли, облачные креденшлы. Пройдите по логам workflow run на ночь на 23 апреля МСК, чистите кеши node_modules и Bun. Если workflow с заражённого раннера успел что-то опубликовать под вашими правами — проверьте все пакеты скоупа организации на свежие коммиты и откатите подозрительные.
Безопасно ли сейчас ставить @bitwarden/cli заново?
Да, но закрепите версию явно. Вредоносная 2026.4.0 помечена как deprecated, свежие релизы опубликованы по чистой цепочке. Ставьте через npm i @bitwarden/cli@<версия>, а не через latest или диапазон, и коммитьте package-lock.json в репозиторий.
Выводы для npm-экосистемы и supply chain
Случай укладывается в серию ударов по цепочке доставки последних двух недель: Trivy и LiteLLM на PyPI, Axios и PyPI, теперь Checkmarx и Bitwarden. Характерная деталь — защитный слой не спасает: trusted publishing, OIDC и короткоживущие токены не помогают, если злоумышленник уже получил доступ к CI-воркфлоу. Практический вывод: pin-версии в лок-файлах, отдельный CI-аккаунт с минимальными правами, еженедельная ревизия CI-секретов и мониторинг собственного GitHub на появление незнакомых публичных репозиториев. Инвентаризация секретов, которые ходят через CI/CD, перестала быть теоретическим упражнением.