npm-пакет компании, специализирующейся на безопасности, был взломан для распространения кроссплатформенного Rust-инфостилера. Пять вредоносных релизов, 1479 загрузок и вредонос, нацеленный на ключи разработчиков и криптовалютные кошельки.
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 |
Вредоносный dist/setup.js — компактный загрузчик примерно на 200 строк
JavaScript, который запускается автоматически во время npm install через
preinstall-скрипт. Импорт не требуется. Простая установка пакета
запускает вредоносный код, потому что npm выполняет preinstall-скрипты до того,
как код пакета вообще загружен.
Файл dist/intro.js — несмотря на расширение .js — не является
JavaScript. Это бинарный контейнер объемом примерно 7,8 МБ с
пятибайтовым заголовком (1b 43 53 49 01), шестой байт которого кодирует
количество вложенных нагрузок.
Контейнер содержит три gzip-сжатых нативных исполняемых файла, по одному на каждую операционную систему:
При установке setup.js выполняет следующую последовательность:
dist/intro.jsprocess.platform.exe на Windows){ detached: true, stdio: 'ignore', windowsHide: true } с последующим unref()
Начиная с версии 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), показывает обширную поверхность атаки, ориентированную на машины разработчиков и облачных операторов.
169.254.170.2), Secrets Manager, SSM Parameter StoreGOOGLE_APPLICATION_CREDENTIALS, Secret Manager169.254.169.254).config/Claude/claude_desktop_config.json.cursor/mcp.json.codeium/windsurf/mcp_config.json.mcp.json, mcpServerstdata
На Linux вредонос пытается повысить привилегии через sudo -S -p и
systemd-run --system --no-ask-password, а также может загружать
eBPF-программы в ядро из памяти. На Windows создает скрытые
задачи в планировщике. На macOS устанавливает LaunchAgents. Данные отправляются
через TLS (rustls) на жестко заданные IP-адреса, также наблюдалась инфраструктура Tor.
За три часа злоумышленник опубликовал пять вредоносных релизов. Вредоносная нагрузка не менялась — менялась доставка:
node dist/setup.js)dist/index.js. Самозависимость тянет 8.17.0.Ранее на этом сайте была опубликована статья об атаке Mini Shai-Hulud — Mini Shai-Hulud: атака на цепочку поставок npm. Эти два инцидента принципиально различны:
| Характеристика | Mini Shai-Hulud | jscrambler |
|---|---|---|
| Вектор атаки | Typosquatting + dependency confusion | Кража учетных данных публикации |
| Масштаб | 170+ скомпрометированных пакетов | 1 пакет, 5 версий |
| Метод | Фальшивые пакеты загружены в npm | Реальный пакет угнан через кражу учетных данных |
| Сложность обнаружения | Высокая (typosquats выглядят легитимно) | Очень высокая (официальный пакет вендора) |
[email protected] в package.json. Также обновите зависимые пакеты.Lockfiles фиксируют деревья зависимостей с хешами целостности. Если вредоносная версия опубликована после генерации lockfile, npm откажется ее устанавливать:
# npm проверяет целостность из lockfile
npm ci # установка только из lockfile
pnpm не запускает preinstall/postinstall-скрипты установленных зависимостей по умолчанию, что предотвратило бы вектор атаки 8.14.0:
# pnpm: скрипты не выполняются по умолчанию
pnpm add jscrambler # безопасно — setup.js не запускается
npm 12 отключает install-скрипты по умолчанию. Preinstall-скрипт, на котором держалась атака на jscrambler, был бы проигнорирован:
# npm 12+: install-скрипты отключены
npm install jscrambler # preinstall НЕ выполняется
Две меры снижают риск угона учетных данных:
Атака на jscrambler — последняя в серии инцидентов цепочки поставок 2026 года. Ранее Mini Shai-Hulud скомпрометировал 170+ пакетов через typosquatting, TeamPCP атаковал GitHub через отравленные расширения VS Code, а утечка токена Grafana показала риски CI/CD-пайплайнов.
Общая тенденция очевидна: атакующие переходят от уязвимостей приложений к атакам на инструментарий разработчика. Код вашего приложения может быть безопасен, но если инструменты для его сборки скомпрометированы — всё остальное не имеет значения.
Нужна безопасная веб-разработка с защищенным конвейером поставок?
Атака на jscrambler — тревожный сигнал для всего JavaScript-сообщества. Канал распространения компании по безопасности был взломан не через уязвимость в продукте, а через кражу учетных данных. Если конвейер публикации Jscrambler может быть скомпрометирован — уязвим любой.
Средства защиты существуют: lockfiles, современные менеджеры пакетов, npm 12, двухфакторная аутентификация, верификация происхождения. Проблема не в технологиях — проблема в их внедрении. Каждый разработчик, закрепляющий зависимости, включающий 2FA и обновляющийся до npm 12, делает экосистему чуть более защищенной.
Если вы создаете JavaScript-приложения и ищете разработчика, понимающего современную безопасность цепочки поставок — от lockfile-менеджмента до CI/CD и безопасности фреймворков — напишите мне.
Расскажите о вашей задаче — я помогу выбрать современный стек и реализовать проект с учетом требований безопасности. Бесплатная консультация.