Share

Supply Chain Attack บน npm กลับมาอีกครั้งกระทบแพ็กเกจกว่า 187

Last updated: 18 Sept 2025
612 Views
สรุปข้อมูล
แคมเปญการโจมตีรูปแบบ Supply Chain ใหม่ชื่อว่า Shai-Hulud มุ่งเป้าโจมตีไปยัง NPM Ecosystem ด้วยมัลแวร์แบบ Self-Propagating Worm โดยเริ่มจากการ Compromise แพ็กเกจ ctrl/tinycolor แล้วแพร่ไปยังแพ็กเกจอื่น ๆ รวมถึงแพ็กเกจที่เผยแพร่ใน Namespace ของ CrowdStrike ทำให้เกิดการ Cascading Compromise ทั่วทั้ง Ecosystem
 
รายละเอียดการโจมตี
ณ ปัจจุบันแคมเปญการโจมตี Shai-Hulud ยังอยู่ในระหว่างการตรวจสอบจึงยังไม่ประกาศ Root Cause ของการโจมตีนี้ออกมาแต่มีการสันนิษฐานว่าอาจมีความเกี่ยวโยงกับเหตุการณ์การโจมตี s1ngularity เมื่อปลายเดือนสิงหาคมที่ผ่านมา โดยลักษณะการโจมตีของแคมเปญ Shai-Hulud จะดำเนินการเป็น Multi-stage Chain ซึ่งมีรายละเอียดดังนี้:
  1. เริ่มแรกแฮกเกอร์ทำการ Exploit แพ็กเกจ ctrl/tinycolor และ Inject ไฟล์ bundle[.]js ซึ่งเป็น JavaScript แบบ Bundle ที่อันตรายลงไป หลังจากนั้นทำการเผยแพร่ ctrl/tinycolor เวอร์ชัน 4.1.1 และ 4.1.2 ไปยัง NPM Registry
  2. เมื่อผู้ใช้งานหรือระบบ CI ทำการ Pull Dependency และรัน npm install โดยใช้ postinstall Script ซึ่งเป็น Script Hook ที่อยู่ในไฟล์ package[.]json ที่ถูก Hijack ไว้ จะรัน bundle[.]js อัตโนมัติทันทีที่ใครก็ตามติดตั้งแพ็กเกจ ctrl/tinycolor ขั้นตอนนี้เป็นเหมือนการ Spawn Child Processes เช่น Trufflehog, curl, npm publish --force เป็นต้น
  3. หลังจากนั้นทำการ OS Reconnaissance เพื่อตรวจสอบระบบปฏิบัติการและสถาปัตยกรรม เนื่องจาก Payload สามารถทำงานบน Linux และ macOS เท่านั้น แล้ว Dump process[.]env เพื่อหา Token และ Credential ชั่วคราว เช่น GITHUB_TOKEN และ AWS_ACCESS_KEY_ID รวมไปถึงทำการสแกนไฟล์ของระบบหา Secrets ที่มีความ Entropy สูงโดยใช้เครื่องมือ Trufflehog และ Regex
  4. เริ่มทำการ Credential Harvesting โดยการนำค่าที่ได้จากการ Reconnaissance เพื่อดึง Cloud Credentials ต่าง ๆ เช่น AWS, GCP และ Azure รวมถึง GitHub Personal Access Tokens (PATs) และ NPM Tokens ผ่าน SDK เฉพาะในของแต่ละ Cloud เช่น aws-sdk/client-secrets-manager และ google-cloud/secret-manager เพื่อ Enumerate และดึงค่า Secrets ออกมา และถ้าเจอ AWS Key จะนำไป Validate ด้วย STS AssumeRoleWithWebIdentityCommand และดึงค่า Secrets ที่อยู่ใน AWS Secrets Manager ของทุกภูมิภาคได้
  5. หลังจาก Harvest Credentials มัลแวร์จะทำขั้นตอนต่อไปคือ Self-propagation โดยใช้ NPM_TOKEN จาก ~/[.]npmrc หรือจาก Environment แล้วตรวจสอบผ่าน /whoami จากนั้นทำการ Query /v1/search[?]text=maintainer[:][$]{username}[&]size=20 เพื่อหาแพ็กเกจที่ Maintainer คนเดียวกันเป็นเจ้าของผ่าน NPM Search API แล้วแก้ไขไฟล์ package[.]json ของแพ็กเกจให้ Inject bundle[.]js หรือเพิ่ม postinstall Script ที่อันตรายของแฮกเกอร์ จากนั้นใช้คำสั่ง Shell ในการแพร่กระจายไปเพิ่ม
  6. ต่อมาในขั้นตอนการ Persistence จะใช้วิธีการ Inject GitHub Actions Workflow ชื่อว่า [.]github/workflows/shai-hulud-workflow[.]yml ซึ่งจะถูก Commit ไปยัง Branch ใหม่หรือ Push เข้า Default Branch ผ่าน API ซึ่ง Workflow นี้จะ Trigger บน Push หรือ Event อื่น ๆ ที่มักเกิดใน Repo เพื่อให้รันอัตโนมัติเมื่อมีการทำงานบน Repo
  7. การทำ Data Exfiltration จะทำการ Aggregate ข้อมูลโดยการสร้าง JSON Payload ที่มีข้อมูลจากการ Harvest Credentials และส่งผ่านได้หลายช่องทาง เช่น:
    • สร้าง Repo สาธารณะชื่อ Shai-Hulud และ Push Payload เป็นไฟล์หรือ Commit
    • ส่ง POST ไปยัง External Webhook เช่น hxxps://webhook[.]site/<id> ผ่าน curl หรือผ่าน Workflow ที่ถูก Inject ซึ่งใน Workflow และ Payload บางส่วนใช้ Double-base64 Encoding เพื่อหลีกเลี่ยงการตรวจจับ

 

