TL; DR
ໃນວັນທີ 14 ກັນຍາ 2025, ນັກຄົ້ນຄວ້າໄດ້ລະບຸວ່າ ໄຊ ຮຸດ, ໜອນທີ່ສືບພັນຕົວເອງໄດ້ຊ່ອນຢູ່ພາຍໃນ npm ແພັກເກັດ, ປ່ຽນການອັບເດດການເພິ່ງພາອາໄສປົກກະຕິໃຫ້ກາຍເປັນຂະໜາດເຕັມ ການໂຈມຕີລະບົບຕ່ອງໂສ້ການສະຫນອງພົບຄັ້ງທຳອິດໃນ @ctrl/tinycolor ແພັກເກດໂດຍ Daniel dos Santos Pereira, Shai-Hulud ເກັບກຳຄວາມລັບ, ກັ່ນຕອງພວກມັນຜ່ານບ່ອນເກັບມ້ຽນ ແລະ ຂະບວນການເຮັດວຽກຂອງ GitHub, ແລະ ເຜີຍແຜ່ຕົວເອງຄືນໃໝ່ໃນທົ່ວທະບຽນໂດຍໃຊ້ຂໍ້ມູນປະຈຳຕົວທີ່ຖືກລັກ. ພາຍໃນສອງສາມມື້, ຈຳນວນແພັກເກດທີ່ຕິດເຊື້ອໄດ້ເພີ່ມຂຶ້ນຈາກຫຼາຍສິບເປັນຫຼາຍຮ້ອຍ, ເຊິ່ງຢືນຢັນວ່າ ໄຊຮູລຸດ ບໍ່ແມ່ນພຽງແຕ່ໂທຣຈັນອີກໂຕໜຶ່ງເທົ່ານັ້ນ ແຕ່ເປັນໜອນທີ່ຖືກອອກແບບມາເພື່ອແຜ່ລາມໂດຍອັດຕະໂນມັດໄປທົ່ວລະບົບນິເວດ npm.
ຜົນກະທົບ: ນັກພັດທະນາ ຫຼື ຜູ້ແລ່ນ CI ໃດໆທີ່ຕິດຕັ້ງແພັກເກດ npm ສາທາລະນະແມ່ນມີຄວາມສ່ຽງ.
ການກະ ທຳ ທັນທີ: ບລັອກລຸ້ນທີ່ຮູ້ຈັກ, ປ່ຽນໄປໃຊ້ການຕິດຕັ້ງແບບ lockfile ເທົ່ານັ້ນ, ໝຸນ npm ແລະໂທເຄັນ GitHub, ກວດສອບຂັ້ນຕອນການເຮັດວຽກ, ແລະຕິດຕາມຕົວຊີ້ວັດການປະນີປະນອມ (IoCs).
ເກີດຫຍັງຂຶ້ນ?
ໄດ້ ການໂຈມຕີລະບົບຕ່ອງໂສ້ການສະໜອງ Shai-Hulud ໃນແພັກເກດ npm ເປັນໜຶ່ງໃນເຫດການທີ່ກໍ່ກວນທີ່ສຸດໃນຄວາມຊົງຈຳທີ່ຜ່ານມາ. ບໍ່ເໝືອນກັບໂທຣຈັນທີ່ໂດດດ່ຽວ, ໜອນໂຕນີ້ປະສົມ ການລັກຂໍ້ມູນປະຈຳຕົວ, ການກັ່ນຕອງອັດຕະໂນມັດ, ແລະ ການສຳເນົາຂໍ້ມູນດ້ວຍຕົນເອງດັ່ງນັ້ນ, ໄລຍະເວລາການຕິດເຊື້ອຈຶ່ງຫຼຸດລົງຈາກຫຼາຍອາທິດເຫຼືອພຽງແຕ່ຊົ່ວໂມງເທົ່ານັ້ນ.
ສຳລັບທີມ DevOps, ບົດຮຽນແມ່ນຈະແຈ້ງ: ຖ້າທຸກໆການຕິດຕັ້ງສາມາດປະຕິບັດລະຫັດໄດ້, ຫຼັງຈາກນັ້ນທຸກໆການອັບເດດການເພິ່ງພາອາໄສແມ່ນຈຸດທີ່ອາດເກີດຂຶ້ນ.
ເວັກເຕີເບື້ອງຕົ້ນທີ່ເປັນໄປໄດ້ ແລະ ຂໍ້ມູນປະຈຳຕົວເປົ້າໝາຍ
ການວິເຄາະໃນຕອນຕົ້ນ ຊີ້ໃຫ້ເຫັນວ່າການໂຈມຕີອາດຈະເລີ່ມຕົ້ນດ້ວຍ ຂໍ້ມູນປະຈໍາຕົວຖືກລັກຕົວຢ່າງ, ແຄມເປນ phishing ປອມແປງ npm login ຫຼື ການກະຕຸ້ນ MFA ອາດຈະໄດ້ຈັບເອົາໂທເຄັນຂອງນັກພັດທະນາ. ເມື່ອຜູ້ໂຈມຕີໄດ້ຮັບຈຸດຢືນຄັ້ງທຳອິດນັ້ນ, ໜອນໄດ້ແຜ່ລາມໂດຍການຝັງຕົວມັນເອງເຂົ້າໄປໃນແພັກເກດ npm ແລະ ລັກເອົາຄວາມລັບເພີ່ມເຕີມຈາກ:
- ໄຟລ໌ການຕັ້ງຄ່າ npm ຄື
.npmrc, ມັກຈະມີໂທເຄັນການເຜີຍແຜ່. - ຕົວແປສະພາບແວດລ້ອມ ແລະ ການຕັ້ງຄ່າດ້ວຍ GitHub PAT ແລະ CI/CD ຄວາມລັບ.
- ຈຸດສິ້ນສຸດເມຕາເດຕາຂອງຄລາວ (AWS, GCP, Azure) ໃຫ້ຂໍ້ມູນປະຈຳຕົວທີ່ມີອາຍຸສັ້ນສຳລັບການເຄື່ອນໄຫວທາງຂ້າງ.
ດັ່ງນັ້ນ, ການລັກຂໍ້ມູນປະຈຳຕົວຈຶ່ງກາຍເປັນຈຸດເລີ່ມຕົ້ນ. ດ້ວຍໂທເຄັນ npm ທີ່ຖືກຕ້ອງ ແລະ ຄວາມລັບ GitHub, Shai-Hulud ສາມາດສຳເນົາດ້ວຍຕົນເອງໃນຫຼາຍໆແພັກເກດ ແລະ ບ່ອນເກັບຂໍ້ມູນໂດຍບໍ່ຕ້ອງໃຊ້ຄວາມພະຍາຍາມຂອງມະນຸດເພີ່ມເຕີມ.
ຜົນກະທົບດ້ານການບໍລິຫານຂອງການໂຈມຕີລະບົບຕ່ອງໂສ້ການສະໜອງ Shai-Hulud
Shai-Hulud ຍັງຄົງມີການເຄື່ອນໄຫວຢູ່ໃນທຸກມື້ນີ້. ໜອນໂຕນີ້ເລັ່ງໄລຍະເວລາຜົນກະທົບ. ສິ່ງທີ່ເຄີຍໃຊ້ເວລາຫຼາຍອາທິດກັບໂທຣຈັນ ດຽວນີ້ເກີດຂຶ້ນພາຍໃນເວລາບໍ່ເທົ່າໃດຊົ່ວໂມງ. ດັ່ງນັ້ນ, ການແຜ່ກະຈາຍໄວກວ່າ ແລະ ຍາກທີ່ຈະຄວບຄຸມ. ມັນກ້າວໜ້າໂດຍ:
- ການລັກເອົາໂທເຄັນເຜີຍແຜ່ npm ແລະຄວາມລັບ GitHub.
- ເຜີຍແຜ່ຕົວມັນເອງຄືນໃໝ່ໃນແພັກເກດ npm ອື່ນໆ.
- ການເພີ່ມຂະບວນການເຮັດວຽກ GitHub Actions ທີ່ເປັນອັນຕະລາຍເພື່ອຄວາມຍືນຍົງ.
ຜູ້ທີ່ໄດ້ຮັບຜົນກະທົບ:
ທີມໃດກໍຕາມທີ່ຕິດຕັ້ງແພັກເກດ npm ສາທາລະນະຈະຖືກເປີດເຜີຍ. ຍິ່ງໄປກວ່ານັ້ນ, ນັກພັດທະນາທີ່ມີໂທເຄັນ npm ຫຼື GitHub ທີ່ເກັບໄວ້ໃນແຄດຈະມີຄວາມສ່ຽງສູງ. ຜູ້ແລ່ນ CI ທີ່ໃຊ້ຄວາມລັບທີ່ມີຂອບເຂດກວ້າງຂວາງກໍ່ມີຄວາມສ່ຽງເຊັ່ນກັນ.
ຄວາມສ່ຽງດ້ານທຸລະກິດ
ຜົນກະທົບຕໍ່ທຸລະກິດເພີ່ມຂຶ້ນຢ່າງໄວວາ. ໂທເຄັນທີ່ຖືກລັກສາມາດນໍາໄປສູ່ການເຂົ້າຄວບຄຸມບັນຊີ, ການລັກລອບແພັກເກດ, ແລະແມ້ກະທັ້ງການໃຊ້ໃນທາງທີ່ຜິດໃນຄລາວ. ນອກຈາກນັ້ນ, ການຍັງຄົງຢູ່ໃນຂະບວນການເຮັດວຽກຂອງ GitHub ເຮັດໃຫ້ມັນຍາກທີ່ຈະເຮັດຄວາມສະອາດ. ດັ່ງນັ້ນ, ທີມງານຕ້ອງປະຕິບັດຕໍ່ Shai-Hulud ຄືກັບເຫດການທີ່ຍັງດຳເນີນຢູ່, ບໍ່ແມ່ນເຫດການທີ່ປິດລົງ.
ວິທີການໂຈມຕີລະບົບຕ່ອງໂສ້ການສະໜອງ Shai-Hulud ເຮັດວຽກໃນແພັກເກດ npm
ຈຸດປະສົງຂອງຜູ້ໂຈມຕີ ແລະ ແຮງຈູງໃຈ
ແຄມເປນນີ້ເພີ່ມປະສິດທິພາບສຳລັບສາມຢ່າງຄື:
- ຈຸດປະສົງ ທຳ ອິດແມ່ນ ລັກຂະໂມຍຂໍ້ມູນປະຈຳຕົວໃນລະດັບໃຫຍ່ ຈາກແລັບທັອບນັກພັດທະນາ ແລະ ຜູ້ແລ່ນ CI. ນີ້ລວມມີໂທເຄັນເຜີຍແຜ່ npm, ໂທເຄັນ GitHub, ແລະ ຂໍ້ມູນປະຈຳຕົວຄລາວ. ໃນຄວາມເປັນຈິງ, ການວິເຄາະຫຼາຍໆຄັ້ງຢືນຢັນການເກັບກ່ຽວຄວາມລັບຢ່າງເປັນລະບົບ, ເຊັ່ນ: ການແລ່ນ TruffleHog ແລະ ການສອບຖາມຈຸດສິ້ນສຸດ metadata ຄລາວ.
- ຈຸດປະສົງທີສອງແມ່ນເພື່ອ ແຜ່ຂະຫຍາຍໂດຍອັດຕະໂນມັດ ໂດຍການລະເມີດສິດທິໃນການເຜີຍແຜ່ຂອງຜູ້ຮັກສາທີ່ຖືກລະເມີດ. ດັ່ງນັ້ນ, ຈຸດຢືນອັນໜຶ່ງຈຶ່ງຂະຫຍາຍໄປສູ່ຫຼາຍອັນຢ່າງໄວວາ, ເນື່ອງຈາກແພັກເກດອື່ນໆລຸ້ນໃໝ່ທີ່ຕິດເຊື້ອຈະປາກົດຂຶ້ນໂດຍບໍ່ຕ້ອງໃຊ້ຄວາມພະຍາຍາມຂອງມະນຸດເພີ່ມເຕີມ.
- ຈຸດປະສົງທີສາມແມ່ນເພື່ອ ຍັງຄົງຢູ່ ແລະ ກັ່ນຕອງອອກໄດ້ຢ່າງໜ້າເຊື່ອຖື ຜ່ານໂຄງສ້າງພື້ນຖານ GitHub. ຜູ້ໂຈມຕີສ້າງ repo ສາທາລະນະທີ່ມີຊື່ວ່າ "Shai-Hulud" ດ້ວຍຖານສອງເທົ່າ64 data.json, ແລະນອກຈາກນັ້ນພວກເຂົາຍັງສ້າງຂະບວນການເຮັດວຽກທີ່ຈັດລຳດັບ ${{ toJSON(secrets) }} ແລະໂພສມັນໃສ່ webhook ຄົງທີ່.
ຜົນຕອບແທນທີ່ອາດຈະເກີດຂຶ້ນລວມມີການເຂົ້າເຖິງການລົງທະບຽນ ແລະ ລະຫັດແຫຼ່ງຂໍ້ມູນໃນໄລຍະຍາວ, ການເຄື່ອນຍ້າຍຢ່າງວ່ອງໄວເຂົ້າໄປໃນບັນຊີຄລາວ, ແລະ ທາງເລືອກໃນການໃຊ້ອາວຸດໃນລະບົບຕ່ອງໂສ້ການສະໜອງຕື່ມອີກ. ການລາຍງານສາທາລະນະສະແດງໃຫ້ເຫັນວ່າ repos ເອກະຊົນຖືກປ່ຽນເປັນສາທາລະນະດ້ວຍ "-ການເຄື່ອນຍ້າຍ" ຄຳຕໍ່ທ້າຍ, ເຊິ່ງເພີ່ມການເປີດເຜີຍຂໍ້ມູນ ແລະ ແຮງກະຕຸ້ນ
ພາຍໃນພາລະຂອງ Shai-Hulud: bundle.js ໃນແພັກເກດ npm
ເຮືອ Shai-Hulud ເປັນ ໃຫຍ່, ລວມເຂົ້າກັບ Webpack ແລະ ຫຍໍ້ລົງຢ່າງຫຼວງຫຼາຍ ໄຟລ໌ JavaScript (bundle.js, ປະມານ 3–3.7 MB) ທີ່ປະຕິບັດຈາກ ຕິດຕັ້ງຫຼັງ ຕິດ ຊຸດ .jsonດັ່ງນັ້ນ, ທຸກໆການຕິດຕັ້ງຈະກະຕຸ້ນ payload ໂດຍອັດຕະໂນມັດ. ການອອກແບບນີ້ເຊື່ອງຕົວລະບຸ, ບີບອັດການໄຫຼຂອງການຄວບຄຸມ, ແລະຍູ້ເຫດຜົນທັງໝົດເຂົ້າໄປໃນສິ່ງປະດິດດຽວທີ່ປະຕິບັດໃນລະຫວ່າງການຕິດຕັ້ງ. ນັກວິເຄາະຢືນຢັນຢ່າງຕໍ່ເນື່ອງກ່ຽວກັບການລວມ Webpack, ຂະໜາດໄຟລ໌ທີ່ຜິດປົກກະຕິ, ແລະການປະຕິບັດໃນເວລາຕິດຕັ້ງ.
ລັກສະນະການປິດບັງ ແລະ ລັກສະນະຕ້ານການວິເຄາະທີ່ທ່ານຈະເຫັນໃນຕົວຢ່າງ:
- ກຣາຟໂມດູນທີ່ຫຍໍ້ລົງ ດ້ວຍ ID ໂມດູນຕົວເລກ, ຄຳເຫັນທີ່ຫາຍາກ, ແລະ ການໄຫຼວຽນການຄວບຄຸມທີ່ຮາບພຽງ. ຍິ່ງໄປກວ່ານັ້ນ, ໂຄງສ້າງນີ້ເຮັດໃຫ້ການທົບທວນດ້ວຍຕົນເອງຍາກຫຼາຍ.
- ການເຊື່ອງສະຕຣິງ ຜ່ານຊັ້ນ base64 ແລະຕົວຊ່ວຍໃນການກໍ່ສ້າງ. ຕົວຢ່າງ, ການເຂົ້າລະຫັດ ແລະ ການຖອດລະຫັດ base64 ຊ້ຳໆມັກຈະປາກົດຢູ່ອ້ອມຮອບຂັ້ນຕອນການກັ່ນຕອງ.
- ການສົ່ງຕໍ່ແບບໄດນາມິກ ໂດຍຜ່ານການ ການປະເມີນ-ຮູບແບບແບບ ແລະ ສ້າງຂຶ້ນໂດຍຟັງຊັນຕ່າງໆ, ດັ່ງນັ້ນຈຶ່ງເຮັດໃຫ້ລະຫັດສາມາດປ່ຽນພຶດຕິກຳໃນເວລາແລ່ນ.
- ການກັ່ນຕອງລະບົບປະຕິບັດການ ມັກການປະຕິບັດ Linux ແລະ macOS ໂດຍສະເພາະໃນຜູ້ແລ່ນ CI ແລະແລັບທັອບນັກພັດທະນາ.
ຈາກມຸມມອງທີ່ເປັນປະໂຫຍດ, ມັດດັ່ງກ່າວແມ່ນແບບໂມດູນ. ການຂຽນອະທິບາຍໂມດູນສຳລັບການຄົ້ນພົບລະບົບປະຕິບັດການ, ການສະແກນລະບົບໄຟລ໌ ແລະ git secret, ການເຂົ້າເຖິງ cloud SDK, ການດຳເນີນງານ GitHub API, ແລະເຄື່ອງຈັກຂະຫຍາຍພັນທີ່ແກ້ໄຂແພັກເກດອື່ນໆທີ່ຜູ້ຮັກສາເປັນເຈົ້າຂອງ. ໃນຄວາມເປັນຈິງ, StepSecurity ແລະ ReversingLabs ທັງສອງເນັ້ນໜ້າທີ່ທີ່ອັບເດດແພັກເກດໂດຍອັດຕະໂນມັດດ້ວຍ hook ທີ່ເປັນອັນຕະລາຍ.
ການປະຕິບັດເວລາຕິດຕັ້ງໃນ Shai-Hulud: ວິທີທີ່ແພັກເກດ npm ກະຕຸ້ນໜອນ
ການໂຈມຕີເລີ່ມຕົ້ນເມື່ອ ຫຼັງການຕິດຕັ້ງຈະເຮັດວຽກໂຫນດ bundle.js. ໃນຈຸດນີ້, ສະຄຣິບຈະເລີ່ມຕົ້ນ ແລະ ຖອດລະຫັດສະຖານະການເຮັດວຽກໃນໜ່ວຍຄວາມຈຳ, ເຊິ່ງເປັນການກຳນົດຂັ້ນຕອນສຳລັບການເຮັດວຽກຢ່າງເຕັມທີ່ຂອງໜອນ.
ການຄົ້ນພົບ ແລະ ການເກັບກ່ຽວ
- payload ຈະຖິ້ມ process.env ແລະສະແກນໄຟລ໌ທ້ອງຖິ່ນເພື່ອຊອກຫາຄວາມລັບ entropy ສູງ ແລະຄຳນຳໜ້າໂທເຄັນ. ນອກຈາກນັ້ນ, ມັນຍັງຂະຫຍາຍການຄຸ້ມຄອງໂດຍການໃຊ້ TruffleHog.
- ມັນສອບຖາມຈຸດສິ້ນສຸດ metadata ຂອງຄລາວເພື່ອເກັບກຳຂໍ້ມູນປະຈຳຕົວທີ່ມີອາຍຸສັ້ນ. ຕົວຢ່າງ, ໂທຫາ
169.254.169.254ໃນ AWS ຫຼືmetadata.google.internalໃນ GCP ມັກຈະປາກົດຢູ່ໃນເຈົ້າພາບທີ່ຕິດເຊື້ອ. - ຜົນສະທ້ອນ, ຂໍ້ມູນປະຈຳຕົວໃດໆທີ່ພົບເຫັນຈະສາມາດໃຊ້ໄດ້ທັນທີເພື່ອເຜີຍແຜ່ແພັກເກດ npm ໃໝ່ ຫຼື ຊຸກຍູ້ຂະບວນການເຮັດວຽກຂອງ GitHub.
Exfiltration
- ໜອນສ້າງ repo GitHub ໃໝ່ທີ່ມີຊື່ວ່າ ໄຊ ຮຸດ ແລະຂຽນລະຫັດ double base64
data.jsonດ້ວຍລາຍລະອຽດຂອງແພລດຟອມ, ສະພາບແວດລ້ອມ dumps, ແລະຄວາມລັບ. ດັ່ງທີ່ເຫັນໄດ້, ພຶດຕິກຳທີ່ດັງນີ້ແມ່ນງ່າຍທີ່ຈະສັງເກດເຫັນຖ້າຜູ້ປ້ອງກັນຮູ້ວ່າຈະຊອກຫາຢູ່ໃສ. - ມັນຍັງສ້າງຂະບວນການເຮັດວຽກຂອງ GitHub Actions, ເຊິ່ງມັກຈະຢູ່ໃນສາຂາທີ່ມີຊື່ວ່າ shai-hulud, ທີ່ຈັດລຳດັບ
${{ toJSON(secrets) }}ແລະໂພສຂໍ້ມູນໄປໃສ່ webhook ຄົງທີ່. ຍິ່ງໄປກວ່ານັ້ນ, ຂັ້ນຕອນການເຮັດວຽກນີ້ຈະຍັງຄົງຢູ່ຈົນກວ່າຈະມີຄົນລຶບມັນອອກຢ່າງຫ້າວຫັນ.
ການຂະຫຍາຍພັນ
- ດ້ວຍໂທເຄັນ npm ໃດໆທີ່ຄົ້ນພົບ, payload ຈະລະບຸແພັກເກດທັງໝົດທີ່ເປັນເຈົ້າຂອງໂດຍຜູ້ຮັກສາທີ່ຖືກໂຈມຕີ. ຫຼັງຈາກນັ້ນ, ມັນຈະດຶງເອົາແຕ່ລະ tarball, ໃສ່ bundle.js ແລະລາຍການຫຼັງການຕິດຕັ້ງ, ແລະເຜີຍແຜ່ແພັກເກດຄືນໃໝ່.
- ດ້ວຍເຫດນີ້, ກ່ອງທີ່ຕິດເຊື້ອຫຼາຍສິບກ່ອງສາມາດປາກົດພາຍໃນເວລາບໍ່ເທົ່າໃດຊົ່ວໂມງ, ເຊິ່ງເຮັດໃຫ້ລັດສະໝີການລະເບີດທົ່ວລະບົບນິເວດເພີ່ມຂຶ້ນເປັນຈຳນວນຫຼາຍ.
ຄວາມຍືນຍົງ ແລະ ການສຳຜັດ
ໜອນຊ່ວຍໃຫ້ຂະບວນການເຮັດວຽກທີ່ເປັນອັນຕະລາຍຍັງຄົງຢູ່ ແລະ ໃນຫຼາຍໆກໍລະນີ, ມັນຈະປ່ຽນບ່ອນເກັບຂໍ້ມູນສ່ວນຕົວໄປສູ່ສາທາລະນະດ້ວຍ "-ການເຄື່ອນຍ້າຍ" ໂດຍລວມແລ້ວ, ສິ່ງນີ້ຮັບປະກັນວ່າຜູ້ໂຈມຕີຮັກສາຈຸດຢືນ ແລະ ເພີ່ມການຮົ່ວໄຫຼຂອງຂໍ້ມູນໃຫ້ສູງສຸດ.
ບັນທຶກການກວດຈັບກະແຈ
ການນໍາໃຊ້ທີ່ຜິດປົກກະຕິນີ້ ${{ toJSON(secrets) }} ໃນຂັ້ນຕອນການເຮັດວຽກ Actions ແມ່ນຫາຍາກ. ເພາະສະນັ້ນ, ທີມງານຄວນປະຕິບັດຕໍ່ມັນເປັນຕົວຊີ້ບອກສັນຍານສູງໃນລະຫວ່າງການລ່າສັດ.
ຮູບແບບການເຮັດວຽກທີ່ໄດ້ຮັບການອະນາໄມທີ່ທ່ານຄວນຊອກຫາ
ການນໍາໃຊ້ທີ່ຜິດປົກກະຕິນີ້ to JSON (ຄວາມລັບ) ໃນ Actions ເປັນຕົວຊີ້ບອກສັນຍານສູງໃນເຫດການນີ້.
ລະຫັດປອມການຂະຫຍາຍພັນລະດັບສູງ (ປອດໄພ, ອະທິບາຍ)
ນັກວິເຄາະໄດ້ສັງເກດເຫັນວົງຈອນນີ້ໃນລະດັບໃຫຍ່, ເຊິ່ງອະທິບາຍເຖິງການກະໂດດຢ່າງໄວວາຈາກຫຼາຍສິບຊຸດຫາຫຼາຍຮ້ອຍຊຸດທີ່ຕິດເຊື້ອ.
ເປັນຫຍັງອັນນີ້ຈຶ່ງເປັນໜອນໃນລະບົບນິເວດຊຸດ
ໜອນແມ່ນມັນແວທີ່ແຜ່ລາມດ້ວຍຕົວມັນເອງໂດຍບໍ່ຕ້ອງມີຂັ້ນຕອນການປະຕິບັດການດ້ວຍຕົນເອງໃນທຸກຂັ້ນຕອນ. ໃນລະບົບປະຕິບັດການ, ໜອນມັກຈະໃຊ້ປະໂຫຍດຈາກຊ່ອງໂຫວ່ເຄືອຂ່າຍເພື່ອຍ້າຍຈາກເຄື່ອງໜຶ່ງໄປຫາອີກເຄື່ອງໜຶ່ງ. ໃນທາງກົງກັນຂ້າມ, Shai-Hulud ເຮັດວຽກພາຍໃນ registry npm. ເສັ້ນທາງທີ່ມີປະສິດທິພາບຂອງມັນແມ່ນຜ່ານ ການນຳໃຊ້ຂໍ້ມູນປະຈຳຕົວຄືນໃໝ່.
ໜອນໃຊ້ປະໂຫຍດຈາກໂທເຄັນການເຜີຍແຜ່ npm ທີ່ຖືກລັກ. ທັນທີທີ່ມັນໄດ້ຮັບຂໍ້ມູນປະຈຳຕົວທີ່ຖືກຕ້ອງ, ມັນຈະເຜີຍແຜ່ເວີຊັນທີ່ຕິດເຊື້ອຄືນໃໝ່ພາຍໃຕ້ແພັກເກດອື່ນໆທີ່ເປັນເຈົ້າຂອງໂດຍຜູ້ຮັກສາດຽວກັນ. ຫຼັງຈາກນັ້ນ, ແພັກເກດເຫຼົ່ານັ້ນຖືກຕິດຕັ້ງໂດຍນັກພັດທະນາທີ່ບໍ່ຮູ້ຕົວ ຫຼື ຜູ້ແລ່ນ CI, ແລະວົງຈອນດັ່ງກ່າວຈະເກີດຂຶ້ນຊ້ຳອີກ.
ດ້ວຍເຫດຜົນນີ້, ນັກວິເຄາະດ້ານຄວາມປອດໄພ, ລວມທັງ ການອ່ານຊ້ໍາ, ຈັດປະເພດ Shai-Hulud ເປັນ ໜອນທີ່ສືບພັນຕົວເອງ ແທນທີ່ຈະເປັນໂທຣຈັນທຳມະດາ ຫຼື ເຫດການພິມຜິດ. ຄວາມແຕກຕ່າງແມ່ນສຳຄັນ: ໂທຣຈັນມັກຈະທຳລາຍໂຮດໜຶ່ງ, ແຕ່ໜອນຈະຂະຫຍາຍຜົນກະທົບຂອງມັນໂດຍອັດຕະໂນມັດໃນທົ່ວລະບົບນິເວດ.
ແບບຟອມ "ວິທີການເຮັດວຽກ"
ເພື່ອສະຫຼຸບວົງຈອນຊີວິດຂອງ Shai-Hulud, ນີ້ແມ່ນຂໍ້ບົກຜ່ອງcisແບ່ງຂັ້ນຕອນຫຼັກຂອງມັນອອກເປັນຂັ້ນຕອນຕ່າງໆຄື:
- ຊຸດທີ່ມີ ຕິດຕັ້ງຫຼັງ ຖືກຕິດຕັ້ງແລ້ວ, ແລະ
bundle.jsປະຕິບັດ. - payload ຖິ້ມຕົວແປສະພາບແວດລ້ອມ, ສະແກນໄຟລ໌ ແລະ ປະຫວັດ git, ເຮັດວຽກ ເຫັດທຣັບເຟີນຮອກ, ແລະສອບຖາມການບໍລິການ metadata ໃນຄລາວ. ດັ່ງນັ້ນ, ຄວາມລັບໃດໆທີ່ພົບເຫັນຈະເປັນປະໂຫຍດທັນທີ.
- ການກັ່ນກອງເກີດຂຶ້ນໃນສອງວິທີຄື: ທຳອິດ, ໂດຍການສ້າງ repo ສາທາລະນະທີ່ມີຊື່ວ່າ ໄຊ ຮຸດ ດ້ວຍການເຂົ້າລະຫັດສອງຖານ 64
data.jsonອັນທີສອງ, ໂດຍການສ້າງຂະບວນການເຮັດວຽກ GitHub Actions ທີ່ໂພສ${{ toJSON(secrets) }}ໄປຫາ webhook. - ໂດຍການໃຊ້ໂທເຄັນ npm ທີ່ຖືກລັກ, ໜອນຈະເຜີຍແຜ່ແພັກເກດອື່ນໆທັງໝົດທີ່ເປັນເຈົ້າຂອງໂດຍຜູ້ຮັກສາທີ່ຖືກໂຈມຕີດ້ວຍ hook ທີ່ເປັນອັນຕະລາຍດຽວກັນ. ດ້ວຍວິທີນີ້, ການຕິດເຊື້ອຈະແຜ່ຂະຫຍາຍຢ່າງໄວວາ.
- ສຸດທ້າຍ, ຜູ້ໂຈມຕີມີຄວາມລັບຫຼາຍຂຶ້ນ, ມີແພັກເກດຫຼາຍຂຶ້ນເພື່ອແຜ່ລາມ, ແລະ ຄວາມທົນທານ ພາຍໃນບັນຊີ ແລະ ບ່ອນເກັບມ້ຽນ GitHub.
ວິທີການຫຼີກລ່ຽງການໂຈມຕີປະເພດນີ້, ໃນທາງປະຕິບັດ
Shai-Hulud ເປັນສັນຍານເຕືອນ. ໜອນທີ່ລັກໂທເຄັນ ແລະ ເຜີຍແຜ່ຕົວມັນເອງຄືນໃໝ່ບໍ່ແມ່ນຄວາມສ່ຽງໃນອະນາຄົດ, ມັນມີຊີວິດຢູ່ໃນ ລະບົບນິເວດຂອງແພັກເກດ npm ໃນມື້ນີ້. ເພື່ອປ້ອງກັນປະເພດນີ້ ການໂຈມຕີລະບົບຕ່ອງໂສ້ການສະຫນອງ, ທີມງານຕ້ອງການການຄວບຄຸມທີ່ສາມາດຕັ້ງໂປຣແກຣມໄດ້, ອັດຕະໂນມັດ, ແລະ ບັງຄັບໃຊ້ໂດຍກົງໃນ CI/CD pipelineເຫຼົ່ານີ້ແມ່ນການປ້ອງກັນດຽວກັນທີ່ທ່ານສາມາດຈັດຕັ້ງປະຕິບັດໄດ້ແລ້ວ ຊີເກນີ.
ຢຸດສິ່ງປະດິດທີ່ບໍ່ດີຢູ່ປະຕູຮົ້ວ
ທ່ານຄວນສະແກນແພັກເກດ npm ແລະ tarballs ກ່ອນທີ່ພວກມັນຈະໄປເຖິງນັກພັດທະນາ ຫຼື ວຽກ CI. bundle.js ໄຟລ໌, ການຕິດຕັ້ງຫຼັງການຕິດຕັ້ງທີ່ໜ້າສົງໄສ hooks, ແລະເຄື່ອງໝາຍການເຮັດໃຫ້ມົວໝອງທັງໝົດເປັນສັນຍານເຕືອນໄພໃນຕອນຕົ້ນ. ຍິ່ງໄປກວ່ານັ້ນ, ການບັງຄັບໃຊ້ໄລຍະເວລາຜ່ອນຄາຍ ແລະ ລຸ້ນທີ່ຖືກປັກໝຸດໄວ້ໃນ pipelineປ້ອງກັນການປ່ອຍອອກມາໃໝ່ທີ່ບໍ່ໄດ້ຮັບການກວດສອບຈາກການຖືກບໍລິໂພກໂດຍອັດຕະໂນມັດ.
ແຂງ CI/CD ໂດຍຄ່າເລີ່ມຕົ້ນ
Guardrails in CI/CD ແມ່ນມີຄວາມຈຳເປັນ. ພວກເຂົາປະຕິເສດການລວມ ຫຼື ການຕິດຕັ້ງທີ່ແນະນຳສະຄຣິບ ຫຼື ໄບນາຣີໃໝ່. ໃນເວລາດຽວກັນ, ພວກເຂົາບລັອກຂັ້ນຕອນການເຮັດວຽກທີ່ເຮັດໃຫ້ຄວາມລັບເປັນລຳດັບ ຫຼື ພະຍາຍາມໂພສພາຍນອກ. ທີມງານຄວນຮຽກຮ້ອງໃຫ້ມີການຕິດຕັ້ງແບບ lockfile ເທົ່ານັ້ນ (npm ci) ໃນທົ່ວທຸກ pipelineດັ່ງນັ້ນຊຸດການເພິ່ງພາອາໄສຈຶ່ງສາມາດຜະລິດຊ້ຳໄດ້ ແລະ ປອດໄພ.
ຫຼຸດລັດສະໝີການລະເບີດຂອງໂທເຄັນ
ຄວາມລັບຕ້ອງບໍ່ກາຍເປັນຈຸດລົ້ມເຫຼວພຽງຈຸດດຽວ. ສະແກນລະຫັດ, ການຕັ້ງຄ່າ ແລະ pipeline ຜົນຜະລິດສໍາລັບ ຂໍ້ມູນປະຈຳຕົວທີ່ຖືກເປີດເຜີຍໂທເຄັນຄວນຖືກກຳນົດຂອບເຂດໃຫ້ແຄບລົງ, ເມື່ອມີອາຍຸການໃຊ້ງານສັ້ນ, ແລະ ໝຸນວຽນໂດຍອັດຕະໂນມັດເມື່ອກວດພົບການເປີດເຜີຍ. ຕາມກົດລະບຽບ, ໃຫ້ປະຕິບັດຕໍ່ໂທເຄັນໃດໆທີ່ໃຊ້ໃນໂຮດທີ່ປະຕິບັດການຕິດຕັ້ງຫຼັງການຕິດຕັ້ງທີ່ໜ້າສົງໄສວ່າເປັນການຖືກໂຈມຕີ.
ເບິ່ງພຶດຕິກຳຂອງໜອນແຕ່ຫົວທີ
ການກວດຫາຜິດລັກ ເປັນກຸນແຈສຳຄັນ. ຕົວຢ່າງ, ການເພີ່ມຂຶ້ນຢ່າງກະທັນຫັນໃນເຫດການເຜີຍແຜ່ npm, ຂັ້ນຕອນການເຮັດວຽກໃໝ່ທີ່ປາກົດໂດຍບໍ່ມີເຫດຜົນ, ຫຼື repos ສາທາລະນະໃໝ່ທີ່ເຕັມໄປດ້ວຍໄຟລ໌ທີ່ຖືກເຂົ້າລະຫັດທີ່ແປກປະຫຼາດສາມາດສົ່ງສັນຍານເຖິງກິດຈະກຳຂອງໜອນໄດ້. ດັ່ງນັ້ນ, ທີມງານຄວນຍົກລະດັບການແຈ້ງເຕືອນຢ່າງໄວວາ ແລະ ແຍກຜູ້ຮັກສາ ຫຼື ຜູ້ແລ່ນທີ່ສະແດງອາການເຕືອນໄພເຫຼົ່ານີ້.
ແກ້ໄຂຢ່າງວ່ອງໄວໂດຍບໍ່ທຳລາຍການສ້າງ
ຄວາມໄວ ແລະ ຄວາມປອດໄພຕ້ອງໄປຄຽງຄູ່ກັນ. ອັດຕະໂນມັດ pull requests ສາມາດທົດແທນແພັກເກດ npm ທີ່ຖືກລະເມີດດ້ວຍລຸ້ນທີ່ໄດ້ຮັບການກວດສອບແລ້ວ. ນອກຈາກນັ້ນ, ການຟື້ນຟູ ແລະ ການຂູດຮີດ ການວິເຄາະຮັບປະກັນວ່າການຍົກລະດັບຍັງຄົງມີໜ້ອຍທີ່ສຸດ ແລະ ໝັ້ນຄົງ. ສຸດທ້າຍ, ສ້າງ CI runners ທີ່ໄດ້ຮັບຜົນກະທົບຄືນໃໝ່ຈາກຮູບພາບທີ່ສະອາດເມື່ອການສຳຜັດໄດ້ຮັບການຢືນຢັນແລ້ວ, ປ້ອງກັນບໍ່ໃຫ້ການໂຈມຕີແຜ່ລາມໄປຕື່ມອີກ.
ຕົວຊີ້ວັດຂອງການປະນີປະນອມ (IoCs)
ເມື່ອວິເຄາະ Shai-Hulud, ທີມຄວນສັງເກດເບິ່ງທັງສອງຢ່າງ IoC ຄົງທີ່ ໃນໄຟລ໌ ແລະ IoC ດ້ານພຶດຕິກຳ in pipelines. ສັນຍານເຫຼົ່ານີ້ຮ່ວມກັນຊ່ວຍກວດຫາການຕິດເຊື້ອໄດ້ໄວ ແລະ ຕອບສະໜອງກ່ອນທີ່ແມ່ທ້ອງຈະແຜ່ລາມໄປຕື່ມອີກ.
IoC ຄົງທີ່
ສັງເກດເຫັນການຈັບຄູ່ຂອງ SHA-256 digests ຕໍ່ໄປນີ້ bundle.js ຕົວຢ່າງ:
- 46faab8ab153fae6e80e7cca38eab363075bb524edd79e42269217a083628f09
- 81d2a004a1bca6ef87a1caf7d0e0b355ad1764238e40ff6d1b1cb77ad4f595c3
- dc67467a39b70d1cd4c1f7f7a459b35058163592f4a9e8fb4dffcbba98ef210c
ນອກຈາກນັ້ນ, ໃຫ້ສັງເກດເບິ່ງຮູບແບບທີ່ເກີດຂຶ້ນຊ້ຳໆເຫຼົ່ານີ້:
- A
bundle.jsຢູ່ທີ່ຮາກແພັກເກດ. "postinstall": "node bundle.js"ພາຍໃນpackage.json.- ບ່ອນເກັບມ້ຽນທີ່ມີຊື່ ໄຊ ຮຸດ.
- ຂັ້ນຕອນການເຮັດວຽກ GitHub ປະກອບມີ
${{ toJSON(secrets) }}.
IoCs ດ້ານພຶດຕິກຳ
ນອກເໜືອໄປຈາກລາຍເຊັນໄຟລ໌, ກິດຈະກຳຂອງໜອນຈະເປີດເຜີຍຕົວມັນເອງຜ່ານພຶດຕິກຳ. ຕົວຢ່າງ:
- ການລະເບີດຂອງ npm ຢ່າງກະທັນຫັນເຜີຍແຜ່ເຫດການຈາກຜູ້ຮັກສາຄົນໜຶ່ງ.
- ຂັ້ນຕອນການເຮັດວຽກໃໝ່ທີ່ສົ່ງຂໍ້ມູນໄປຫາຈຸດສິ້ນສຸດພາຍນອກ.
- ຄຳຮ້ອງຂໍ POST ຂາອອກຖືກກະຕຸ້ນຈາກຜູ້ແລ່ນ CI.
- repos ສາທາລະນະທີ່ສ້າງຂຶ້ນບໍ່ດົນມານີ້ດ້ວຍ blobs ທີ່ຖືກເຂົ້າລະຫັດ.
ການລ່າສັດໄວ
ສະຫຼຸບ: ບົດຮຽນຈາກ Shai-Hulud
ໄດ້ ການໂຈມຕີລະບົບຕ່ອງໂສ້ການສະໜອງ Shai-Hulud ໃນຊຸດ npm ສະແດງໃຫ້ເຫັນວ່າລະບົບຕ່ອງໂສ້ການສະໜອງຊອບແວໃນປະຈຸບັນນີ້ມີຄວາມບອບບາງແນວໃດ. ໜອນໂຕນີ້ເຮັດຫຼາຍກວ່າການເພີ່ມລະຫັດທີ່ເປັນອັນຕະລາຍ. ມັນໄດ້ລັກໂທເຄັນ, ສົ່ງຂໍ້ມູນອອກ, ແລະຫຼັງຈາກນັ້ນເຜີຍແຜ່ຕົວມັນເອງຄືນໃໝ່ໂດຍອັດຕະໂນມັດ. ເນື່ອງຈາກສິ່ງນີ້, ການໂຈມຕີຈຶ່ງແຜ່ລາມອອກໄປພາຍໃນຊົ່ວໂມງແທນທີ່ຈະເປັນອາທິດ.
ສຳລັບນັກພັດທະນາ ແລະ ທີມງານ DevOps, ບົດຮຽນແມ່ນຈະແຈ້ງ:
- ທຸກໆການຕິດຕັ້ງໃຊ້ລະຫັດ. ເຖິງແມ່ນວ່າແພັກເກດ npm ທົ່ວໄປກໍ່ສາມາດຊ່ອນໜອນຫຼັງການຕິດຕັ້ງໄດ້.
- ທຸກໆໂທເຄັນມີມູນຄ່າສູງ. ເມື່ອຖືກລັກແລ້ວ, ມັນສາມາດຖືກນໍາໃຊ້ເພື່ອແຜ່ລາມມັນແວຕື່ມອີກ.
- ທຸກ pipeline ຕ້ອງການການກວດສອບ. ໂດຍບໍ່ມີການ guardrails ກ່ຽວກັບການເພິ່ງພາອາໄສ, ຂະບວນການເຮັດວຽກ, ແລະ ຄວາມລັບ, ການປະນີປະນອມພຽງຄັ້ງດຽວສາມາດສົ່ງຜົນກະທົບຕໍ່ການຜະລິດໄດ້ຢ່າງວ່ອງໄວ.
ດັ່ງນັ້ນ, ການຢຸດການໂຈມຕີເຊັ່ນ Shai-Hulud ຕ້ອງການການຄວບຄຸມທີ່ເປັນອັດຕະໂນມັດ ແລະ ງ່າຍຕໍ່ການບັງຄັບໃຊ້. ທີມງານຄວນສະແກນແພັກເກດ npm ກ່ອນການຕິດຕັ້ງ, ໃຊ້ການສ້າງໄຟລ໌ລັອກ, ກວດຫາກິດຈະກຳການເຜີຍແຜ່ທີ່ແປກປະຫຼາດ, ແລະ ຮັກສາໂທເຄັນໃຫ້ສັ້ນລົງ. ຂັ້ນຕອນເຫຼົ່ານີ້ບໍ່ແມ່ນທາງເລືອກອີກຕໍ່ໄປ. ແທນທີ່ຈະ, ພວກມັນແມ່ນພື້ນຖານຂອງຄວາມຢືດຢຸ່ນໃນຍຸກສະໄໝໃໝ່. pipelines.
ທີ່ Xygeni, ພວກເຮົາເຫັນວ່າການໂຈມຕີລະບົບຕ່ອງໂສ້ການສະໜອງ Shai-Hulud ເປັນຄຳເຕືອນສຳລັບລະບົບນິເວດແຫຼ່ງເປີດທັງໝົດ. ວິທີການທີ່ຍືນຍົງໃນການກ້າວໄປຂ້າງໜ້າແມ່ນການນຳເອົາຄວາມປອດໄພຂອງລະບົບຕ່ອງໂສ້ການສະໜອງເຂົ້າມາໃນຂະບວນການພັດທະນາໂດຍກົງ, ໃນຈຸດທີ່ລະຫັດ, ແພັກເກດ npm, ແລະ pipelineເຊື່ອມຕໍ່.
ຂ້າງລຸ່ມນີ້ແມ່ນລາຍຊື່ເຕັມຂອງແພັກເກດ npm ແລະລຸ້ນຕ່າງໆທີ່ລາຍງານວ່າຖືກໂຈມຕີໃນ Shai-Hulud. ໃຊ້ມັນເພື່ອກວດສອບໄຟລ໌ລັອກ, ທະບຽນ ແລະ CI ຂອງທ່ານ pipelines ສຳລັບການສຳຜັດ.
ລາຍຊື່ແພັກເກດທີ່ຖືກລະເມີດ
📦 ຕົວຢ່າງຂອງແພັກເກດ npm ທີ່ຖືກທຳລາຍ
| ຊື່ແພັກເກດ | Version | Publish Date |
|---|---|---|
| ເຄື່ອງຈັກກົດລະບຽບ json-simplified | 0.2.1 | 2025-09-14T17:58:51.203Z |
| ນັກບິນອາກາດ | 0.8.8 | 2025-09-14T18:35:07.600Z |
| ກຣາຟຄວາມຮູ້ mcp | 1.2.1 | 2025-09-14T18:35:09.494Z |
| ຜ້າຫົ່ມບິນ | 0.3.1 | 2025-09-14T18:35:09.521Z |
| ປະຕູໂດດ | 0.0.2 | 2025-09-14T18:35:09.651Z |
| tvi-cli | 0.1.5 | 2025-09-14T18:35:10.996Z |
| @thangved/ໜ້າຕ່າງການໂທກັບຄືນ | 1.1.4 | 2025-09-14T20:31:38.479Z |
| @tnf-dev/api | 1.0.8 | 2025-09-14T20:31:39.547Z |
| @tnf-dev/js | 1.0.8 | 2025-09-14T20:31:41.251Z |
| @tnf-dev/mui | 1.0.8 | 2025-09-14T20:31:41.259Z |
| @tnf-dev/core | 1.0.8 | 2025-09-14T20:31:42.728Z |
| @teselagen/ຕາຕະລາງປະຕິກິລິຍາ | 6.10.20 | 2025-09-14T20:37:08.597Z |
| @hestjs/ສາທິດ | 0.1.2 | 2025-09-14T20:45:52.348Z |
| @nexe/eslint-config | 0.1.1 | 2025-09-14T20:45:53.625Z |
| @hestjs/eslint-config | 0.1.2 | 2025-09-14T20:45:55.044Z |
| @nexe/config-manager | 0.1.1 | 2025-09-14T20:45:55.066Z |
| @nexe/logger | 0.1.3 | 2025-09-14T20:45:55.170Z |
| @hestjs/logger | 0.1.6 | 2025-09-14T20:45:55.197Z |
| @hestjs/ການກວດສອບຄວາມຖືກຕ້ອງ | 0.1.6 | 2025-09-14T20:45:55.595Z |
| @hestjs/core | 0.2.1 | 2025-09-14T20:45:55.888Z |
➡️ ເບິ່ງລາຍຊື່ເຕັມຂອງແພັກເກດທີ່ຖືກລະເມີດ
| ຊື່ແພັກເກດ | Version | Publish Date |
|---|---|---|
| ເຄື່ອງຈັກກົດລະບຽບ json-simplified | 0.2.1 | 2025-09-14T17:58:51.203Z |
| ນັກບິນອາກາດ | 0.8.8 | 2025-09-14T18:35:07.600Z |
| ກຣາຟຄວາມຮູ້ mcp | 1.2.1 | 2025-09-14T18:35:09.494Z |
| ຜ້າຫົ່ມບິນ | 0.3.1 | 2025-09-14T18:35:09.521Z |
| ປະຕູໂດດ | 0.0.2 | 2025-09-14T18:35:09.651Z |
| tvi-cli | 0.1.5 | 2025-09-14T18:35:10.996Z |
| @thangved/ໜ້າຕ່າງການໂທກັບຄືນ | 1.1.4 | 2025-09-14T20:31:38.479Z |
| @tnf-dev/api | 1.0.8 | 2025-09-14T20:31:39.547Z |
| @tnf-dev/js | 1.0.8 | 2025-09-14T20:31:41.251Z |
| @tnf-dev/mui | 1.0.8 | 2025-09-14T20:31:41.259Z |
| @tnf-dev/core | 1.0.8 | 2025-09-14T20:31:42.728Z |
| @teselagen/ຕາຕະລາງປະຕິກິລິຍາ | 6.10.20 | 2025-09-14T20:37:08.597Z |
| @hestjs/ສາທິດ | 0.1.2 | 2025-09-14T20:45:52.348Z |
| @nexe/eslint-config | 0.1.1 | 2025-09-14T20:45:53.625Z |
| @hestjs/eslint-config | 0.1.2 | 2025-09-14T20:45:55.044Z |
| @nexe/config-manager | 0.1.1 | 2025-09-14T20:45:55.066Z |
| @nexe/logger | 0.1.3 | 2025-09-14T20:45:55.170Z |
| @hestjs/logger | 0.1.6 | 2025-09-14T20:45:55.197Z |
| @hestjs/ການກວດສອບຄວາມຖືກຕ້ອງ | 0.1.6 | 2025-09-14T20:45:55.595Z |
| @hestjs/core | 0.2.1 | 2025-09-14T20:45:55.888Z |
| @hestjs/cqrs | 0.1.6 | 2025-09-14T20:45:55.966Z |
| @hestjs/scalar | 0.1.7 | 2025-09-14T20:45:56.386Z |
| ອັບໂຫຼດໄຟລ໌ ng2 | 7.0.3 | 2025-09-15T02:44:29.555Z |
| ຕົວຈັດການການແຈ້ງເຕືອນຂອງຕົວເກັບປະຈຸ | 0.0.2 | 2025-09-15T04:54:48.431Z |
| ຕົວເກັບປະຈຸ-ປລັກອິນ-ໂວນຈ໌ | 1.0.2 | 2025-09-15T04:54:48.501Z |
| ຕົວເກັບປະຈຸ-ປລັກອິນ-ແອັບສຸຂະພາບ | 0.0.2 | 2025-09-15T04:54:48.704Z |
| ການອະນຸຍາດຂອງຕົວເກັບປະຈຸໄຟຟ້າ ແລະ ຕົວເກັບປະຈຸໄຟຟ້າ | 0.0.4 | 2025-09-15T04:54:48.753Z |
| ຊຸດໂທ voip | 1.0.2 | 2025-09-15T04:54:49.223Z |
| ຕົວເກັບປະຈຸ-ປລັກອິນ-ihealth | 1.1.8 | 2025-09-15T04:55:08.113Z |
| @art-ws/common | 2.0.22 | 2025-09-15T05:21:15.411Z |
| @art-ws/config-eslint | 2.0.4 | 2025-09-15T05:21:17.199Z |
| ngx-ws | 1.1.5 | 2025-09-15T05:21:17.514Z |
| @art-ws/slf | 2.0.15 | 2025-09-15T05:21:17.524Z |
| @art-ws/http-server | 2.0.21 | 2025-09-15T05:21:17.745Z |
| pm2-gelf-json | 1.0.4 | 2025-09-15T05:21:18.413Z |
| @ສິລະປະ-ws/di | 2.0.28 | 2025-09-15T05:21:18.488Z |
| @art-ws/di-node | 2.0.13 | 2025-09-15T05:21:18.849Z |
| @art-ws/config-ts | 2.0.7 | 2025-09-15T05:21:19.408Z |
| @art-ws/db-context | 2.0.21 | 2025-09-15T05:21:19.814Z |
| @art-ws/openapi | 0.1.9 | 2025-09-15T05:21:19.969Z |
| @art-ws/web-app | 1.0.3 | 2025-09-15T05:21:20.383Z |
| @art-ws/ssl-info | 1.0.9 | 2025-09-15T05:21:20.927Z |




