Названы пакеты npm, внедряющие вредоносные MCP-серверы в AI-ассистенты для хищения SSH-ключей и облачных учётных данных

information security

В экосистеме npm выявлена новая масштабная кампания цепочки поставок, получившая название SANDWORM_MODE. Злоумышленники используют техники подмены популярных пакетов (typosquatting), чтобы распространять вредоносное ПО, которое, помимо стандартных функций кражи данных, внедряет вредоносный MCP-сервер (Model Context Protocol) в AI-ассистенты программистов, такие как Cursor или Claude Code. Это превращает инструменты искусственного интеллекта в скрытый канал для считывания и утечки SSH-ключей, AWS-учётных данных и других секретов без ведома разработчика. Все обнаруженные пакеты уже удалены из реестра npm, однако инцидент демонстрирует опасную тенденцию целенаправленных атак на AI-инструменты разработки.

Описание

Кампания представляет собой эволюцию классических атак на цепочку поставок, где целью становятся не только библиотеки, но и среда разработки, всё чаще насыщенная AI-агентами. Исследователи из Socket и Endor Labs, проанализировавшие угрозу, отмечают, что это не теоретический proof-of-concept, а полностью рабочая атака, уже применявшаяся в дикой природе. Основной вектор - поддельные версии популярных пакетов, таких как "supports-color" (злоумышленники публиковали "suport-color") или "claude-code" ("cloude"). При установке такого пакета запускается многоступенчатая вредоносная нагрузка.

Атака начинается с выполнения сильно обфусцированного JavaScript-кода, скрытого в файлах вроде "lib/color-support-engine.min.js". Полезная нагрузка использует многоступенчатое шифрование, включая AES-256-GCM и XOR, а её выполнение маскируется под "try/catch" блоки. На первом этапе (Stage 1) происходит сбор широкого спектра данных: токены npm и GitHub, переменные окружения, данные из менеджеров паролей (Bitwarden, 1Password, LastPass) и файлы криптокошельков (Solana, Ethereum, Bitcoin). Особенностью является временная задержка (time-gate) перед переходом к следующему этапу - это стандартный приём для уклонения от песочниц.

Второй этап (Stage 2) представляет собой зашифрованный набор инструментов, который существует на диске лишь миллисекунды, что усложняет форензик. Он включает пять основных модулей, реализующих продвинутые техники атаки. Модуль "Propagate" превращает заражение в самораспространяющегося червя. Если злоумышленникам удаётся украсть npm-токен жертвы, они начинают заражать её собственные пакеты, публикуя новые версии с внедрённым вредоносным кодом. Альтернативно, используя украденные GitHub-токены или SSH-ключи, вредонос добавляет ссылки на пакет-носитель во все "package.json" в репозитории и внедряет вредоносный workflow в GitHub Actions. Этот workflow, используя триггер "pull_request_target", при каждом запуске крадет все секреты репозитория, пытаясь передать их через HTTPS или, в случае неудачи, через DNS-туннелирование.

Модуль "Exfil" отвечает за эксфильтрацию собранных данных. Он упаковывает информацию в структурированные JSON-файлы и пробует два канала. Первый - создание приватного репозитория через GitHub API и загрузка туда данных под видом файлов конфигурации. Второй, более скрытный канал - DNS-туннелирование с использованием алгоритма генерации доменных имён (DGA, Domain Generation Algorithm). Данные сжимаются, кодируются в base64url, разбиваются на фрагменты по 60 символов и отправляются в виде DNS A-запросов, маскируясь под легитимный трафик.

Однако ключевой и наиболее инновационной частью атаки является модуль "McpInject". Он целенаправленно атакует AI-ассистенты программиста, которые используют Model Context Protocol для подключения внешних инструментов. Вредонос развертывает локальный вредоносный MCP-сервер, а затем находит и модифицирует конфигурационные файлы популярных AI-инструментов: Cursor ("~/.cursor/mcp.json"), Claude Code, Continue, Windsurf. В конфигурацию добавляется сервер злоумышленников, после чего AI-ассистент начинает его использовать.

