Атака на jscrambler в npm: Rust-инфостилер через скомпрометированные учетные данные
Опасность · Июль 2026

Атака на jscrambler в npm:
Rust-инфостилер через скомпрометированные учетные данные

npm-пакет компании, специализирующейся на безопасности, был взломан для распространения кроссплатформенного Rust-инфостилера. Пять вредоносных релизов, 1479 загрузок и вредонос, нацеленный на ключи разработчиков и криптовалютные кошельки.

Олег Максимов 19 июля 2026 12 мин чтения

Что произошло

11 июля 2026 года в 16:12 по Лондону кто-то опубликовал версию 8.14.0 пакета jscrambler в реестре npm. Это был не обычный релиз. Злоумышленник использовал скомпрометированные учетные данные для публикации, принадлежавшие компании Jscrambler — известному разработчику средств защиты JavaScript-кода, которым пользуются тысячи разработчиков.

Версия 8.14.0 содержала два файла, которых никогда не было в публичном репозитории GitHub: dist/setup.js и dist/intro.js. Не было соответствующего коммита, пулл-реквеста или тега — вредоносные файлы существовали только в опубликованном npm-артефакте. В package.json появился undocumented-скрипт:

"scripts": {
  "preinstall": "node dist/setup.js"
}

Автоматическая система обнаружения Socket.dev зафиксировала скомпрометированный релиз в течение 6 минут после публикации. Собственные системы оповещения Jscrambler сработали за секунды, и компания немедленно запустила процесс реагирования.

В течение следующих трех часов тот же злоумышленник опубликовал еще четыре вредоносных версии — 8.16.0, 8.17.0, 8.18.0 и 8.20.0 — перемежая их с «чистыми» исправлениями от Jscrambler. Вредоносная нагрузка внутри dist/intro.js была идентична байт-в-байт во всех вредоносных релизах. Менялся только механизм доставки.

Краткий обзор

Пакетjscrambler (npm)
Вредоносные версии8.14.0, 8.16.0, 8.17.0, 8.18.0, 8.20.0
Опубликован11 июля 2026, 16:12:40 BST
Вектор атакиСкомпрометированные учетные данные npm
ВредоносКроссплатформенный Rust-инфостилер
Время обнаружения6 минут (Socket.dev)
Известные загрузки1479 (npm, все затронутые версии)
Безопасная версия8.22.0 или новее
ГруппировкаIronWorm infostealer

Технический анализ: от npm install до нативной нагрузки

Preinstall-скрипт

Вредоносный dist/setup.js — компактный загрузчик примерно на 200 строк JavaScript, который запускается автоматически во время npm install через preinstall-скрипт. Импорт не требуется. Простая установка пакета запускает вредоносный код, потому что npm выполняет preinstall-скрипты до того, как код пакета вообще загружен.

CSI-контейнер

Файл dist/intro.js — несмотря на расширение .js — не является JavaScript. Это бинарный контейнер объемом примерно 7,8 МБ с пятибайтовым заголовком (1b 43 53 49 01), шестой байт которого кодирует количество вложенных нагрузок.

Контейнер содержит три gzip-сжатых нативных исполняемых файла, по одному на каждую операционную систему:

Последовательность выполнения

При установке setup.js выполняет следующую последовательность:

  1. Читает CSI-контейнер из dist/intro.js
  2. Выбирает один блок, соответствующий process.platform
  3. Распаковывает gzip во временный файл со случайным именем (добавляя .exe на Windows)
  4. Делает файл исполняемым
  5. Запускает его с параметрами { detached: true, stdio: 'ignore', windowsHide: true } с последующим unref()

Эволюция доставки: версия 8.18.0 сменила тактику

Начиная с версии 8.18.0, злоумышленник удалил preinstall-скрипт. Вместо этого идентичный загрузчик был внедрен как самовыполняющаяся функция в начало dist/index.js и dist/bin/jscrambler.js. Это означает, что вредонос срабатывает при импорте пакета или вызове его CLI, а не при установке. Такая техника обходит сканеры, проверяющие только preinstall- и postinstall-скрипты, и переживает npm install --ignore-scripts.

