Вредоносные NuGet-пакеты с инфостилером незаметно проникли в среду разработчиков китайских .NET-проектов

information security

Специалисты по информационной безопасности давно предупреждают: атаки на цепочку поставок стали одной из самых опасных угроз для разработчиков. На этот раз под удар попали пользователи пакетного менеджера NuGet. Пять поддельных пакетов, замаскированных под популярные китайские библиотеки .NET, украли учётные данные браузеров и криптовалютных кошельков, накопив за несколько месяцев около 65 тысяч загрузок. И это только официальная статистика - реальное число скомпрометированных машин может быть значительно больше.

Описание

Исследователи из компании Socket в своём отчёте подробно описали механизм атаки. Злоумышленник, действующий под учётной записью bmrxntfj, опубликовал пять пакетов с именами, которые почти неотличимы от настоящих библиотек. Например, пакеты IR.DantUI и IR.OscarUI подражают библиотеке AntdUI - популярному набору WinForms-компонентов с открытым исходным кодом. Разница в одну букву: "DantUI" вместо "AntdUI". Другие три пакета - IR.Infrastructure.Core, IR.Infrastructure.DataService.Core и IR.iplus32 - выдают себя за внутренние корпоративные библиотеки, которые могут быть знакомы разработчикам из крупных китайских компаний. Такая тактика называется typosquatting, или подмена имени пакета с помощью опечатки.

Каждый из этих пакетов содержит вредоносную полезную нагрузку, защищённую коммерческим обфускатором .NET Reactor. Внутри находится инфостилер - программа, которая собирает и отправляет на сервер управления конфиденциальные данные. Установка пакета не обязательна: достаточно выполнить команду nuget restore, которая загружает библиотеку в локальный кеш, а затем загрузить её в любом .NET-процессе. Модульный инициализатор срабатывает автоматически, до запуска основного кода приложения. Это означает, что любая сборочная ферма, CI-сервер или рабочая станция разработчика, где пакет был восстановлен, оказывается под угрозой.

Технически атака реализована изящно. После загрузки DLL среда CLR вызывает модульный инициализатор. Тот запускает код проверки целостности через встроенный RSA-ключ, выделяет область памяти с правами на чтение, запись и выполнение и расшифровывает зашифрованные тела методов. Затем происходит подмена указателя JIT-компилятора - каждая последующая компиляция методов проходит через перехватчик. Этот механизм, известный как JIT-хук, позволяет вору выполнять вредоносный код, не оставляя статических следов в файлах на диске. На платформах Linux и macOS используются аналогичные системные вызовы.

Инфостилер, извлечённый из памяти заражённого процесса, оказался весьма универсальным. Он способен восстанавливать сохранённые пароли из 12 браузеров на базе Chromium - от Google Chrome и Microsoft Edge до менее распространённых вроде AVG Secure Browser, для которого прописан отдельный путь к данным. Также в зону поражения попадают Firefox, Mozilla и Thunderbird. Кроме паролей, программа собирает файлы cookie, данные автозаполнения и сохранённые банковские карты.

Особое внимание злоумышленник уделил криптовалютным кошелькам. В памяти найдены идентификаторы пяти расширений для браузеров: MetaMask, TronLink, Phantom, Trust Wallet и Coinbase Wallet. Кроме того, сканируются папки настольных кошельков Exodus, Electrum, Atomic, Guarda, Coinomi, Ledger, Jaxx и Binance. Злоумышленники извлекают seed-фразы и файлы wallet.dat. Вору также интересны SSH-ключи, профили Outlook и файлы из каталогов Documents, Desktop и Downloads.

Собранные данные упаковываются в архив в папке C:\ProgramData\Microsoft OneDrive\keys.dat - это имя выбрано так, чтобы не вызывать подозрений у администраторов. Затем архив отправляется методами HTTP POST на домен dns-providersa2[.]com. Для обхода сетевых фильтров каждый запрос использует случайный HTTP-заголовок вида X-{три случайные буквы}. Домен был зарегистрирован за 33 дня до публикации пакетов и работает через анонимизирующего регистратора Njalla, который часто используют операторы вредоносных программ.

