Экосистема Node.js и её реестр пакетов npm вновь стали мишенью для сложных атак, нацеленных на разработчиков. В конце февраля 2026 года исследователи обнаружили серию из семнадцати вредоносных пакетов, загруженных в репозиторий npm. Атака демонстрирует постоянную эволюцию тактик группировки, связанной с КНДР и известной под названием FAMOUS CHOLLIMA (Lazarus Group). Вместо прямого размещения вредоносного кода злоумышленники использовали изощрённый метод скрытой передачи команд: стеганографию в текстовых заметках на публичном сервисе Pastebin. Этот инцидент подчёркивает растущую изобретательность киберпреступников, эксплуатирующих доверие внутри open-source сообщества, и требует повышенной бдительности как от разработчиков, так и от команд безопасности компаний.
Описание
Обнаруженные пакеты, такие как "daytonjs", "corstoken", "expressjs-lint" и другие, маскировались под популярные библиотеки для веб-разработки, linting (проверки кода) и управления базами данных. Анализ метаданных показал, что все они были опубликованы 25-26 февраля 2026 года под учетными записями, использовавшими шаблонные имена, например, "christopher.smith.hal47" или "andrewdeanwalker007". Однако ключевым элементом атаки стал не сам код пакета, а механизм его установки. Каждый пакет содержал специальный скрипт "install.js", который автоматически выполнялся при установке через команду "npm install". Его единственной функцией была загрузка и запуск сильно обфусцированного вредоносного скрипта, расположенного по пути "vendor/scrypt-js/version.js".
Именно в этом скрипте и была реализована хитрая схема получения команд управления. Вместо того чтобы напрямую указывать домены командного сервера (C2, от англ. Command and Control), код содержал три хардкодированные ссылки на Pastebin. При выполнении скрипт поочерёдно обращался к этим публичным «заметкам», пытаясь извлечь из них скрытые данные. Внешне содержимое паст выглядело как безобидные, слегка корявые, технические тексты или фрагменты кода. Однако внутри них с помощью специального алгоритма были зашифрованы адреса управляющих серверов. Этот приём, известный как текстовая стеганография, позволяет эффективно скрывать данные на виду, минуя простые сигнатуры систем безопасности, которые ищут явные URL-адреса или IP. Как показал анализ, только первая паста была активна и содержала полезную нагрузку, остальные две служили резервными вариантами на случай её удаления исследование Open Source Malware.
Декодирование паст раскрыло список из более чем тридцати доменов на платформе Vercel, таких как "ext-checkdin[.]vercel[.]app" или "cleverstack-ext301[.]vercel[.]app". Механизм был построен по принципу отказоустойчивости: скрипт перебирал домены, пока не находил работающий. На момент обнаружения активным был лишь первый, что указывает на подготовленную инфраструктуру для быстрого переключения в случае блокировки. После успешного подключения к C2 вредоносная программа определяла операционную систему жертвы (Windows, Linux, macOS) и загружала соответствующую платформе вторую стадию атаки. Для этого использовались стандартные системные утилиты "curl" или "wget", что делало сетевую активность менее подозрительной.
Полезная нагрузка для каждой ОС была разной, но логика сохранялась: скачивание и выполнение финального скрипта, который уже осуществлял закрепление в системе (persistence) и, вероятно, крал данные или открывал бэкдор. Например, на Linux скрипт сохранялся в скрытую папку "$HOME/.config/" под именем "tokenlinux.sh", после чего запускался в фоновом режиме. Подобная многоэтапная архитектура, использование публичных сервисов для dead-drop резолвинга (техники скрытого получения инструкций) и обширный список резервных доменов характерны для высокоорганизованных групп, таких как FAMOUS CHOLLIMA. Это не первая их кампания, нацеленная на npm, что свидетельствует о системном интересе к компрометации цепочек поставок программного обеспечения (software supply chain).
Для специалистов по информационной безопасности данный инцидент служит очередным напоминанием о критически важном мониторинге сетевой активности в корпоративных средах разработки. Ключевыми индикаторами компрометации (IoC) могут служить процессы Node.js, неожиданно запускающие "curl" или "wget" с параметрами загрузки и немедленного выполнения ("... | sh"), DNS-запросы к "pastebin.com" из контекста приложений Node.js, а также HTTP-запросы к доменам "*.vercel.app" с user-agent, соответствующим сетевым утилитам. Кроме того, необходимы строгие политики проверки сторонних зависимостей, включая анализ скриптов "preinstall" и "postinstall" в файле "package.json". Регулярный аудит устанавливаемых пакетов и использование решений для анализа состава программного обеспечения (SCA) могут помочь выявить подобные угрозы на ранней стадии. В конечном счёте, безопасность open-source экосистемы остаётся общей ответственностью, требующей постоянного взаимодействия между исследователями, поставщиками платформ и конечными пользователями.
Индикаторы компрометации
Domains
- atlasnode-app204.vercel.app
- atlasnode-ext957.vercel.app
- brightlaunch-app615.vercel.app
- brightlaunch-ext742.vercel.app
- cleverstack-app998.vercel.app
- cleverstack-ext301.vercel.app
- cloudharbor-app239.vercel.app
- cloudharbor-ext664.vercel.app
- ext-checkdin.vercel.app
- fusionlayer-app463.vercel.app
- fusionlayer-ext807.vercel.app
- logicfield-app681.vercel.app
- logicfield-ext432.vercel.app
- neuraldock-app734.vercel.app
- neuraldock-ext126.vercel.app
- openmatrix-app882.vercel.app
- openmatrix-ext539.vercel.app
- orbitstack-app318.vercel.app
- orbitstack-ext592.vercel.app
- primevector-app920.vercel.app
- primevector-ext483.vercel.app
- quantapath-app914.vercel.app
- quantapath-ext275.vercel.app
- signalbase-app845.vercel.app
- signalbase-ext369.vercel.app
- sparkforge-app790.vercel.app
- sparkforge-ext518.vercel.app
- visiondock-app157.vercel.app
- visiondock-ext648.vercel.app
- zenithflow-app877.vercel.app
- zenithflow-ext156.vercel.app
URLs
- http://ext-checkdin.vercel.app/api/tokenl?&st=Z09RcS80UmR0VzdpTUh0Q055Y3ZIQT09OnpadVJXRElOV0o0TkFxbDRneFAwRHVzbnU5SVJLUURTcjUvcnBiY0o3MG42L1pCM3lmdjFVMk0zdkhjdGg1QkV4bzZJMkNmQStCejY3bEd4b1NRQnZEQkE2RXhVL1FkZjJDWUdzNGJNVVQ4UVZVc0JMZklTa1pzaFR0T0pSVnVSVXFHRnR2WGNuMUlVV2RtdlpRcXlyN2JWWTBwYzFCTEpkRVJnSFdCdW5Hdz0
- http://ext-checkdin.vercel.app/api/tokenl?st=eXVCQi90UlVBMkF0MkpOd09jY1hJdz09OlAvcFZYajB5dG1QbUczTm16ZFVoQUhIcFVjL3ZOUFYxQlBRZEw1emp5K2gvTnE1VmFEamFQaG4zVEdwNDJSRVdoRm1zTEVXbitjSlBMWnd2blp1ZWFJcWhjNnZicWMwUVNGUTZWUndrb0pnWVRmbnRJcVJrcXM5NUtQRllGNCtNeThZZEQxQjY1T3M3a1hwbXhpMWdtRjhnclZkOXhwT0J6d0RHbjdrSXY3UT0
- http://ext-checkdin.vercel.app/api/tokenw?st=eTExbGRFdENlUlVWbTRyS2ZlMXFuQT09OmpJb0RRWktvV2wzaVRSNWZ4RzVqV1AwM0w2L3ZiZ1ltS1MvZ2E4aGQ1dFlYQmxjeHd3VmdSMkRVRTExL21VZS94aGl1MFBHWDRqSDdicTZMRHYrSWFaRDh6N3Zmcis4VXFybzRXNzU4blVYalNJUnRQVzEyZUJDZlJQdCtYajVBOUxXbnVLaVJuNnlNWXd3bDMvTnlRQWhDVEZDSDhreXdvdEpuVG9TVkpOZz0
SHA256
- 869c327b8dc757fa126cd281bc4a14d809c50e9a792954442c55cea5b46912ec
- bce0da6547ae74f97e2bb61672a3e159b837acf01f7c68a813ea75c3835ff303
- e361d2859ba2eb2540bf6fb12db0b9857ef610bb9920830921e986d4b9109e89