สรุปสั้น
แพ็กเกจ npm ชื่อ “tensorlake” ซึ่งเป็น SDK ภาษา TypeScript สำหรับแอปพลิเคชัน แซนด์บ็อกซ์ และบริการคลาวด์ของแพลตฟอร์ม Tensorlake ที่ใช้รันเอเจนต์ AI ถูกเจาะเป็นส่วนหนึ่งของการโจมตีห่วงโซ่อุปทานตระกูล ChainDrop/Shai-Hulud เวอร์ชันอันตราย 0.5.144 มี preinstall hook ที่เรียกตัวโหลดซึ่งดาวน์โหลด Bun runtime มารัน worm ขโมย credential ทั้ง token ของ npm และ GitHub คีย์ AWS ความลับใน HashiCorp Vault และ Kubernetes คีย์ SSH ไฟล์ .env กระเป๋าคริปโต รวมถึงไฟล์คอนฟิกและ MCP ของเครื่องมือ AI อย่าง Claude, Cursor, Kiro, Windsurf และ Zed แพ็กเกจนี้มียอดดาวน์โหลดราว 12,000 ครั้งต่อสัปดาห์ แต่ตัวเลขนี้สะท้อนการใช้งานโดยรวม ไม่ใช่จำนวนผู้ติดตั้งเวอร์ชันอันตรายหรือเครื่องที่ติดเชื้อยืนยันแล้ว
ต้นทางของเหตุคือคอมมิตอันตรายที่ถูกดันเข้า main branch ของ repo tensorlakeai/tensorlake ภายใต้ชื่อผู้ดูแลโดยไม่ผ่าน pull request เมื่อ 7 ตุลาคม 2569 ก่อนที่ release workflow ของ repo เองจะเผยแพร่ 0.5.144 ขึ้น npm ในวันถัดมาพร้อม provenance attestation ที่ถูกต้อง worm แพร่ต่อด้วยการ republish แพ็กเกจของเหยื่อ และ commit ไฟล์ .claude/settings.json กับ .vscode/tasks.json ลง repo ที่เข้าถึงได้ เพื่อให้รันซ้ำเมื่อมีคนเปิดโปรเจกต์ใน Claude Code หรือ VS Code จุดที่อันตรายที่สุดคือกลไก “hostage token” ที่คอยเช็ก GitHub token ที่ขโมยไป หากเหยื่อเพิกถอน token จะสั่งล้างโฮมไดเรกทอรีของผู้ใช้ ลำดับการกู้คืนจึงต้องถอดตัวเฝ้าออกก่อนแล้วค่อยเปลี่ยน credential
รายละเอียดข่าว
เว็บไซต์ The Hacker News รายงานเมื่อวันที่ 8 ตุลาคม 2569 อ้างข้อมูลจากบริษัท Socket และบริษัท StepSecurity ว่าเวอร์ชัน 0.5.144 “มีมัลแวร์ที่ถูกอำพรางซึ่งเก็บเกี่ยว credential ส่งความลับออก สร้างการคงสิทธิ์ และรันโค้ดที่ส่งมาจากระยะไกล” Socket ระบุว่าแพ็กเกจถูกเผยแพร่เวลา 01:12:07 UTC และระบบของบริษัทตรวจพบเวลา 01:23:10 UTC หรือราว 11 นาทีหลังเผยแพร่ ส่วน StepSecurity รายงานปัญหาให้ผู้ดูแลผ่าน GitHub issue #1014 ข้อมูลสองแหล่งไม่ตรงกันเรื่องสถานะแพ็กเกจ โดย The Hacker News ระบุว่าเวอร์ชัน 0.5.144 ถอดออกจาก npm แล้ว ขณะที่ StepSecurity ระบุว่ายังดาวน์โหลดได้ ณ เวลาที่ตรวจ เวอร์ชันที่ปลอดภัยให้ปักไว้คือ 0.5.143
ไทม์ไลน์ของ StepSecurity ระบุว่าคอมมิตอันตรายแรก (e90c47b) ลง main branch เมื่อ 7 ตุลาคม 2569 เวลา 01:20 UTC ตามด้วยอีก 7 คอมมิตในไม่กี่ชั่วโมง ซึ่งแก้ payload และเพิ่ม preinstall hook ใน package.json (c79bc47) จนถึงคอมมิต 6386121 จากนั้นเวลา 01:12 UTC ของ 8 ตุลาคม release workflow ของ repo เผยแพร่ 0.5.144 ขึ้น npm ภายใต้ตัวตนผู้ดูแลคนเดิม ไฟล์ในแพ็กเกจตรงกับ main branch ทุกประการ นาย Ashish Kurmi จาก StepSecurity ระบุว่า “มัลแวร์ยังเขียนไฟล์ .claude/settings.json และ .vscode/tasks.json ลงใน repo ที่มันเข้าถึงได้ เพื่อให้รันอีกครั้งเมื่อมีคนเปิดโปรเจกต์ใน Claude Code หรือ VS Code” แหล่งข่าวไม่ได้ระบุว่าบัญชีหรือ credential ของผู้ดูแลถูกยึดด้วยวิธีใด
วิธีการโจมตี
การรันและขโมยข้อมูล
แพ็กเกจกำหนด "preinstall": "node lib/setup.mjs" จึงทำงานทันทีตอนติดตั้งถ้าเปิดให้รัน lifecycle script โดยไม่ต้อง import SDK ตัวโหลด setup.mjs ข้ามการทำงานเมื่ออยู่ในระบบ CI ทำให้เป้าหมายหลักคือเครื่องนักพัฒนา ก่อนดาวน์โหลด Bun มารัน Math_Symbol.js ไฟล์อำพรางขนาดราว 856 KB ที่เป็นทั้งตัวขโมยข้อมูลและ worm ตัวขโมยไล่เก็บ .npmrc และขอ token ผ่าน npm API และ OIDC token exchange ตรวจสิทธิ์ repo และ workflow ของ GitHub token ดึงความลับจาก AWS IMDS, ECS, Secrets Manager และ SSM Parameter Store ลองเข้าถึง Vault ที่ 127.0.0.1:8200 รวมถึงเส้นทางยืนยันตัวตนแบบ Kubernetes และ AWS อ่าน service-account token และ kubeconfig ของ Kubernetes และยังวางไบนารี HackBrowserData เพื่อดึงรหัสผ่านที่บันทึกในเบราว์เซอร์
ข้อมูลที่ขโมยได้ถูกเข้ารหัสแล้วส่งออก 2 ทาง คือไปที่ iseekaigogo[.]com หรือสร้าง repo สาธารณะในบัญชี GitHub ของเหยื่อที่มีคำอธิบาย “Shai-Hulud: Here We Go Again” มัลแวร์ไม่ได้ฝังโดเมน C2 ไว้ตายตัว แต่ resolve ปลายทางผ่าน smart contract บน Ethereum โดยคิวรีผ่าน RPC สาธารณะราว 30 แห่ง และใช้ GitHub เป็นทางสำรอง
การแพร่กระจายและคงสิทธิ์
เมื่อได้ npm token มัลแวร์จะไล่รายการแพ็กเกจที่ผูกกับตัวตนผู้เผยแพร่ของเหยื่อ ดาวน์โหลดมา inject ตัวเองเข้าไป เพิ่มเลขเวอร์ชัน สร้าง Sigstore provenance แล้ว republish เมื่อได้ GitHub token จะ commit ไฟล์ .claude และ .vscode ลง repo ของเหยื่อโดยปลอมผู้เขียนเป็น claude@users.noreply.github.com พร้อมข้อความ “chore: update dependencies” Socket ยังพบสตริงที่อ้างถึง workflow ปลอมธีม Copilot/Dependabot ซึ่งบ่งว่ามัลแวร์วาง GitHub Actions workflow ด้วย
กลไก hostage token
เมื่อพบ GitHub token มัลแวร์ติดตั้งบริการเบื้องหลังชื่อ gh-token-monitor ที่เรียก api.github.com/user ด้วย token ที่ขโมยมาทุก 60 วินาทีนานสูงสุด 24 ชั่วโมง ถ้า GitHub ปฏิเสธ token เช่นหลังเหยื่อเพิกถอน บริการจะลบโฮมไดเรกทอรีของผู้ใช้ (rm -rf ~/ บน Linux/macOS หรือลบโปรไฟล์ผู้ใช้ด้วย PowerShell บนวินโดวส์) Socket อธิบายฝั่งวินโดวส์ว่าเป็นตัวเฝ้า PowerShell ที่คงสิทธิ์ด้วย scheduled task แบบ ONLOGON และรัน handler ที่ผู้โจมตีส่งมาผ่าน Invoke-Expression พร้อมสตริง IfYouRevokeThisTokenItWillWipeTheComputerOfTheOwner ซึ่งเคยพบใน Shai-Hulud ระลอกก่อน ๆ (ดู 2026/06/181 และ 2026/09/022)
ผลกระทบ
เหตุนี้ขยายการโจมตีห่วงโซ่อุปทานตระกูล ChainDrop ซึ่งเริ่มถูกบันทึกเมื่อต้นสิงหาคม 2569 จากการเจาะแพ็กเกจ npm หลายร้อยตัว รวมถึง Keyv และ Cacheable เข้าสู่โครงสร้างพื้นฐานของเอเจนต์ AI โดยตรง ผู้ที่ติดตั้ง SDK สำหรับรันเอเจนต์ในแซนด์บ็อกซ์มักมีทั้งคีย์คลาวด์ คีย์ของบริการ AI และสิทธิ์เผยแพร่แพ็กเกจอยู่บนเครื่องเดียวกัน ความเสียหายจึงไม่หยุดที่ API key ตัวเดียว ความลับใดก็ตามที่โปรเซสเข้าถึงได้อาจรั่ว และการคงสิทธิ์ยังอยู่แม้ถอนแพ็กเกจออกแล้ว
อีกประเด็นที่ทีมป้องกันต้องปรับวิธีคิดคือ provenance attestation ไม่ได้ช่วยในเคสนี้ เพราะแพ็กเกจถูกสร้างจาก release workflow ของ repo จริงหลังโค้ดอันตรายเข้า main branch ไปแล้ว ส่วนการวางไฟล์ .claude/settings.json และ .vscode/tasks.json ทำให้ repo ที่ติดเชื้อกลายเป็นตัวแพร่เชื้อต่อไปยังนักพัฒนาคนอื่นที่ clone ไปเปิด และกลไก hostage token ทำให้ขั้นตอนตอบสนองเหตุมาตรฐานอย่าง “เพิกถอน token ทันที” กลายเป็นตัวจุดชนวนทำลายข้อมูล
คำแนะนำ
- ตรวจการใช้งานด้วย
npm ls tensorlakeและค้น lockfile, build log และ artifact ที่ deploy แล้วหา0.5.144· ตรวจด้วยว่ามีการ clone หรือ pull repotensorlakeai/tensorlakeตั้งแต่ 7 ต.ค. แล้วรันnpm installในโฟลเดอร์typescript/หรือไม่ - ปักเวอร์ชันเป็น
tensorlake@0.5.143ลบnode_modulesล้าง npm cache และตั้งignore-scripts=trueใน.npmrcเพื่อปิด install hook - ถอดตัวเฝ้า
gh-token-monitorก่อนเพิกถอน token ใด ๆ: สำรองข้อมูลที่จำเป็น หยุดและลบบริการ systemd/LaunchAgent/scheduled task และไฟล์ที่เกี่ยวข้อง (ดูตาราง IoC) จากนั้นจึงเปลี่ยน credential - เปลี่ยน credential ทั้งหมดจากเครื่องที่สะอาด: token ของ GitHub และ npm คีย์คลาวด์ คีย์ SSH credential ของ Kubernetes และ Vault ความลับใน
.envคีย์ของเครื่องมือ AI และรหัสผ่านที่บันทึกในเบราว์เซอร์ - ไล่ตรวจบัญชี GitHub หา repo สาธารณะที่มีคำอธิบาย “Shai-Hulud” คอมมิตจาก
claude@users.noreply.github.comไฟล์.claude/.vscodeและ workflow ที่ไม่ได้สร้างเอง รวมถึงเวอร์ชันแพ็กเกจที่ถูก republish โดยไม่ได้ตั้งใจ - เปิด branch protection บังคับ pull request และรีวิวก่อน merge เข้า main และพิจารณา cooldown ก่อนรับแพ็กเกจเวอร์ชันใหม่เข้าระบบ build
- ถ้ายืนยันไม่ได้ว่าเครื่องสะอาด ให้ติดตั้งระบบใหม่ · ถ้ารันเฉพาะใน CI ตัว hook จะข้ามการทำงาน แต่ยังควรเปลี่ยนความลับที่ job นั้นเข้าถึงได้
Indicators of Compromise (IoCs)
โดเมน defang แล้ว (
[.]) ก่อนใช้งานต้องแปลงกลับ
| ประเภท | ค่า | คำอธิบาย |
|---|---|---|
| แพ็กเกจ | tensorlake@0.5.144 | เวอร์ชันอันตราย (ปลอดภัย: 0.5.143) |
| SHA-256 | 25a0735d0db7dc40e5d45ce42d9c106067e6a66e184d967cfecfab17c3bcb5ef | lib/setup.mjs ตัวโหลด |
| SHA-256 | b50a00900399ba99fb6ce1fc151519cb99d44320ef2a631f2237e1aea0ad6fec | lib/Math_Symbol.js worm/ตัวขโมยข้อมูล |
| โดเมน | iseekaigogo[.]com | ปลายทางส่งข้อมูลออก/C2 |
| คำอธิบาย repo | Shai-Hulud: Here We Go Again | repo สาธารณะที่ใช้พักข้อมูลที่ขโมย |
| ผู้เขียนคอมมิต | claude@users.noreply.github.com | ผู้เขียนปลอม ข้อความ “chore: update dependencies” |
| คอมมิต | e90c47b ถึง 6386121 (รวม c79bc47) | คอมมิตอันตรายใน tensorlakeai/tensorlake |
| ไฟล์ | ~/.config/gh-token-monitor/ · ~/.local/bin/gh-token-monitor.sh | ตัวเฝ้า token และไฟล์ token |
| ไฟล์ | ~/.config/systemd/user/gh-token-monitor.service | บริการคงสิทธิ์บน Linux |
| ไฟล์ | ~/Library/LaunchAgents/com.user.gh-token-monitor.plist | บริการคงสิทธิ์บน macOS |
| Scheduled task | logon task ที่รัน monitor.ps1 | ตัวเฝ้าบนวินโดวส์ |
| ไฟล์ใน repo | .claude/settings.json · .vscode/tasks.json | ไฟล์ที่ทำให้รันซ้ำเมื่อเปิดโปรเจกต์ |
