Security Blog

Собирать должно быть нечего

#109

October 2, 2026 · By Marketing team

← All posts

Скомпрометированная версия Bitwarden CLI собрала SSH-ключи, облачные учётные данные и npm-токены с 334 машин разработчиков. Настоящая проблема не в том, как проникло вредоносное ПО, а в том, что каждый секрет лежал обычным файлом и ждал, пока его прочитают.

Вчера скомпрометированная версия CLI Bitwarden собрала SSH-ключи, учётные данные AWS, npm-токены, переменные окружения, историю оболочки и Git-секреты с 334 машин разработчиков.

Сегодня это был Bitwarden. В прошлом месяце — Axios. До этого — Checkmarx. Завтра это будет расширение для VS Code, или Acrobat, или формула Homebrew, или образ Docker. Вектор меняется еженедельно. Результат всегда один и тот же.

Вредоносное ПО попадает на машину. Оно читает ~/.ssh/. Оно читает ~/.aws/credentials. Оно читает ~/.npmrc. Оно читает ~/.git-credentials. Оно читает историю оболочки, переменные окружения, хранилища паролей браузера. Упаковывает всё и отправляет на C2-сервер.

И это работает. Каждый раз.

Сбор урожая

Полезная нагрузка Bitwarden — обфусцированный файл размером 10 МБ под названием bw1.js — не пыталась взломать шифрование. Это не требовалось. Вот что было собрано, как задокументировано Socket и Aikido:

  • SSH-ключи и отпечатки хостов
  • Облачные учётные данные AWS, GCP и Azure
  • Токены аутентификации npm
  • Учётные данные Git и адреса удалённых репозиториев
  • Переменные окружения
  • История оболочки
  • Аутентификация Claude Code и конфигурации MCP

Затем с помощью украденных npm-токенов были повторно опубликованы другие пакеты, которые поддерживала жертва, — и вредоносное ПО распространилось дальше. Жертвы стали векторами.

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

Это не история про Bitwarden

Шифрование хранилища Bitwarden не было взломано. Их архитектура с нулевым знанием устояла. Вредоносное ПО никогда не касалось хранилища.

И не должно было.

Хранилище защищает то, что находится внутри него. Но SSH-ключи никогда не были в хранилище. Учётные данные AWS никогда не были в хранилище. npm-токены, учётные данные Git, API-ключи в файлах .env — ничто из этого не хранится в менеджерах паролей. Всё это живёт в dotfiles, в открытом виде, на каждой машине разработчика.

Атакующий это понимал. Хранилище — это запертый сейф в доме, где каждый ящик открыт.

Настоящая поверхность атаки

Откройте терминал прямо сейчас. Посмотрите, что есть на вашей машине.

~/.ssh/id_ed25519 — ваш закрытый ключ. Файл в открытом виде.

~/.aws/credentials — ваш доступ в облако. Файл в открытом виде.

~/.npmrc — ваш токен публикации. Файл в открытом виде.

~/.git-credentials — ваш доступ к репозиториям. Файл в открытом виде.

~/.env в десятке каталогов проектов — API-ключи, пароли к базам данных, секреты подписи. Все файлы в открытом виде.

Любой процесс, запущенный от вашего имени, может прочитать всё это. Повышение привилегий не требуется. Уязвимость не нужна. Достаточно cat.

Это стандартная настройка разработчика в 2026 году. Мы кладём пароли в зашифрованное хранилище и оставляем всё остальное открытым.

Неправильный вопрос

После каждой атаки на цепочку поставок отрасль задаёт один и тот же вопрос: как не допустить проникновения вредоносного ПО?

Более надёжная безопасность CI/CD. Подписание кода. Сканирование зависимостей. Песочницы для среды выполнения. Всё это хорошо. Ничего из этого недостаточно. Поверхность атаки слишком широка. Слишком много векторов — менеджеры пакетов, расширения браузеров, плагины IDE, OAuth-приложения, скомпрометированные инструменты сборки. Закрыть каждую точку входа невозможно.

Правильный вопрос: когда вредоносное ПО неизбежно получит выполнение на машине разработчика, что оно там найдёт?

Если ответ — «сотни учётных данных в открытом виде в предсказуемых местах файловой системы», никакое укрепление цепочки поставок не имеет значения. Вы обороняетесь на поле, где ваши ворота открыты.

Собирать должно быть нечего

Решение — не в лучшем обнаружении вредоносного ПО. Решение — не в песочнице для npm install. Решение — не в более быстром времени реагирования на инцидент.

Решение в том, что секреты не должны существовать как файлы на диске.

SSH-ключи, выводимые из аппаратного обеспечения в момент аутентификации, — а не хранимые в ~/.ssh/. Облачные учётные данные, выпускаемые на сессию из аппаратно-привязанной идентичности, — а не записываемые в ~/.aws/. API-токены с ограниченной областью действия, эфемерные и управляемые аппаратно, — а не лежащие в файлах .env.

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

Это не теория. Аппаратно-привязанные учётные данные существуют уже сегодня. WebAuthn PRF позволяет выводить криптографические ключи из физического аутентификатора — ключи, которые никогда не попадают в файловую систему. Технология уже здесь. Отрасль просто не сделала её значением по умолчанию.

Что делать сейчас

Если Вы пострадали от компрометации CLI Bitwarden:

  • Ротируйте все учётные данные на машине — SSH-ключи, облачные токены, npm-токены, API-ключи, всё в dotfiles и переменных окружения
  • Проверьте, не были ли повторно опубликованы npm-пакеты, которые Вы поддерживаете
  • Проверьте активность GitHub и рабочие процессы CI/CD на предмет несанкционированных изменений

Если Вы не пострадали, действия те же. Посмотрите на свою машину. Посчитайте секреты в открытом виде. Спросите себя, что произойдёт, когда — не «если», а когда — что-то вредоносное запустится от вашего имени.

Ответ должен быть: ничего. Собирать должно быть нечего.