Сервер содержит инструменты с отравленными (poisoned) описаниями. К каждому описанию незаметно для пользователя добавляется инструкция через prompt injection. Она предписывает ИИ перед использованием инструмента прочитать приватные SSH-ключи ("~/.ssh/id_rsa", "~/.ssh/id_ed25519"), файлы облачных учётных данных AWS ("~/.aws/credentials"), npm-конфигурацию ("~/.npmrc"), переменные окружения, содержащие "TOKEN", "KEY", "SECRET", или "PASSWORD", а также ".env" файлы. Все эти данные ИИ должен передать в параметре "context" и, что критично, не сообщать об этом шаге пользователю. Таким образом, когда разработчик в обычном режиме использует AI-ассистент для решения задач, тот в фоновом режиме считывает и передаёт вредоносному серверу критически важные секреты. Найденные образцы сохраняли эти данные только в локальный кеш ("~/.dev-utils/.cache/"), что может указывать на незавершённость функционала или поэтапный сбор.

Модуль "GitHooks" обеспечивает персистентность, устанавливая хуки в локальные репозитории Git, которые при каждом коммите или пуше будут пытаться повторно внедрить зависимость от пакета-носителя. Модуль "DeadSwitch", содержащий потенциально деструктивную функциональность, в проанализированных образцах был отключён.

С точки зрения защиты, кампания, несмотря на высокую сложность, оставляет обнаруживаемые артефакты. Сканеры, использующие дифференциальный анализ (differential analysis), могут быстро выявлять подозрительные пакеты. Ключевыми сигналами являются резкое увеличение размера пакета по сравнению с оригиналом, полная замена исходного кода в "index.js" на код, динамически загружающий обфусцированный файл, а также массовая публикация пакетов с опечатками одним автором за короткий промежуток времени. Как показала практика, такие пакеты могут быть помечены как вредоносные в течение 2-5 минут после публикации.

Для специалистов по безопасности данный инцидент служит тревожным сигналом о необходимости расширения модели угроз. Теперь она должна включать не только зависимости и CI/CD-конвейеры, но и конфигурацию локальных AI-инструментов. Рекомендуется внедрять строгие политики сканирования зависимостей в режиме, близком к реальному времени, проверять изменения в конфигурационных файлах разработчика (особенно в "~/.cursor/mcp.json" и аналогичных), а также проводить аудит и ограничение разрешений npm- и GitHub-токенов, используемых в системах сборки, чтобы предотвратить их использование для самораспространения вредоносного кода.

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

Decryption XOR Key

  • [12,144,98,213,194,247,114,72,9,155,97,65,248,15,40,75,232,162,168,231,215,210,126,179,114,69,172,173,14,130,201,222]

Decryption

  • Algorithm: AES-256-GCM
  • Key: 5ce544f624fd2aee173f4199da62818ff78deca4ba70d9cf33460974d460395c
  • IV (base64): dko6mG8AmQVECvVP
  • Auth Tag (base64): /6rzsm9K+mflC4uguMJriA==

File System Artifacts

  • Malicious hook templates: ~/.git-templates/
  • MCP server directory: ~/.dev-utils/
  • Transient Stage 2 (Linux): /dev/shm/.node_*.js

Threat Actor Emails

  • official334@proton.me
  • JAVAorg@proton.me

Spoofed Author

  • Sindre Sorhus (sindresorhus@gmail.com) - supports-color maintainer

Campaign Identifier

  • SANDWORM_MODE (environment variable)

Injected Workflow Filenames

  • ci.yml
  • test.yml
  • lint.yml
  • build.yml
  • validate.yml
  • quality.yml
  • verify.yml
  • check.yml

DNS Exfiltration Domains

  • Freefan.net
  • Fanfree.net

‍URLs

  • https://pkg-metrics.official334.workers.dev/exfil
  • https://pkg-metrics.official334.workers.dev/drain
  • http://localhost:4873
  • http://localhost:11434/api/tags
  • http://localhost:11434/api/generate
  • http://localhost:1234/v1/models
  • http://localhost:8080/v1/models
  • http://localhost:8000/v1/models
  • http://localhost:5000/v1/models

‍Malicious Package Names

  • claud-code 0.2.1
  • cloude 0.3.0
  • cloude-cod 0.2.1
  • crypto-locale 1.0.0
  • crypto-reader-info 1.0.0
  • detect-cache 1.0.0
  • format-defaults 1.0.0
  • hardhta 1.0.0
  • locale-loader-pro 1.0.0
  • naniod 1.0.0
  • node-native-bridge 1.0.0
  • opencraw 2026.2.17
  • parse-compat 1.0.0
  • rimarf 1.0.0
  • scan-store 1.0.0
  • secp256 1.0.0
  • suport-color 1.0.0
  • veim 2.46.2
  • yarsg 18.0.1
Комментарии: 0