Двадцать шестого июня 2026 года специалисты по безопасности обнаружили, что несколько версий четырёх npm-пакетов, поддерживаемых компанией Immobiliare Labs, содержат вредоносный код. Этот код активируется в момент установки пакета через механизм node-gyp, используя файл binding.gyp. Затронуты пакеты @immobiliarelabs/backstage-plugin-gitlab, @immobiliarelabs/backstage-plugin-gitlab-backend, @immobiliarelabs/backstage-plugin-ldap-auth и @immobiliarelabs/backstage-plugin-ldap-auth-backend. Они применяются для интеграции GitLab и LDAP-аутентификации в корпоративные порталы Backstage.
Описание
Вредоносная нагрузка нацелена на кражу широкого спектра учётных данных: токенов GitHub Actions, учётных записей облачных провайдеров (AWS, Google Cloud, Azure), токенов реестров пакетов (npm, PyPI, RubyGems), а также содержимого баз паролей (Bitwarden, 1Password) и ключей SSH. Кроме того, полезная нагрузка пытается закрепиться в конфигурационных файлах различных AI-ассистентов для кодинга, включая Claude Code, GitHub Copilot, Cursor и VS Code.
Все скомпрометированные версии были опубликованы в течение тридцати секунд 26 июня. Атакующие выпустили новые патч-релизы одновременно для каждого поддерживаемого мажорного ряда версий каждого пакета. Вредоносный файл binding.gyp запускает index.js (объёмом 5 МБ) через механизм развёртывания shell-команд node-gyp, что позволяет обойти проверки, ориентированные только на поле scripts.postinstall в package.json.
Согласно анализу статическим методом архива пакета @immobiliarelabs/backstage-plugin-gitlab версии 2.1.2, вредоносная полезная нагрузка использует трёхуровневую обфускацию. Первый уровень - шифр Цезаря ROT-2, второй - дешифровка AES-128-GCM двух встроенных блоков. После расшифровки первый блок загружает исполняемую среду Bun с официального GitHub-репозитория, а второй блок содержит основной код, обфусцированный инструментом obfuscator.io. Выбор Bun вместо Node.js является намеренной техникой уклонения: Bun не поддерживает перехват через --require, который используют многие инструменты мониторинга Node.js.
Полезная нагрузка также включает функцию infectHost, которая модифицирует конфигурации AI-ассистентов. Например, в Claude Code она добавляет хук SessionStart для выполнения кода при каждом запуске сессии, в GitHub Copilot изменяет файл .github/copilot-instructions.md, в Cursor пишет правила в .cursor/rules/, а в VS Code внедряет задачу в .vscode/tasks.json, активируемую при открытии папки. В списке целей также указаны Aider, Amazon Kiro, Sourcegraph Cody, Google Gemini и OpenAI Codex.
Кроме кражи учётных данных, код содержит функции, указывающие на способность к самораспространению в цепочке поставок. Обнаружены функции squatPackage, updateTarball и обработчики токенов npm и PyPI. Это означает, что при наличии скомпрометированных учётных данных реестров атакующие могут публиковать изменённые пакеты от имени других разработчиков, создавая эффект саморазмножающегося червя. Такая техника уже наблюдалась в предыдущих кампаниях, в частности в атаке на leo-platform, документированной компанией StepSecurity.
Данная атака напрямую связана с кампанией Miasma, которая ранее затронула десятки пакетов в npm и PyPI. Как и в случае с Miasma, злоумышленники одновременно выпустили множество вредоносных версий во все поддерживаемые ветки, чтобы максимизировать число жертв до того, как сообщество успеет среагировать. Все версии были опубликованы в узком временном окне, что затрудняет быстрое откатывание и анализ.
На текущий момент группа безопасности Immobiliare Labs получила уведомление через GitHub issue, и официальные рекомендации по удалению вредоносных версий ожидаются. Вредоносные версии включают, например, @immobiliarelabs/backstage-plugin-gitlab версий 1.0.1, 2.1.2, 3.0.3, 4.0.2, 5.2.1, 6.13.1, 7.0.2 и аналогичные диапазоны для остальных трёх пакетов. Всего затронуто более двадцати версий.
Риски для организаций, использующих пострадавшие пакеты, крайне высоки. Кража токенов GitHub Actions может привести к компрометации репозиториев и пайплайнов CI/CD. Утечка облачных учётных данных - к несанкционированному доступу к инфраструктуре и данным. Закрепление в конфигурациях AI-ассистентов позволяет атакующим выполнять вредоносный код в среде разработчиков при каждом запуске инструментов. Это особенно опасно, поскольку разработчики часто имеют привилегированный доступ к исходным кодам и секретам.
Для защиты в первую очередь необходимо немедленно проверить используемые версии указанных пакетов и удалить любые скомпрометированные. Рекомендуется настроить мониторинг сетевых подключений в процессе npm install: аномальные запросы к GitHub для загрузки Bun (URL bun-v1.3.13) или попытки чтения /proc/pid/mem могут указывать на работу вредоносной нагрузки. Также стоит внедрить задержку (cooldown) для новых версий пакетов в корпоративных реестрах - это снижает окно уязвимости.
Атака на Immobiliare Labs - очередное подтверждение роста числа сложных атак на цепочку поставок. Использование binding.gyp для запуска полезной нагрузки обходит стандартные детекторы, а применение Bun вместо Node.js затрудняет обнаружение в runtime. Учитывая способность к самораспространению через скомпрометированные реестры, этот инцидент может получить широкий резонанс в сообществе разработчиков.
Индикаторы компрометации
Malicious package
- @immobiliarelabs/backstage-plugin-gitlab@1.0.1
- @immobiliarelabs/backstage-plugin-gitlab@2.1.2
- @immobiliarelabs/backstage-plugin-gitlab@3.0.3
- @immobiliarelabs/backstage-plugin-gitlab@4.0.2
- @immobiliarelabs/backstage-plugin-gitlab@5.2.1
- @immobiliarelabs/backstage-plugin-gitlab@6.13.1
- @immobiliarelabs/backstage-plugin-gitlab@7.0.2
- @immobiliarelabs/backstage-plugin-gitlab-backend@3.0.3
- @immobiliarelabs/backstage-plugin-gitlab-backend@4.0.2
- @immobiliarelabs/backstage-plugin-gitlab-backend@5.2.1
- @immobiliarelabs/backstage-plugin-gitlab-backend@6.13.1
- @immobiliarelabs/backstage-plugin-gitlab-backend@7.0.2
URL
- https://github.com/oven-sh/bun/releases/download/bun-v1.3.13/bun-<os>-<arch>.zip
Persistence path
- .claude/settings.json
- .cursor/rules/setup.mdc
- .github/copilot-instructions.md
- .vscode/tasks.json