Версии 8.18.0 и 8.20.0 также объявили самозависимость — "jscrambler": "^8.17.0", — которая транзитивно тянет скомпрометированный релиз при установке вместе с другими пакетами.

Что крадет вредонос

Нативная нагрузка на Rust — это специализированный инфостилер для разработчиков. Анализ декомпилированных бинарников, включая примерно 2400 строк, зашифрованных ChaCha20-Poly1305 (восстановленных командой Socket), показывает обширную поверхность атаки, ориентированную на машины разработчиков и облачных операторов.

Облачные ключи

AI-инструменты и конфигурации MCP-серверов

Криптовалютные кошельки

Браузеры, мессенджеры и сессии

Повышение привилегий и сохранение в системе

На Linux вредонос пытается повысить привилегии через sudo -S -p и systemd-run --system --no-ask-password, а также может загружать eBPF-программы в ядро из памяти. На Windows создает скрытые задачи в планировщике. На macOS устанавливает LaunchAgents. Данные отправляются через TLS (rustls) на жестко заданные IP-адреса, также наблюдалась инфраструктура Tor.

Эволюция атаки: как менялся механизм доставки

За три часа злоумышленник опубликовал пять вредоносных релизов. Вредоносная нагрузка не менялась — менялась доставка:

Почему эта атака важна

  1. Жертва — компания по безопасности. Jscrambler продает защиту клиентского кода. Ее собственный канал распространения был взломан. Если конвейер публикации компании по безопасности может быть скомпрометирован — уязвим любой.
  2. Build-time инструменты — цель высочайшей ценности. Пакет jscrambler работает в CI/CD-пайплайнах, где хранятся токены развертывания, облачные ключи и исходный код.
  3. Время атаки не случайно. npm 12 вышел 8 июля, отключив install-скрипты по умолчанию. Атака произошла через три дня, эксплуатируя тех, кто еще не обновился.

Отличие от Mini Shai-Hulud

Ранее на этом сайте была опубликована статья об атаке Mini Shai-HuludMini Shai-Hulud: атака на цепочку поставок npm. Эти два инцидента принципиально различны:

ХарактеристикаMini Shai-Huludjscrambler
Вектор атакиTyposquatting + dependency confusionКража учетных данных публикации
Масштаб170+ скомпрометированных пакетов1 пакет, 5 версий
МетодФальшивые пакеты загружены в npmРеальный пакет угнан через кражу учетных данных
Сложность обнаруженияВысокая (typosquats выглядят легитимно)Очень высокая (официальный пакет вендора)

Немедленные действия

Что делать прямо сейчас

Долгосрочная защита

Lockfiles для целостности

Lockfiles фиксируют деревья зависимостей с хешами целостности. Если вредоносная версия опубликована после генерации lockfile, npm откажется ее устанавливать:

# npm проверяет целостность из lockfile
npm ci  # установка только из lockfile

pnpm и yarn — строгие менеджеры пакетов

pnpm не запускает preinstall/postinstall-скрипты установленных зависимостей по умолчанию, что предотвратило бы вектор атаки 8.14.0:

# pnpm: скрипты не выполняются по умолчанию
pnpm add jscrambler  # безопасно — setup.js не запускается

npm 12: скрипты по запросу

npm 12 отключает install-скрипты по умолчанию. Preinstall-скрипт, на котором держалась атака на jscrambler, был бы проигнорирован:

# npm 12+: install-скрипты отключены
npm install jscrambler  # preinstall НЕ выполняется

2FA и верификация происхождения

Две меры снижают риск угона учетных данных:

Контекст безопасности

Атака на jscrambler — последняя в серии инцидентов цепочки поставок 2026 года. Ранее Mini Shai-Hulud скомпрометировал 170+ пакетов через typosquatting, TeamPCP атаковал GitHub через отравленные расширения VS Code, а утечка токена Grafana показала риски CI/CD-пайплайнов.

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

