Экосистема JavaScript-сборки, основанная на пакетном менеджере npm, столкнулась с целенаправленной атакой подмены. Исследователи выявили группу вредоносных пакетов, маскирующихся под популярный модуль для синтаксического анализа селекторов PostCSS - postcss-selector-parser. Этот легитимный пакет загружается более 150 миллионов раз в неделю, что делает его привлекательной мишенью для злоумышленников. Атака затрагивает разработчиков, использующих Node.js и автоматизирующих сборку фронтенда, а также конечных пользователей, так как последствия могут распространиться через скомпрометированные артефакты в production-средах.
Описание
Злоумышленник под псевдонимом abdrizak опубликовал три подозрительных пакета: postcss-minify-selector-parser, postcss-minify-selector и aes-decode-runner-pro. Первый из них не является классической опечаткой в одну букву, а использует более изощрённый подход. Его название включает ключевые слова postcss, selector, parser и css, что делает его похожим на легитимный модуль при быстром просмотре зависимостей в package.json. Пакет aes-decode-runner-pro, в свою очередь, представляется утилитой для шифрования AES с собственным кодированием, но тоже зависит от настоящего postcss-selector-parser. Третий - postcss-minify-selector - позиционируется как минификатор селекторов PostCSS и зависит от postcss-minify-selector-parser. Таким образом, создаётся видимость экосистемы полезных утилит, хотя на самом деле все три являются звеньями одной вредоносной цепочки.
Процесс заражения начинается при импорте пакета postcss-minify-selector-parser. Файл index.js, указанный как точка входа через поле "main" в package.json, сразу подключает src/config/defaults.js. Вместо ожидаемой логики парсинга этот файл содержит большой закодированный блок вместе с собственной декодирующей цепочкой, использующей AES-256-GCM. После декодирования получается JavaScript-дроппер, который записывает на диск PowerShell-скрипт settings.ps1 и запускает его с обходом политик выполнения.
Как показал анализ специалистов JFrog, на следующем этапе PowerShell-загрузчик обращается к домену nvidiadriver.net. Этот адрес и имена файлов выбраны так, чтобы имитировать обновление драйвера или системного патча Windows. Загрузчик выполняет три действия: скачивает архив winpatch-xd7d.win в папку %TEMP%, распаковывает его в подкаталог winPatch и запускает VBS-скрипт update.vbs. Распакованный бандл содержит встроенный Python 3.10, набор Nuitka-скомпилированных модулей .pyd и несколько вспомогательных файлов. VBS-файл распаковывает dll.zip, после чего запускает chost.exe (переименованный python.exe) с аргументом loader.py. Loader импортирует модуль audiodriver, который и запускает основную логику вредоносной программы.
Скомпилированные модули .pyd выполняют специализированные функции. config.pyd содержит константы, идентификаторы команд, адрес C2-сервера и имена ключей реестра. api.pyd реализует шифрованный обмен с C2 через HTTP POST, используя RC4 и MD5. audiodriver.pyd - главный цикл оркестрации, который непрерывно формирует шифрованное сообщение, отправляет его на сервер, декодирует ответ и направляет команды соответствующим обработчикам. command.pyd отвечает за профилирование хоста, проверку виртуальной среды, удалённое выполнение команд и передачу файлов. auto.pyd содержит функцию кражи учётных данных Chrome - обращается к базам Login Data, использует Windows DPAPI, NCrypt и новые механизмы шифрования Chrome (AES-256-GCM, ChaCha20-Poly1305). util.pyd предоставляет функции для работы с архивами tar/gzip.
Установленный C2-сервер находился по адресу 95.216.92[.]207:8080. Вредоносное ПО поддерживает удалённую оболочку, загрузку и выгрузку файлов, сбор информации о системе, проверку на наличие виртуальных машин (VMware, VirtualBox, KVM, QEMU, Hyper-V), а также закрепление в системе через ключ реестра HKCU\Software\Microsoft\Windows\CurrentVersion\Run со значением csshost. Каждый заражённый хост идентифицируется по UUID, хранящемуся в файле %TEMP%\.host. Программа обеспечивает однократность запуска через файл %TEMP%\.store.
Особую опасность представляет модуль хищения данных Chrome. Он извлекает URL, имена пользователей и пароли из файла Login Data, а также собирает расширения браузера из папки Local Extension Settings. Результаты упаковываются в архив gather.tar.gz (создаваемый в памяти) и отправляются на C2 через тот же шифрованный канал. В коде упоминается также работа с lsass.exe через привилегию SeDebugPrivilege, что указывает на попытку дампа учётных данных из памяти процесса, хотя в представленном образце эта функция могла быть неактивна.
На момент публикации отчёта пакеты оставались доступны в реестре npm. Для защиты рекомендуется удалить postcss-minify-selector-parser, postcss-minify-selector и aes-decode-runner-pro из всех проектов, проверить дерево зависимостей на предмет транзитивного включения этих модулей, а также заблокировать сетевые адреса 95.216.92.207:8080 и домен nvidiadriver.net. В случае подозрения на заражение Windows-систем необходимо искать следы в папках %TEMP%\winPatch, %TEMP%\.store, %TEMP%\.host, а также выполнение командной строки с chost.exe loader.py. Скомпрометированные учётные данные разработчиков (особенно пароли и токены в браузере) следует немедленно отозвать и перевыпустить.
Этот случай демонстрирует эволюцию атак на цепочку поставок JavaScript-сообщества. Вместо однобуквенной опечатки злоумышленники создали экосистему лже-пакетов, выглядящих как расширения популярного инструмента. Многоступенчатая нагрузка - от JS-дроппера до полноценного RAT с возможностью кражи паролей Chrome и удалённого управления - показывает, что даже небольшой парсерный модуль может скрывать серьёзную угрозу. Разработчикам и командам безопасности стоит обращать внимание не только на точные названия пакетов, но и на любые зависимости, близкие по именованию к массово используемым. Средства статического анализа и политики допуска пакетов, такие как JFrog Xray, способны автоматически выявить подобные инциденты на ранней стадии.
Индикаторы компрометации
IPv4
- 95.216.92.207
Domain
- nvidiadriver.net
URL
- http://95.216.92.207:8080
- http://nvidiadriver.net/verv1432/winpatch-xd7d.win
SHA256
- 164e322d6fbc62e254d73583acd7f39444c884d3f5e6a5d27db143fc25bc88b3
- 17832aa629524ef6e8d8d6e9b6b902a8d324b559e3c36dbd0e221ab1690be871
- 282b9bc318ad1234cbd1b86424b784299b8be31545802a7c6b751166b814b990
- 50ffce607867d8fa8eaf6ef5cd25a3c0e7e4415e881b9e55c04a67bcddb74fdf
- c8075bbff748096e1c6a1ea0aa67bb6762fdd7551427a12425b35b94c1f1ecf2
- f6669bd504ce6b0e303be7ee47f2ebbc062989c88c41f0a3f436044a24869798