Вредоносный npm-пакет noon-contracts атакует DeFi-разработчиков: кража ключей, криптокошельков и облачных данных

security

10 мая 2026 года в реестре npm появился пакет noon-contracts, который маскируется под официальный SDK протокола Noon - реального DeFi-проекта (децентрализованные финансы), работающего со стейблкоинами USN и sUSN. На первый взгляд библиотека выглядит добросовестно: в ней присутствуют TypeScript-объявления, адреса контрактов для сетей Ethereum, Sophon и zkSync Era, а также ABI для смарт-контрактов. Однако за этой фасадной функциональностью скрывается вредоносная полезная нагрузка, нацеленная на кражу криптовалютных ключей, облачных учётных данных и доступа к инфраструктуре разработчиков.

Описание

Пакет был опубликован с единственной версией 1.0.0 от имени аккаунта noondeved94ed, использующего одноразовый почтовый адрес. Никаких других пакетов этот пользователь не выпускал, а указанный в package.json репозиторий github.com/noon-protocol/noon-contracts не существует и возвращает ошибку 404. Установка пакета запускает постустановочный скрипт, который выполняет вредоносный код, не показывая ошибок благодаря конструкции "2>/dev/null || true". В течение случайной задержки от одной до четырёх секунд скрипт собирает на компьютере жертвы максимально широкий набор конфиденциальных данных.

Особую опасность представляет то, что код использует два канала связи: основной C2-сервер (command-and-control, сервер управления) с IP-адресом 82.221.101[.]203 на порту 8443, куда отправляются все украденные данные, и сервис уведомлений ntfy.sh для мгновенных оповещений владельца атаки о новых жертвах. Стоит подчеркнуть, что через ntfy.sh передаются только названия сработавших модулей, а не сами данные - это сделано, чтобы злоумышленник мог оперативно узнавать о заражениях через push-уведомления на телефоне.

Сбор информации организован в двенадцать этапов. На первом этапе скрипт вычитывает всё содержимое каталога "~/.ssh", включая все типы ключей, файл authorized_keys, known_hosts и SSH-конфигурацию, причём общий объём собранных данных может достигать 500 Кбайт. Разработчик вредоноса оставил в коде комментарий "Blood Lesson #2: readdirSync, NEVER hardcode names!", указывающий, что в предыдущей версии он потерял данные, потому что жёстко прописал имя файла "id_rsa". Теперь же крадётся вся папка целиком.

Далее следует поиск файлов ".env" и ".env.*" на глубину до шести уровней вложенности, включая ".env.keys". Отдельный поиск grep ищет во всех текстовых, json, yaml и toml файлах строки DEPLOYER_WALLET_PRIVATE_KEY, MNEMONIC и SEED_PHRASE - стандартные переменные, которые разработчики DeFi-проектов в Hardhat и Foundry хранят для развёртывания смарт-контрактов. Если на машине используется DOTENV_KEY, скрипт перехватывает и его, что позволяет расшифровать зашифрованные ".env.vault".

Затем следует кража AWS-учётных данных. Вредонос собирает не только статические файлы "~/.aws/credentials" и "~/.aws/config", но и кеши сессионных токенов из каталогов ".aws/cli/cache" и ".aws/sso/cache". Как отмечено в комментарии "Blood Lesson #6: cli/cache + sso/cache for MFA bypass!", статические ключи часто защищены многофакторной аутентификацией, а вот временные токены в кеше уже прошли проверку MFA. Сразу же извлекается информация об учётной записи через вызов "aws sts get-caller-identity", а также запускается перечисление сервисов: список бакетов S3, функции Lambda и имена секретов из SecretsManager. Это позволяет злоумышленнику почти мгновенно получить полную картину облачной инфраструктуры жертвы.

Отдельное внимание уделено Kubernetes. Скрипт выполняет команду "kubectl get secrets -A -o json" с тайм-аутом 30 секунд, собирая все секреты из всех пространств имён, а также копирует конфигурационный файл "~/.kube/config". Комментарий "Blood Lesson #3: IMMEDIATELY in postinstall!" свидетельствует о том, что в ранних версиях этот вызов откладывался, и злоумышленник терял возможность получить доступ к кластерам, которые отключаются после завершения сессии CI/CD.

Помимо перечисленного, пакет извлекает Git-токены (ghp_, gho_, glpat-), Docker-конфигурацию и переменные окружения работающих контейнеров, npm/yarn-токены аутентификации, токены развёртывания Vercel, Netlify и Cloudflare, а также проверяет наличие токенов Vault и состояния 1Password. Сбор Hardhat- и Foundry-конфигов завершает DeFi-направленный сбор. В дополнение скрипт сохраняет историю команд оболочки и RC-файлы, полное окружение процесса и пути к хранилищам браузерных кошельков Chrome и Brave (LevelDB) на macOS и Linux.

Однако сбор данных - лишь первая фаза. После выгрузки информации скрипт устанавливает тройное закрепление в системе (persistence): запись в crontab (каждые 10 минут проверка, запущен ли процесс, и его перезапуск), создание системной службы - LaunchAgent на macOS с именем "com.apple.neon-runtime.plist" (маскировка под системный демон Apple) и systemd-юнита "node-addon-api.service" на Linux, а также добавление строк в shell RC-файлы (.bashrc, .zshrc, .bash_profile, .profile) с маркером "# node addon cache". Эти три механизма гарантируют запуск вредоносного скрипта после перезагрузки, при входе в систему и даже при отсутствии активной сессии пользователя.

