4 августа 2026 года в реестре npm вышла версия 6.0.0 популярного пакета keyv, который используется для хранения данных. В этой версии обнаружился вредоносный сценарий, срабатывающий сразу после установки. Он запускается до того, как разработчик выполнит первую строку собственного кода. Ситуация усугубляется тем, что keyv часто входит в состав других пакетов как транзитивная зависимость, то есть устанавливается автоматически вместе с ними.
Описание
По данным SafeDep, пакет по-прежнему помечен как актуальный, поэтому стандартная команда установки приведет к загрузке именно этой зараженной версии. Даже если разработчик напрямую не указывал keyv, но он установлен в составе другого инструмента, вредоносный код все равно выполнится. Вредоносный сценарий реализован в виде скрипта предварительной установки, который запускается до любых действий пользователя.
Вторая линия атаки затронула репозиторий проекта. Злоумышленник добавил в него файлы конфигурации для редактора VS Code и для ассистента Claude Code. Эти файлы настроены так, чтобы автоматически запускать скрипт при открытии проекта. Для маскировки конфигурации ссылаются друг на друга: файл в папке для Claude указывает на скрипт из папки для VS Code, и наоборот. Поэтому при беглом просмотре каждого файла в отдельности невозможно заметить самодостаточный код. Кроме того, задаче присвоено безобидное название "Настройка окружения", чтобы не привлекать внимания.
Таким образом, под угрозой оказались не только те, кто устанавливает пакет. Разработчики, которые склонировали репозиторий, чтобы изучить исходный код после сообщений о взломе, попадают в зону поражения в момент открытия папки в редакторе. Команда запускается автоматически, без каких-либо действий со стороны пользователя.
Коммит с этими файлами формально подписан GitHub. Однако подпись не подтверждает личность автора, а лишь указывает, что изменение внесено через интерфейс GitHub. В качестве автора указан автоматический бот github-actions, что выглядит обычно для служебных правок. Этот прием позволяет обойти доверие к проверенным коммитам. Изучение истории изменений показывает, что все предыдущие коммиты сопровождающего подписаны его личным ключом, а в этом случае подпись ботовая. Скорее всего, аккаунт сопровождающего либо скомпрометирован, либо его учетные данные оказались в руках атакующего. В любом случае, сопровождающего следует считать жертвой, пока он сам не даст объяснений.
Техническая особенность атаки состоит в том, что на первом этапе вредоносный код загружает официальную сборку среды выполнения Bun с GitHub. Это легитимный ресурс, поэтому сетевой трафик не вызывает подозрений у систем мониторинга. После загрузки вредоносный скрипт запускает основную полезную нагрузку и удаляет временную среду выполнения, не оставляя следов. Таким образом, стандартные системы обнаружения, основанные на списках запрещенных доменов, не срабатывают.
В основной нагрузке эксперты выявили процедуры для работы с учетными данными. Код способен читать токены npm и GitHub, ключи облачных сервисов, а также данные из систем хранения секретов, таких как HashiCorp Vault. Кроме того, предусмотрена упаковка и подготовка этих данных для передачи. При этом никому не удалось установить факт реальной эксфильтрации: отсутствуют сведения о похищенных данных и адресах командных серверов. Наличие подобных процедур само по себе указывает на серьезные намерения, даже если финальная стадия атаки не была наблюдаема.
Важно отметить, что вредоносный код в репозитории был тщательно замаскирован. Злоумышленник написал тест, проверяющий работу скрипта предварительной установки, а через несколько минут удалил его, чтобы не привлекать внимание. Кроме того, в коммите, который публиковал пакет, были добавлены только два файла и изменена одна строка в манифесте - сама библиотечная часть кода не менялась. Это позволяет атаке оставаться незаметной при проверке различий между версиями.
Инцидент не ограничивается одним пакетом. Сразу после публикации были изменены файлы во всех 19 дочерних пакетах семейства keyv, в том числе для работы с базами данных и шифрованием. Это указывает на подготовку к масштабному заражению. Если выпустить новые версии этих пакетов, вредоносный код попадет к широкому кругу пользователей. Необходимо отозвать права на публикацию и отключить автоматический выпуск релизов до полной очистки репозитория.
Проверить, не была ли установлена зараженная версия, можно по файлам блокировки зависимостей. Однако такие проверки не выявляют вредоносные файлы конфигурации в репозитории. Поэтому рекомендуется вручную проверить, не были ли открыты склонированные проекты в редакторах в последнее время.
Для защиты пользователям рекомендуется не обновлять keyv до версии 6.0.0 и оставаться на стабильной ветке 5.x. Также не стоит открывать склонированный репозиторий keyv в редакторах кода или в ИИ-ассистентах, пока вредоносные файлы не удалены. Если пакет уже был установлен, следует считать все учетные данные доступными атакующему и незамедлительно заменить пароли, токены и ключи доступа. Особое внимание стоит уделить сборочным системам, где пакет мог быть установлен с полными правами на доступ к секретам.
Этот случай напоминает, что механизмы верификации в экосистеме npm не дают полной гарантии. Официальные подписи и сертификаты происхождения были использованы для маскировки вредоносных действий. Реагировать на подобные инциденты нужно быстрее, чем распространяется зараженный код.
Индикаторы компрометации
Malicious package
- keyv@6.0.0
SHA256
- 54dc7ea54a1317cca0e890a2770630cf7fa6c97813e0cb9d2caa93012b350668
- 9fc2570b7cef51c1b8df116d144d11ff4096357be7d2c4c6367cfc2509cf1bcc