Связанные с северокорейским государством хакеры внедрили полный набор инструментов для удаленного доступа в шесть поддельных пакетов npm, замаскированных под широко используемые инструменты сборки Rollup, как сообщила 30 июня компания JFrog Security Research. Атака срабатывает в момент, когда разработчик импортирует пакет, а не во время установки, что означает, что самое значительное новое значение по умолчанию для безопасности npm ее не останавливает.
Кампания, подробно описанная исследователем JFrog Яиром Бенаму, была сосредоточена на шести пакетах, которые скопировали текст README, метаданные репозитория и форму пакета легитимного проекта rollup-plugin-polyfill-node, который загружается примерно 295 000 раз в неделю. Два основных пакета для входа — rollup-packages-polyfill-core и rollup-runtime-polyfill-core — разместили себя в том же пространстве имен, что и этот широко используемый инструмент, представляя собой правдоподобную зависимость для любого разработчика, который не проверил их внимательно. Согласно JFrog Security Research, пакеты с высокой точностью воспроизводили описание, метаданные репозитория и структуру пакета легитимного проекта.
Все шесть пакетов с тех пор были удалены из реестра npm.
Маскировка, созданная для прохождения поверхностной проверки
Что сделало эту кампанию сложнее для обнаружения, чем стандартный трюк с именами, так это тщательность, с которой была воссоздана легитимность. Анализ JFrog подтвердил, что поддельные пакеты почти дословно воспроизводили README реального проекта, указывали метаданные репозитория и домашней страницы на подлинный проект GitHub и включали функциональный код полифила Rollup в свои точки входа — со зловредной логикой, добавленной ниже.
Атака также сделала преднамеренный архитектурный выбор: бэкдор был установлен только в точке входа CommonJS dist/index.js. Вариант ESM остался совершенно чистым. Многие автоматизированные инструменты линтинга и сканирования безопасности запускаются против основного пути импорта пакета; сохранение версии ESM чистой было продуманной попыткой остаться ниже этого порога.
“Схожие по виду зависимости сборки заслуживают тщательной проверки, даже если имя не является очевидной опечаткой”, — написала JFrog в своем анализе. “Скопированный README, ссылка на доверенный репозиторий и выглядящий функциональным код пакета могут быть достаточными, чтобы скрыть серьезное заражение”.
Эта техника отличается как от стандартного тайпосквоттинга (который полагается на ошибочные имена), так и от спуфинга зависимостей (который использует коллизии пространств имен частных реестров). Кампания с полифилом Rollup использовала преднамеренную имитацию бренда — создание правдоподобных новых пакетов, занимающих ту же концептуальную область именования без очевидных орфографических ошибок, — технику, которая полностью обходит инструменты обнаружения сходства имен.
Как четыре этапа обеспечивают удаленное управление
Цепочка заражения полагалась на многоуровневую косвенность. Два основных пакета не несли финальную вредоносную нагрузку напрямую. Вместо этого, во время импорта, каждый из них бесшумно выполнял команду npm install, закодированную в Base64 (закодированную как строковая константа для обхода простого сопоставления строк), чтобы загрузить пакет второго этапа: swift-parse-stream и quirky-token соответственно. Третий путь проходил через react-icon-svgs, который загружал rollup-plugin-polyfill-connect в качестве второго этапа.
Пакеты второго этапа представлялись утилитами для очистки SVG. В конце каждого из них функция загружала JSON-объект с URL-адреса на jsonkeeper.com и передавала поле model напрямую в JavaScript eval(). Поскольку фактический вредоносный код находился по этому удаленному URL-адресу, а не внутри опубликованных пакетов, он отсутствовал в самих файлах пакетов и был невидим для статического анализа реестра.
Эта удаленная нагрузка сначала выполняла сканирование среды, проверяя наличие более 15 переменных, указывающих на облачные среды разработки, песочницы, бессерверные среды выполнения или аналитическую инфраструктуру — включая CODESPACE_NAME, VERCEL, AWS_REGION, GOOGLE_CLOUD_PROJECT, AZURE_FUNCTIONS_ENVIRONMENT и DOCKER. Машины, прошедшие этот этап фильтрации, затем загружали финальную полезную нагрузку, зашифрованную AES-256-CBC, с жестко закодированного IP-адреса (216.126.236.244), который, по данным JFrog, все еще обслуживал полезную нагрузку на момент их анализа 30 июня. Расшифрованная полезная нагрузка весила около 114 килобайт.
Как атака обходит новейшие средства защиты npm
npm v12, выпуск которого запланирован на июль 2026 года, по умолчанию блокирует выполнение postinstall и других скриптов жизненного цикла — это серьезное изменение, направленное непосредственно на механизм, лежащий в основе ранних атак на цепочки поставок, таких как червь Shai-Hulud и компрометация Mastra AI. Изменения безопасности npm v12 представляют собой самое значительное перепроектирование безопасности, которое менеджер пакетов видел за последние годы.
Атака с полифилом Rollup не останавливается этим изменением.
Вредоносный код выполняется не во время npm install. Он запускается, когда разработчик или задание CI вызывает require() пакет как часть сборки или файла конфигурации. Это выполнение во время импорта, а не во время установки — другая поверхность атаки, которую настройки блокировки скриптов npm v12 не затрагивают. Разработчик, который обновился до npm v12 специально из-за освещения TechTimes от 13 июня его улучшений безопасности, не будет в большей безопасности от этого класса атак.
Технический анализ JFrog выявил четыре параллельных компонента, работающих после того, как финальный этап был расшифрован и запущен.
Модуль удаленного доступа — scdata.js — использовал Socket.IO для установления постоянного соединения с сервером командно-контрольной панели злоумышленника по порту 4801. Он поддерживал интерактивные сеансы терминала через node-pty, SSH-соединения, произвольное выполнение команд, захват скриншотов в Windows и полный контроль над движением мыши, вводом с клавиатуры и буфером обмена через @nut-tree-fork/nut-js. Модуль также выполнял обнаружение виртуальных машин с помощью нативных запросов платформы для идентификации аналитических сред, ища такие строки, как vmware, virtualbox и qemu.
Сборщик данных о браузерах и кошельках — ldata.js — нацеливался на сохраненные файлы учетных данных в браузерах Chrome, Edge, Brave, Opera и других браузерах на базе Chromium в Windows, macOS и Linux, а также на локальное хранилище расширений для десятков браузерных расширений. Список извлеченных идентификаторов расширений включал Meta*Mask и другие известные криптовалютные кошельки. В macOS полезная нагрузка дополнительно нацеливалась на файл login.keychain-db пользователя.
Широкий сборщик файлов рекурсивно сканировал пользовательские каталоги на предмет файлов, соответствующих шаблонам от .env и .pem до .json, .pdf и .xlsx, с особым нацеливанием на папки истории редакторов для Visual Studio Code, Windsurf и Cursor. В зону охвата также попали каталоги конфигурации разработчиков и инструментов ИИ, включая .aws, .azure, .ssh, .foundry, .gemini, .claude, и файлы истории оболочки — профиль нацеливания, который точно соответствует поверхности учетных данных разработчика программного обеспечения, использующего современные инструменты с поддержкой ИИ.
Наконец, монитор буфера обмена использовал нативные утилиты платформы для захвата скопированного содержимого, предназначенного для перехвата токенов, адресов кошельков, сид-фраз и других секретов по мере их прохождения через буфер обмена.
Отпечатки группы Lazarus в устойчивой кампании
JFrog отнесла кампанию к хакерам, связанным с Lazarus из Северной Кореи, на основании совпадения тактик, методов и процедур с предыдущими кампаниями. Использование @nut-tree-fork/nut-js для удаленного управления мышью и клавиатурой было независимо замечено в express-session-js, пакете, который SafeDep отнесла к акторам КНДР в апреле 2026 года.
Это также не первый раз, когда этот конкретный нишевый сегмент подвергался атаке. В апреле 2026 года Panther задокументировала устойчивую кампанию DPRK в npm, включавшую 108 вредоносных пакетов в 261 версии, доставлявших известные семейства вредоносного ПО BeaverTail и OtterCookie — включая пакет под названием rollup-plugin-polyfill-route, опубликованный 20 марта 2026 года. Архитектура полезной нагрузки текущей кампании значительно пересекается с OtterCookie, что указывает на продолжающееся совершенствование одного и того же базового набора инструментов.
Группа Lazarus обозначена Управлением по контролю за иностранными активами Министерства финансов США как агентство и инструмент правительства Северной Кореи, действующее под руководством Главного разведывательного управления. Группа имеет задокументированную модель нацеливания на среды разработки, криптовалютную инфраструктуру и финансовые учреждения для получения дохода для северокорейского режима — дохода, который правительственные учреждения США связывают с оружейными программами страны.
Одна скоординированная волна среди нескольких
Раскрытие информации JFrog совпало с кластером отдельно обнаруженных кампаний по цепочке поставок npm и PyPI, раскрытых Checkmarx, SafeDep и исследователем безопасности AWS Чи Траном в тот же период. Они включали троянизированные форки библиотеки Telegram pyrogram, развертывающие бэкдоры, которые эксфильтрируют данные через Telegram — названные Operation Navy Ghost компанией Checkmarx, — пакеты, имитирующие инструменты Polymarket, нацеленные на разработчиков децентрализованных финансов, и пакет под названием events-runtime, который использовал смарт-контракт Ethereum в качестве тайника для получения команд.
Параллельные раскрытия информации в одну и ту же неделю отражают то, как атаки на цепочки поставок программного обеспечения созрели от изолированных инцидентов до устойчивой, многоакторной угрозы, действующей в промышленных масштабах. Согласно постоянному отслеживанию Socket Contagious Interview, северокорейские государственные акторы опубликовали сотни вредоносных пакетов npm с десятками тысяч совокупных загрузок с конца 2024 года.
Что разработчики и команды безопасности должны сделать сейчас
JFrog рекомендует всем, кто установил любой из шести вредоносных пакетов, считать затронутую машину полностью скомпрометированной, прежде чем предпринимать шаги по исправлению. Конкретные рекомендации исследовательской группы:
Удалите rollup-packages-polyfill-core, rollup-runtime-polyfill-core, swift-parse-stream, quirky-token, react-icon-svgs и rollup-plugin-polyfill-connect из всех затронутых проектов и файлов блокировки. Проверьте деревья зависимостей на предмет транзитивных загрузок пакетов второго этапа.
Ищите на машинах разработки и CI-раннерах временные файлы с именами pack, scdata или ldata, а также процессы или командные строки, подключающиеся к 216.126.236.244. Заблокируйте исходящее соединение с этим IP-адресом и с jsonkeeper.com/b/3P9BF.
Смените все потенциально скомпрометированные учетные данные: токены npm, учетные данные GitHub, ключи облачных провайдеров для AWS, Azure и GCP, SSH-ключи, сид-фразы кошельков и любые секреты, хранящиеся в профилях браузеров.
Включите сканирование зависимостей в конвейерах CI/CD, настроенное на пометку недавно опубликованных или неожиданных пакетов. Поскольку эта кампания использовала выполнение во время импорта, а не скрипты жизненного цикла во время установки, отключение только скриптов установки — даже в рамках новых настроек npm v12 — недостаточно для защиты от этого конкретного класса атак.
Все шесть пакетов обнаруживаются JFrog Xray и JFrog Curation.
Как узнать, установил ли я один из шести вредоносных пакетов?
Проверьте свои файлы package.json, package-lock.json и каталог node_modules на наличие любого из шести имен пакетов: rollup-packages-polyfill-core, rollup-runtime-polyfill-core, swift-parse-stream, quirky-token, react-icon-svgs или rollup-plugin-polyfill-connect. Также проверьте журналы конвейера CI/CD на наличие каких-либо команд npm install, которые загружали любое из этих имен, в том числе в качестве транзитивных зависимостей. Если что-либо обнаружено, JFrog советует считать всю машину скомпрометированной и сменить все учетные данные, прежде чем предпринимать какие-либо другие действия.
Какие учетные данные конкретно предназначен для кражи эта вредоносная программа?
Полезная нагрузка нацелена на широкий спектр учетных данных разработчиков и инструментов ИИ: токены npm и GitHub, ключи API облачных провайдеров для AWS, Azure и Google Cloud, закрытые SSH-ключи, сид-фразы криптовалютных кошельков и хранилище расширений (включая Meta*Mask), сохраненные пароли браузера и данные веб-сессий, файлы .env и любые файлы, содержащие слова secret или private key, а также базу данных ключей входа macOS. Сборщик файлов также специально нацеливался на каталоги конфигурации для Anthropic Claude, Google Gemini, AWS, Azure и Foundry — профиль нацеливания, разработанный для разработчиков, использующих инструменты с поддержкой ИИ.
Защищает ли обновление до npm v12 от такого типа атак?
Нет — не от этого конкретного класса атак. Самое значительное изменение безопасности в npm v12 — это блокировка выполнения postinstall и других скриптов жизненного цикла по умолчанию. Это остановило бы такие атаки, как червь Shai-Hulud и компрометация Mastra AI, которые использовали хуки во время установки. Вредоносное ПО полифила Rollup срабатывает, когда пакет вызывается через require() во время импорта в процессе сборки или загрузки конфигурации — это другой путь выполнения, который настройки блокировки скриптов npm v12 не затрагивают. Защитные меры, которые помогают, включают инструменты сканирования зависимостей, которые обнаруживают поведенческие аномалии (например, Socket или JFrog Curation), закрепленные файлы блокировки и аудит любых вновь добавленных зависимостей перед запуском сборок.
Чем эта кампания отличается от стандартного тайпосквоттинга npm?
Стандартный тайпосквоттинг полагается на то, что разработчики ошибаются в написании имени пакета — например, recat вместо react. Кампания с полифилом Rollup использовала другую технику: преднамеренную имитацию бренда. Поддельные пакеты почти дословно скопировали README реального проекта, указали поля репозитория и домашней страницы на подлинный репозиторий GitHub и включили функциональный код полифила Rollup рядом с вредоносной полезной нагрузкой. В именах пакетов нет существенных орфографических вариаций — они занимают то же концептуальное пространство имен, что и реальный инструмент. Это обходит инструменты обнаружения сходства имен и проходит ту поверхностную проверку зависимостей, которая отлавливает очевидные опечатки.
Facebook*, Instagram* и WhatsApp* принадлежат компании Meta* Platforms Inc., деятельность которой признана экстремистской и запрещена на территории Российской Федерации.
Всегда имейте в виду, что редакции могут придерживаться предвзятых взглядов в освещении новостей.
Автор – Clayton Lewis