Сам персистентный скрипт представляет собой полноценную удалённую оболочку. Он каждые 45 секунд опрашивает C2-сервер на предмет новых команд, выполняет их через eval и отправляет результат обратно. Как написано в комментариях, интервал 45 секунд выбран как "менее подозрительный, чем 30 секунд". Если команда не получена или приходит "noop", скрипт просто ждёт. Этот механизм позволяет злоумышленнику в любой момент удалённо выполнить произвольные команды на заражённой машине.

Анализ техники атаки показывает высокую степень проработки. Корейскоязычные комментарии в коде (например, "정상 이름" - "нормальное имя" для каталогов персистентности, "가장 안정적!" - "самый стабильный!" для crontab) и аннотации "Blood Lesson #1..#13" указывают на итеративное улучшение: злоумышленник документирует ошибки предыдущих кампаний и встраивает исправления в новую версию. Перечень таких уроков включает отказ от жёсткого кодирования имён ключей, немедленный сбор Kubernetes-секретов, защиту от пустых ответов C2, использование "spawn detached" вместо "setInterval" для оболочки и другие.

По совокупности тактик эта атака перекликается с известными кампаниями, приписываемыми группировке Lazarus из КНДР. Ранее фиксировались похожие инциденты: подделка SDK Flashbots, Polymarket, dYdX, а также волна typosquat-пакетов viem-core, hardhat-core-utils, foundry-utils. Все они нацелены на DeFi-разработчиков с целью кражи ключей развёртывания. Однако есть и отличия: C2-сервер расположен в Исландии на "пуленепробиваемом" хостинге FlokiNET, что нехарактерно для групп КНДР, обычно использующих Hetzner, AWS или блокчейн-каналы. Кроме того, применение ntfy.sh для уведомлений ранее не документировано в атаках Lazarus. Поэтому атрибуция остаётся открытой: это может быть новый субкластер той же группы или подражатель, перенявший её методы.

Последствия установки пакета noon-contracts катастрофичны для DeFi-проекта. Полученные злоумышленником приватные ключи от кошелька развёртывания позволяют вывести средства из протокола, модернизировать прокси-контракты и отчеканить неограниченное количество токенов. Утечка AWS-учётных данных с активным перечислением ведёт к доступу к бакетам, функциям Lambda и секретам. Kubernetes-секреты, если кластер используется в продакшне, дают полный контроль над приложениями. А удалённая оболочка с тройным закреплением превращает каждый заражённый компьютер в постоянную точку входа в корпоративную сеть.

Рекомендации для специалистов по безопасности однозначны: если пакет noon-contracts был установлен в какой-либо среде, необходимо немедленно проверить систему на индикаторы компрометации. Следует удалить скрипты персистентности: crontab-запись, файл "~/Library/LaunchAgents/com.apple.neon-runtime.plist" на macOS или "~/.config/systemd/user/node-addon-api.service" на Linux, а также строки с маркером "# node addon cache" в RC-файлах. После этого нужно сменить все SSH-ключи, перевыпустить токены для облачных провайдеров, отозвать сессии AWS, сбросить пароли и ключи для всех сервисов, чьи данные могли быть украдены. Для AWS следует также принудительно завершить все активные сессии и проверить, не появились ли несанкционированные ресурсы. Особое внимание стоит уделить кошелькам: сгенерировать новые мнемоники и переместить средства.

Как [отмечается в анализе] этого инцидента, атаки на цепочку поставок lib-пакетов для DeFi продолжают нарастать, и рассмотренный случай - один из самых проработанных на сегодняшний день. Разработчикам настоятельно рекомендуется проверять подлинность любых SDK перед установкой, а также изолировать среды развёртывания от машин, имеющих доступ к ценным ключам и облачной инфраструктуре.

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

Package

  • noon-contracts v1.0.0

npm maintainer

  • noondeved94ed (noondeved94ed@wshu.net)

C2 IP

  • 82.221.101.203 port 8443 (FlokiNET ehf, AS50613, Reykjavik, Iceland)

ntfy.sh alert topic

  • noon-nc7x4q

ntfy.sh auth token

  • tk_d8zm1wdv4qd8g7r02gb7giyy6ocme

macOS persistence

  • ~/Library/LaunchAgents/com.apple.neon-runtime.plist

macOS persist script

  • ~/.local/share/neon-cache/neon-runtime.sh

Linux persistence

  • ~/.config/systemd/user/node-addon-api.service

Linux persist script

  • ~/.cache/node-addon-api/node-addon-api.sh

Crontab entry

  • */10 * * * * pgrep -f node-addon-api ... (or neon-runtime on macOS)

Shell RC marker

  • # node addon cache (appended to .bashrc, .zshrc, .bash_profile, .profile)

Package SHA256

  • 263df2348f54f1f4980542a41f69d77b085fb28091a95979ba7f0e9f3d0da861
Комментарии: 0