รูปที่ 1: กระบวนการการโจมตี

 

ผลกระทบจากการโจมตี

แฮกเกอร์สามารถใช้ประโยชน์จากการโจมตี Supply Chain ของ ctrl/tinycolor ที่นิยมใช้งานทั่วไปในการขโมย Key และ Token เช่น GitHub, AWS และ GCP และแพร่กระจายตัวเองไปยังแพ็กเกจอื่น ๆ ที่เกี่ยวข้องทำให้เกิดการ Cascading Compromise หน่วยงานที่ใช้งานแพ็กเกจข้างต้นอาจเกิด Data Breach และเข้าควบคุมระบบ Cloud ได้

สรุปการโจมตี

เริ่มจากการ Inject bundle[.]js ลงในแพ็กเกจ ctrl/tinycolor เมื่อติดตั้งโค้ดจะรัน postinstall Script ทำ Reconnaissance ดึงค่า process[.]env และสแกนหา Key หรือ Token เช่น GitHub หรือ AWS จากนั้น Inject GitHub Workflow เพื่อขโมย Secrets และส่งข้อมูลไปยัง C2 ที่สำคัญคือมัลแวร์ใช้ NPM หรือ GitHub Token ในการเผยแพร่เวอร์ชันที่อันตรายไปยังแพ็กเกจอื่น ๆ ทำให้การโจมตีแพร่กระจายไปทั่ว Ecosystem

คำแนะนำ

  • หลีกเลี่ยงการอัปเดตแพ็กเกจเป็นเวอร์ชันที่อันตราย
  • ลบหรือ Downgrade เวอร์ชันแพ็กเกจที่ได้รับผลกระทบทันที
  • ทำการ Rotate NPM Tokens, GitHub PATs, Keys และ Secrets อื่น ๆ ของ AWS, GCP และ Azure
  • หมั่นตรวจสอบไฟล์ Workflow เพื่อหา Workflow ที่ผิดปกติหรืออันตราย
  • ตรวจสอบ package[.]json และ npm publish history ว่ามีการแก้ไขโดยไม่ได้รับอนุญาตหรือไม่
  • เฝ้าระวัง Outbound Connection ไปยัง webhook[.]site และ C2 Endpoint ที่เกี่ยวข้อง
  • ตรวจสอบ Source Code ของ Dependency ก่อนทำการอัปเดต
  • ใช้ NPM Cooldown Policy ก่อนนำ Dependency เวอร์ชันใหม่ไปใช้งาน
  • จำกัดสิทธิ์ของ NPM หรือ GitHub Tokens ให้เป็นไปตามหลัก Principle of Least Privilege
  • เปิดใช้ MFA หรือ Hardware Key สำหรับ GitHub, NPM และ Cloud Accounts
  • ทำ Package Cache ภายในองค์กร เพื่อลดความเสี่ยงจากการดึงโค้ดโดยตรงจาก Registry ภายนอก

 

แหล่งอ้างอิง

https://www.bleepingcomputer.com/news/security/self-propagating-supply-chain-attack-hits-187-npm-packages/

https://www.stepsecurity.io/blog/ctrl-tinycolor-and-40-npm-packages-compromised

https://socket.dev/blog/tinycolor-supply-chain-attack-affects-40-packages


Related Content