สรุปสั้น

คลื่นการโจมตีแบบ supply chain ระลอกใหม่กำลังแพร่กระจายในโลก open source โดยครั้งนี้เป้าหมายคือ “ตัวนักพัฒนา” เอง นักวิจัยด้านความปลอดภัยเปิดโปงแคมเปญชื่อ PolinRider ที่ซ่อน JavaScript loader อันตรายไว้ในคลังโค้ดที่ผู้คนไว้วางใจ แล้วรอให้นักพัฒนาที่ไม่ทันระวังเผลอรันมันขึ้นมา แคมเปญนี้ถูกเชื่อมโยงกับกลุ่มภัยคุกคามเกาหลีเหนือที่ผูกกับคลัสเตอร์ Contagious Interview และ Famous Chollima ซึ่งขึ้นชื่อเรื่องการล่อวิศวกรซอฟต์แวร์ด้วยข้อเสนองานปลอมและแบบทดสอบเขียนโค้ดที่ฝังมัลแวร์

สิ่งที่ทำให้ PolinRider อันตรายคือขอบเขตการแพร่กระจาย มันเริ่มจาก npm แต่ลามไปยัง Packagist, Go modules และแม้แต่ Chrome extension แสดงว่าผู้โจมตีไม่ได้จำกัดตัวอยู่ในระบบนิเวศเดียว นักวิจัยจาก บริษัท Socket.dev ระบุว่าพบ artifact อันตราย 162 รายการกระจายอยู่ใน 108 แพ็กเกจและส่วนขยายที่ไม่ซ้ำกัน รวมถึง Go modules ที่ถูกเจาะ 80 ตัว, แพ็กเกจ Packagist 10 ตัว และ Chrome extension 1 ตัว เนื่องจากโค้ดอันตรายซ่อนอยู่ในไฟล์ที่ดูปกติดี นักพัฒนาจำนวนมากอาจติดตั้งมันไปโดยไม่รู้ว่ามีอะไรผิดปกติ ทีมความปลอดภัยจึงควรถือว่าสภาพแวดล้อมที่รันแพ็กเกจซึ่งได้รับผลกระทบนั้น “ถูกเจาะแล้ว” จนกว่าจะพิสูจน์เป็นอย่างอื่น

รายละเอียดข่าว

เว็บไซต์ Cyber Security News รายงานเมื่อวันที่ 3 กรกฎาคม 2569 ว่า บริษัท Socket.dev ได้เปิดเผยรายงานที่แชร์ให้ CSN ระบุว่าแคมเปญ PolinRider เติบโตใหญ่กว่าที่รายงานก่อนหน้าประเมินไว้มาก โดยผู้โจมตีอาศัยทั้งลูกเล่นเก่าและใหม่ผสมกันเพื่อหลบซ่อนตัว ระลอกแรก ๆ ฝัง JavaScript ที่ผ่านการ obfuscate ไว้ในไฟล์ config เช่นไฟล์ที่ลงท้ายด้วย config.js โดยหวังว่านักพัฒนาจะไม่ไล่อ่านโค้ดทุกบรรทัด ส่วนเวอร์ชันใหม่กว่านั้นปลอมสคริปต์อันตรายให้เป็นไฟล์ฟอนต์ .woff2 ปลอม ซึ่งเป็นรูปแบบไฟล์ที่นักพัฒนาส่วนใหญ่ไม่คิดจะเปิดตรวจ

การเรียกทำงานถูกกระตุ้นอย่างเงียบ ๆ ผ่านไฟล์ task ของ Visual Studio Code ซึ่งสามารถรันอัตโนมัติเมื่อเปิดโฟลเดอร์ เมื่อทำงานแล้ว loader จะติดต่อไปยังบริการ blockchain และ public RPC ทั้งเครือข่าย TRON, Aptos และ BNB Smart Chain เพื่อดึงเพย์โหลดขั้นที่สองที่ถูกเข้ารหัส แล้วถอดรหัสด้วยกุญแจ XOR ที่ฝังไว้ และรันด้วยฟังก์ชัน eval เพย์โหลดที่พบจนถึงตอนนี้ได้แก่ DEV#POPPER และ OmniStealer ซึ่งทั้งคู่รันคำสั่งจากระยะไกลได้ สื่อสารกับเซิร์ฟเวอร์ผู้โจมตีผ่าน socket.io-client และขโมยข้อมูลรับรอง ข้อมูลเบราว์เซอร์ และข้อมูลกระเป๋าเงินคริปโต