Нужна безопасная веб-разработка с защищенным конвейером поставок?

FAQ

Что такое атака на jscrambler в npm?
11 июля 2026 года злоумышленники использовали украденные учетные данные для публикации пяти вредоносных версий npm-пакета jscrambler (8.14.0, 8.16.0, 8.17.0, 8.18.0, 8.20.0). Эти версии содержали preinstall-скрипт, запускавший кроссплатформенный Rust-инфостилер, нацеленный на кражу облачных ключей, конфигураций AI-инструментов, паролей и криптокошельков.
Как произошла компрометация пакета jscrambler?
Злоумышленник использовал скомпрометированные учетные данные для публикации в npm. В репозитории GitHub не было соответствующего коммита — вредоносные файлы существовали только в опубликованном артефакте npm. Атака не эксплуатировала уязвимости в продукте Jscrambler — это чистый перехват канала распространения.
Что крадет Rust-инфостилер?
Облачные ключи (AWS Secrets Manager, GCP Secret Manager, Azure IMDS), конфигурации AI-инструментов (Claude Desktop, Cursor, Windsurf, VS Code MCP), пароли и куки браузеров, криптовалютные кошельки (MetaMask, Trust Wallet, Coinbase, Phantom, Exodus) включая сид-фразы, сессии Discord/Slack/Telegram, Steam, данные Bitwarden, токены npm и GitHub.
Чем эта атака отличается от Mini Shai-Hulud?
Mini Shai-Hulud использовал typosquatting (поддельные имена пакетов) — 170+ пакетов. jscrambler — кража учетных данных публикации легитимного пакета. Первое — обман с именами, второе — кража токенов. Разные векторы требуют разных мер защиты.
Как проверить, затронула ли меня атака?
Проверьте lockfile на версии 8.14.0–8.20.0 пакета jscrambler. Также проверьте jscrambler-webpack-plugin (8.6.2), gulp-jscrambler (8.6.2), grunt-jscrambler (8.5.2), jscrambler-metro-plugin (9.0.2). При обнаружении обновитесь до 8.22.0 и смените все учетные данные.
Как защититься от атак на цепочку поставок npm?
Используйте lockfiles, обновитесь до npm 12 (отключает install-скрипты), рассмотрите pnpm. Для издателей: аппаратная 2FA (WebAuthn) и npm provenance attestations. Используйте инструменты обнаружения в реальном времени (Socket.dev). Относитесь к каждому установленному пакету как к потенциальному вектору атаки.
Какие версии jscrambler безопасны?
Версия 8.22.0 и выше. Промежуточная безопасная — 8.15.0. Для зависимых: jscrambler-webpack-plugin >= 8.6.3, gulp-jscrambler >= 8.6.3, grunt-jscrambler >= 8.5.3, jscrambler-metro-plugin >= 9.0.3.

Оставайтесь защищенными

Атака на jscrambler — тревожный сигнал для всего JavaScript-сообщества. Канал распространения компании по безопасности был взломан не через уязвимость в продукте, а через кражу учетных данных. Если конвейер публикации Jscrambler может быть скомпрометирован — уязвим любой.

Средства защиты существуют: lockfiles, современные менеджеры пакетов, npm 12, двухфакторная аутентификация, верификация происхождения. Проблема не в технологиях — проблема в их внедрении. Каждый разработчик, закрепляющий зависимости, включающий 2FA и обновляющийся до npm 12, делает экосистему чуть более защищенной.

Если вы создаете JavaScript-приложения и ищете разработчика, понимающего современную безопасность цепочки поставок — от lockfile-менеджмента до CI/CD и безопасности фреймворков — напишите мне.

Контакты

Обсудим ваш проект

Расскажите о вашей задаче — я помогу выбрать современный стек и реализовать проект с учетом требований безопасности. Бесплатная консультация.