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

- เริ่มแรกแฮกเกอร์ทำการ Exploit แพ็กเกจ ctrl/tinycolor และ Inject ไฟล์ bundle[.]js ซึ่งเป็น JavaScript แบบ Bundle ที่อันตรายลงไป หลังจากนั้นทำการเผยแพร่ ctrl/tinycolor เวอร์ชัน 4.1.1 และ 4.1.2 ไปยัง NPM Registry
- เมื่อผู้ใช้งานหรือระบบ CI ทำการ Pull Dependency และรัน npm install โดยใช้ postinstall Script ซึ่งเป็น Script Hook ที่อยู่ในไฟล์ package[.]json ที่ถูก Hijack ไว้ จะรัน bundle[.]js อัตโนมัติทันทีที่ใครก็ตามติดตั้งแพ็กเกจ ctrl/tinycolor ขั้นตอนนี้เป็นเหมือนการ Spawn Child Processes เช่น Trufflehog, curl, npm publish --force เป็นต้น
- หลังจากนั้นทำการ OS Reconnaissance เพื่อตรวจสอบระบบปฏิบัติการและสถาปัตยกรรม เนื่องจาก Payload สามารถทำงานบน Linux และ macOS เท่านั้น แล้ว Dump process[.]env เพื่อหา Token และ Credential ชั่วคราว เช่น GITHUB_TOKEN และ AWS_ACCESS_KEY_ID รวมไปถึงทำการสแกนไฟล์ของระบบหา Secrets ที่มีความ Entropy สูงโดยใช้เครื่องมือ Trufflehog และ Regex
- เริ่มทำการ 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 ของทุกภูมิภาคได้
- หลังจาก 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 ในการแพร่กระจายไปเพิ่ม
- ต่อมาในขั้นตอนการ Persistence จะใช้วิธีการ Inject GitHub Actions Workflow ชื่อว่า [.]github/workflows/shai-hulud-workflow[.]yml ซึ่งจะถูก Commit ไปยัง Branch ใหม่หรือ Push เข้า Default Branch ผ่าน API ซึ่ง Workflow นี้จะ Trigger บน Push หรือ Event อื่น ๆ ที่มักเกิดใน Repo เพื่อให้รันอัตโนมัติเมื่อมีการทำงานบน Repo
- การทำ 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.stepsecurity.io/blog/ctrl-tinycolor-and-40-npm-packages-compromised
https://socket.dev/blog/tinycolor-supply-chain-attack-affects-40-packages