north korea javascript supply chain cybersecurity linked hackers hide javascript loaders north korea
north korea javascript supply chain cybersecurity linked hackers hide javascript loaders north korea

วิธีการโจมตี

จุดสำคัญส่วนหนึ่งของแคมเปญนี้อยู่ที่บัญชี GitHub ชื่อ Xpos587 โดยมีหลาย repository ที่ผูกกับบัญชีนี้ถูกแก้ไขในช่วงเวลาแคบ ๆ เดียวกัน คือวันที่ 23 มิถุนายน เวลา 10:00 UTC ซึ่งเป็นรูปแบบที่สอดคล้องกับการถูกยึดบัญชี (account takeover) มากกว่าการดูแลตามปกติ repository สองตัวที่เชื่อมกับบัญชีนี้ ได้แก่ Xpos587/git2md และ Xpos587/markfetch พร้อมกับโปรเจกต์แยกชื่อ Artiffusion-Inc/mirofish ถูกพบว่าแบก loader ที่ซ่อนอยู่ โดย markfetch ใช้ลูกเล่นฟอนต์ปลอม ส่วน mirofish ซ่อนเพย์โหลดไว้ในไฟล์ชื่อ vite.config.js บน Packagist แคมเปญขยายผ่าน namespace ชื่อ sevenspan ที่ผูกกับองค์กร 7span โดยมีแพ็กเกจ 7span/react-list เป็นหนึ่งในเป้าที่ได้รับผลกระทบ

ผู้ดูแลได้ลบไฟล์ฟอนต์ปลอมทิ้งเมื่อพบ แต่โค้ดที่ obfuscate ซึ่งซ่อนในไฟล์ config ยังไม่ถูกแตะต้อง แสดงว่าการล้างเพียงบางส่วนไม่เพียงพอ นอกจากนี้ผู้โจมตียังใช้การเขียนประวัติ Git ใหม่ ทั้ง force push และ commit แบบ backdate เพื่อให้โค้ดที่ถูกดัดแปลงดูเก่ากว่าความจริง ทำให้ประวัติ commit ที่มองเห็นบน GitHub เพียงอย่างเดียวเชื่อถือไม่ได้ ผู้ป้องกันจำเป็นต้องตรวจ activity log โดยตรง

ผลกระทบต่อไทย

นักพัฒนาและบริษัทซอฟต์แวร์ในไทยที่ดึงแพ็กเกจจาก npm, Packagist, Go modules หรือติดตั้ง Chrome extension จากแหล่งสาธารณะ ล้วนอยู่ในระยะเสี่ยงของแคมเปญนี้ เพราะการโจมตีเล็งที่เครื่องของนักพัฒนาและ CI/CD pipeline โดยตรง หากเครื่องนักพัฒนาถูกเจาะ ผู้โจมตีสามารถขโมยข้อมูลรับรอง โทเคนคลาวด์ และกระเป๋าคริปโต แล้วต่อยอดเข้าสู่ระบบภายในองค์กรได้ ที่น่ากังวลเป็นพิเศษคือกลวิธีล่อด้วย “ข้อเสนองานปลอม/แบบทดสอบเขียนโค้ด” ของกลุ่ม Contagious Interview ซึ่งเคยพุ่งเป้านักพัฒนาไทยและอาเซียนมาแล้ว การใช้ไฟล์ฟอนต์ปลอมและ VS Code task ที่รันอัตโนมัติเมื่อเปิดโฟลเดอร์ ทำให้แม้แต่การเปิดโปรเจกต์มาดูเฉย ๆ ก็อาจตกเป็นเหยื่อได้

คำแนะนำ

ควรถือว่าทุกสภาพแวดล้อมที่รันแพ็กเกจซึ่งได้รับผลกระทบเป็นเครื่องที่ถูกเจาะจนกว่าจะพิสูจน์เป็นอย่างอื่น เก็บรักษาหลักฐานทางนิติวิทยาศาสตร์ไว้ สร้างระบบใหม่จาก lockfile ที่รู้ว่าสะอาด และหมุนเวียน secret ที่รั่วจากเครื่องที่สะอาดแทนเครื่องที่ติดเชื้อ ควรตรวจสอบเครื่องว่ามี VS Code task ที่ตั้งให้รันอัตโนมัติเมื่อเปิดโฟลเดอร์หรือไม่ และทบทวน repository หาการเปลี่ยนแปลงที่น่าสงสัยในไฟล์อย่าง tasks.json, config.js และ vite.config.js อย่าเชื่อประวัติ commit บนหน้าเว็บเพียงอย่างเดียว ให้ตรวจ activity log โดยตรงเพราะผู้โจมตีใช้การ backdate และ force push ปิดบัง สุดท้ายควรระวังข้อเสนองานหรือแบบทดสอบเขียนโค้ดที่ให้รันโปรเจกต์จากคนแปลกหน้า ซึ่งเป็นกลวิธีหลักของกลุ่มนี้