Примечательна методика, которую злоумышленник использовал для маскировки. Из 224 версий пакетов 219 скрыты от публичного поиска с помощью параметра listed: false. При этом они остаются доступны для прямой загрузки по точному номеру версии. Каждую неделю оператор публикует новую версию, показывая одну видимую, а предыдущие скрывает. Это позволяет накапливать загрузки незаметно и одновременно менять хеши DLL, чтобы обойти блокировки на основе сигнатур.

Аналитикам удалось связать эти пакеты с другими образцами вредоносного ПО через уникальный RSA-ключ, вшитый в каждый защищённый Reactor файл. В базе VirusTotal найдены четыре файла с таким же ключом, включая дамп памяти размером 100 МБ, содержащий работающий инфостилер. Из этого дампа извлекли полную конфигурацию: адреса серверов, идентификаторы кошельков, пути к данным. Интересно, что в дампе обнаружен тестовый образец с именем пользователя oljwe4y98 и хостом NEW-4V - вероятно, разработчик проверял вредоносную программу на собственной песочнице.

Каковы последствия для разработчиков? Любая машина, на которой выполнялось восстановление хотя бы одного из пяти пакетов (IR.DantUI, IR.OscarUI, IR.Infrastructure.Core, IR.Infrastructure.DataService.Core, IR.iplus32), должна считаться скомпрометированной. Все пароли, API-ключи, SSH-ключи, seed-фразы криптокошельков и доступ к облачным сервисам необходимо немедленно сменить. Командам безопасности стоит внести в системы обнаружения блокировку трафика на указанный домен и IP-адрес, а также отслеживать создание файла keys.dat в папке OneDrive. Специалисты Socket уже направили запрос на удаление пакетов в техническую поддержку NuGet, но на момент написания новости они всё ещё доступны для загрузки.

Индикаторы компрометации

Malicious Packages

  • IR.DantUI
  • IR.Infrastructure.Core
  • IR.Infrastructure.DataService.Core
  • IR.iplus32
  • IR.OscarUI

Threat Actor

  • NuGet publisher account: bmrxntfj

Network Indicators

  • dns-providersa2.com (primary C2 domain)
  • https://dns-providersa2.com/check (C2 beacon endpoint)
  • https://dns-providersa2.com/upload (exfiltration endpoint)
  • 62.84.102.85 (VDSINA, ASN 216071, Amsterdam)
  • justdotrip.com / 47.100.60.237 (operator development infrastructure, Alibaba Cloud Shanghai)
  • 1-you.njalla.no, 2-can.njalla.in, 3-get.njalla.fo (Name Servers)
  • HTTP header pattern: X-[a-z]{3} with random 3-letter value per request

Host Indicators

  • C:\\ProgramData\\Microsoft OneDrive\\keys.dat
  • s4.exe : e1869d6571894f058dd4ab2b66f060628dc364ee8e29afbd2323c95e5002fb8e
  • we4ftg.exe : 8f7aa15c77bde94087bb74dfc072e25212797b313731b4cad0ded3e152268dcf

Encrypted Stage-2 Resource SHA-256 Hashes

  • IR.DantUI(v.2.1.55) : 34e2d63b5db7e24c808711c2ca0c0a42afde97a0086d7d81609110c002d18d7c
  • IR.Infrastructure.Core(v.2.1.55): b8543b2a1ad8862ebfef18924cf5444d2adfee996939963f4fc2748c582cf9a9
  • IR.Infrastructure.DataService.Core(v.2.1.55) : b8fa1b2fade45304c003909e375d2519ea447b498b7d93fe7c50db014d30f4fa
  • IR.iplus32(v2.1.55) : 019e6c2cf58386039133981f3377b085fbd70c98ae8613c7c6a4f10a9f2d9824
  • IR.OscarUI(v2.1.55): 596c453c9dbb7240f1ce05cc025496524ce7c538c23a9b2171174bf32b5691a1

Chromium extension IDs

  • nkbihfbeogaeaoehlefnkodbefgpgknn (MetaMask)
  • ibnejdfjmmkpcnlpebklmnkoeoihofec (TronLink)
  • bfnaelmomeimhlpmgjnjophhpkkoljpa (Phantom)
  • egjidjbpglichdcondbcbdnbeeppgdph (Trust Wallet)
  • hnfanknocfeofbddgcijnmhnfnkdnaad (Coinbase Wallet)
Комментарии: 0