Indicators of Compromise (IoCs)

หมายเหตุ: แคมเปญนี้ไม่ได้เผยแพร่ IP หรือโดเมน C2 แบบตายตัว เพราะ loader ดึงเพย์โหลดขั้นสองผ่านบริการ blockchain และ public RPC (TRON, Aptos, BNB Smart Chain) ที่เปลี่ยนได้ตลอด ตัวบ่งชี้หลักจึงเป็นบัญชี คลังโค้ด ไฟล์ และพฤติกรรม บริษัท Socket.dev ติดตามรายชื่อแพ็กเกจที่ได้รับผลกระทบแบบเรียลไทม์ที่ https://socket.dev/supply-chain-attacks/polinrider

บัญชี เนมสเปซ และคลังโค้ดที่เกี่ยวข้อง

ประเภทตัวบ่งชี้คำอธิบาย
GitHub accountXpos587บัญชีที่สงสัยว่าถูกยึด (account takeover) — หลาย repo ถูกแก้พร้อมกันวันที่ 23 มิ.ย. 2569 เวลา 10:00 UTC
GitHub repoXpos587/git2mdGo module ที่ถูกฝัง loader
GitHub repoXpos587/markfetchใช้ลูกเล่นไฟล์ฟอนต์ .woff2 ปลอมซ่อนเพย์โหลด
GitHub repoArtiffusion-Inc/mirofishซ่อนเพย์โหลดในไฟล์ vite.config.js
Packagist namespacesevenspan (องค์กร 7span)เนมสเปซ Packagist ที่ถูกเจาะ
Packagist package7span/react-listแพ็กเกจที่ได้รับผลกระทบ

อาร์ทิแฟกต์และไฟล์อันตราย

ประเภทตัวบ่งชี้คำอธิบาย
Go module versiongithub[.]com/Xpos587/git2md v0.0.0-20260503100027-79bdb26ca95dเวอร์ชัน Go module อันตรายที่ถูกเผยแพร่
Git commit1c1d61bfe82e5a3a907a234599f3a8f510c10094commit ที่ฝัง JavaScript ในไฟล์ config ของ 7span/react-list
ประเภทไฟล์ไฟล์ .woff2 ปลอมซ่อน JavaScript loader (ไม่ใช่ไฟล์ฟอนต์จริง)
ไฟล์.vscode/tasks.json (runOn: folderOpen)รันไฟล์ .woff2 ด้วย node อัตโนมัติเมื่อเปิดโฟลเดอร์
ไฟล์*config.js, vite.config.js, eslint.config.jsไฟล์ config ที่ถูกต่อท้ายด้วย JavaScript ที่ถูก obfuscate

เพย์โหลดและโครงสร้างพื้นฐาน

ประเภทตัวบ่งชี้คำอธิบาย
MalwareDEV#POPPERเพย์โหลดขั้นสอง — รันคำสั่งระยะไกลและขโมยข้อมูล
MalwareOmniStealerขโมยข้อมูลรับรอง ข้อมูลเบราว์เซอร์ และกระเป๋าเงินคริปโต
InfrastructureTRON / Aptos / BNB Smart Chain (public RPC)ช่องดึงเพย์โหลดขั้นสองที่เข้ารหัส (ถอดด้วย XOR key แล้ว eval)
C2socket.io-clientช่องสื่อสารกับเซิร์ฟเวอร์ผู้โจมตี

พฤติกรรมที่ควรเฝ้าระวัง (hunt-only — ไม่เข้า index อัตโนมัติ): VS Code task ที่ตั้งค่า "runOn": "folderOpen", คำสั่งที่รันไฟล์นามสกุล .woff2 ด้วย node, การ force push หรือ commit แบบ backdate ในคลังโค้ด และการเผยแพร่เวอร์ชันแพ็กเกจใหม่ทันทีหลัง repo ถูกแก้ไข

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