สรุปสั้น

บริษัท Checkmarx เปิดเผยแคมเปญโจมตีห่วงโซ่อุปทานบน npm ที่ตั้งชื่อว่า MALFEX ซึ่งดำเนินมาตั้งแต่สิงหาคม 2566 เมื่อผู้โจมตีเผยแพร่แพ็กเกจแรก จนถึงปัจจุบันแพ็กเกจของแคมเปญมียอดดาวน์โหลดรวมกว่า 40,000 ครั้ง ผู้โจมตีเผยแพร่แพ็กเกจทั้งหมด 12 ตัว เป็นอันตราย 8 ตัว ในจำนวนนี้ 5 ตัวถูกนำออกจาก registry แล้ว แต่ณ วันที่ 1 ตุลาคม ยังมี 3 ตัวที่ติดตั้งได้อยู่ ได้แก่ function-flag, function-color และ cdn-img-fetch แพ็กเกจที่น่ากังวลที่สุดคือ function-flag ซึ่งอันตรายมาตั้งแต่กรกฎาคม 2568 มียอดดาวน์โหลดกว่า 37,000 ครั้ง แต่ยังไม่มี advisory ใดระบุว่าเป็นอันตราย

แคมเปญส่งมัลแวร์ผ่าน 3 เส้นทางที่ไม่ใช้โครงสร้างพื้นฐานร่วมกันแต่โยงกับผู้โจมตีรายเดียวกัน ได้แก่ ตัวโหลด Overlord RAT ที่รันตอน npm install ตัวขโมยข้อมูล Node.js ชื่อ movinlike ที่รันตอนโหลดแพ็กเกจ และตัวดาวน์โหลดที่เปลี่ยนแหล่ง payload ในแต่ละเวอร์ชันของ function-flag แม้สคริปต์บางส่วนจะรันได้บน Windows, macOS และ Linux แต่ payload ทำงานจริงเฉพาะบน Windows Checkmarx ระบุว่าไม่มีแพ็กเกจที่ถูกกฎหมายหรือนิยมใช้รายใดพึ่งพาแพ็กเกจเหล่านี้ ความเสี่ยงจึงจำกัดอยู่กับเครื่องที่ติดตั้งแพ็กเกจเหล่านี้โดยตรง และไม่พบการเลือกเป้าหมายตามพื้นที่หรือองค์กร

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

เว็บไซต์ SecurityWeek รายงานเมื่อวันที่ 6 ตุลาคม 2569 อ้างรายงานของ Checkmarx ว่าแพ็กเกจอันตรายที่เผยแพร่ในแคมเปญ npm ระยะยาวชื่อ MALFEX มียอดดาวน์โหลดสะสมกว่า 40,000 ครั้ง แคมเปญนี้แจกจ่ายมัลแวร์อย่าง Overlord RAT และตัวขโมยข้อมูล โดยผู้โจมตีเผยแพร่แพ็กเกจแรกตั้งแต่สิงหาคม 2566 และยังคงปล่อยแพ็กเกจใหม่ต่อเนื่องมาจนถึงปีนี้

ปัญหาที่ Checkmarx ชี้คือช่องว่างของระบบแจ้งเตือน ฐานข้อมูล Open Source Vulnerabilities (OSV) มี advisory สำหรับแพ็กเกจอันตรายเพียง 6 ตัว ได้แก่ tlxbnhd, tldriver, mxdriver, img-to-native, native-runner และ cdn-img-fetch และ advisory ของ cdn-img-fetch ครอบคลุมเพียง 2 จาก 4 เวอร์ชันที่เป็นอันตราย ขณะที่ function-flag ซึ่งมียอดดาวน์โหลดสูงสุดและอันตรายมากว่าหนึ่งปี ยังไม่มี advisory ใดเลย เครื่องมือตรวจ dependency ที่อาศัยฐานข้อมูลเหล่านี้จึงไม่แจ้งเตือนผู้ที่ติดตั้ง function-flag

Checkmarx ตั้งชื่อรายงานว่าผู้โจมตี “ลงชื่อในผลงานของตัวเอง” ซึ่งสื่อว่ามีร่องรอยเฉพาะที่ใช้เชื่อมโยงเส้นทางทั้งสามเข้ากับผู้โจมตีรายเดียวกัน แม้แต่ละเส้นทางจะไม่ใช้โครงสร้างพื้นฐานร่วมกัน ทั้งนี้ SecurityWeek ไม่ได้ให้รายละเอียดของร่องรอยดังกล่าว และไม่มีการระบุตัวตนหรือสังกัดของผู้โจมตี

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

เส้นทางแรกใช้ตัวโหลด Overlord RAT และสคริปต์ที่ถูก obfuscate ซึ่งรันระหว่างคำสั่ง npm install ผ่านกลไก install script ของ npm สคริปต์รันได้บน Windows, macOS และ Linux แต่ payload ทำงานได้เฉพาะบน Windows เมื่อติดตั้งสำเร็จ Overlord RAT ให้ผู้โจมตีเฝ้าดูและควบคุมเครื่อง ทั้งการจับภาพหน้าจอ บันทึกการกดแป้นพิมพ์ ติดตามหน้าต่างที่เปิด เปิด shell ระยะไกล ค้นหาไฟล์ และใช้ hidden desktop เพื่อทำกิจกรรมโดยผู้ใช้มองไม่เห็น

เส้นทางที่สองรันโค้ดอันตรายเมื่อแพ็กเกจถูกโหลดในโปรแกรม ไม่ใช่ตอนติดตั้ง เพื่อวางตัวขโมยข้อมูลที่เขียนด้วย Node.js ชื่อ movinlike ลงในเครื่อง มัลแวร์ตัวนี้เล็งข้อมูลจากไคลเอนต์ Discord 8 ตัว เบราว์เซอร์ยอดนิยม 7 ตัว และกระเป๋าเงินคริปโต การรันตอนโหลดทำให้หลบมาตรการที่ปิด install script ได้ เช่น การติดตั้งด้วย --ignore-scripts

เส้นทางที่สามเป็นส่วนที่ดำเนินมานานที่สุด แต่ละเวอร์ชันที่เป็นอันตรายของ function-flag ฝังตัวดาวน์โหลดแยกกัน ซึ่งดึง payload จากแหล่งที่ต่างกัน ทำให้การบล็อกแหล่งดาวน์โหลดเดียวไม่พอ ขั้นตอนติดเชื้อถูกออกแบบให้การติดตั้งแพ็กเกจเสร็จสมบูรณ์แม้การดาวน์โหลด payload จะล้มเหลว และล้มเหลวแบบเงียบบน macOS และ Linux ผู้ใช้จึงไม่เห็นข้อผิดพลาดที่ชวนสงสัย และมีเพียงเครื่อง Windows ที่ได้รับผลกระทบ

มุมมองจาก CloudSEK และ Overlord RAT ในแคมเปญอื่น

เว็บไซต์ The Hacker News รายงานเมื่อวันที่ 7 ตุลาคม 2569 ว่าบริษัท CloudSEK ติดตามแคมเปญเดียวกันภายใต้ชื่อ MALFEX เช่นกัน และประเมินว่าเป็นผลงานของผู้โจมตีรายเดียว ยอดดาวน์โหลดรวมของแพ็กเกจอันตราย 8 ตัวอยู่ที่ 40,767 ครั้ง ในจำนวนนี้ 37,419 ครั้งมาจาก function-flag ซึ่งเผยแพร่ครั้งแรกเมื่อกรกฎาคม 2567 และออกเวอร์ชันล่าสุดเมื่อ 4 สิงหาคม 2568 หน้าคำอธิบายแพ็กเกจมีข้อความต้อนรับภาษาโปรตุเกสว่าโครงการนี้สร้างโดย “ทีม Malfex ซึ่งมีเจ้าของคือ Murizada” ส่วน function-color ไม่มี payload ของตัวเอง แต่ระบุ function-flag เป็น dependency เพื่อดึงโค้ดอันตรายเข้ามา

Checkmarx อธิบายกลไกของ function-flag เวอร์ชันล่าสุด 1.7.3 ว่า postinstall script จะรัน example.js ที่เรียกฟังก์ชันวาด ASCII art ด้วยฟอนต์ชื่อ Bloody ค่าฟอนต์นี้เป็นตัวกระตุ้นรูทีนที่ซ่อนอยู่ให้ดาวน์โหลด node.exe จาก cdnzona.discloud[.]app ซึ่งเป็นโฮสต์บนบริการโฮสต์แอปพลิเคชันของบราซิล บันทึกไว้ที่ %APPDATA%\node.exe แล้วรันแบบซ่อนหน้าต่าง ส่วนชุด img-to-native ต้องพึ่ง cdn-img-fetch เพื่อดึงไฟล์ Go มารัน ซึ่งจะไปดึงตัวขโมยข้อมูล movinlike ต่ออีกทอด ขณะที่ Overlord เป็น RAT โอเพนซอร์สเขียนด้วย Go ที่ดึงที่อยู่เซิร์ฟเวอร์ C2 จากธุรกรรมบนบล็อกเชน Solana

ด้านการระบุตัวผู้โจมตี CloudSEK พบว่าผู้ควบคุมใช้ภาษาโปรตุเกส git commit มีเขตเวลา -0300 คำอธิบายรีโพสิทอรีหนึ่งเป็นภาษาโปรตุเกส และชื่อที่แสดงบน GitHub กับอีเมลเป็นชื่อเล่นที่พบบ่อยในบราซิล แต่ CloudSEK ย้ำว่า “ไม่มีข้อใดเป็นหลักฐานว่าแคมเปญเล็งบราซิล” เป็นเพียงข้อมูลบ่งชี้พื้นที่ภาษาของผู้ควบคุม การส่งมัลแวร์ผ่าน npm และ Discord เป็นช่องทางระดับโลก และการเลือกเหยื่อในขั้นที่สองเป็นแบบฉวยโอกาส

Overlord RAT ยังถูกพบในอีกสองแคมเปญตั้งแต่กรกฎาคม 2569 ได้แก่ การโจมตีที่ใช้ช่องโหว่ WordPress CVE-2026-63030 และ CVE-2026-60137 หรือ wp2shell (ดูโพสต์ 2026/07/197 และ 2026/07/231) และแคมเปญบน macOS ที่ใช้ตัวติดตั้ง Zoom ปลอมตามรายงานของบริษัท Jamf ซึ่งมีลักษณะทางยุทธวิธีทับซ้อนกับกลุ่ม UNK_DeadDrop ที่สงสัยว่าเชื่อมโยงกับเกาหลีเหนือ (ดูโพสต์ 2026/06/105 ) การที่ RAT ตัวเดียวกันโผล่ในหลายแคมเปญไม่ได้แปลว่าเป็นผู้โจมตีกลุ่มเดียวกัน เพราะ Overlord เป็นโอเพนซอร์สที่ใครก็นำไปใช้ได้

ผู้โจมตีตอบโต้การถอดแพ็กเกจ — imgdecode และตัวโหลดใน native addon

เว็บไซต์ The Hacker News รายงานเมื่อวันที่ 17 ตุลาคม 2569 อ้างการวิเคราะห์ของบริษัท SafeDep ว่าผู้อยู่เบื้องหลัง MALFEX ตอบโต้การเปิดเผยต่อสาธารณะและการถอดแพ็กเกจของ npm ภายในสองวัน หลัง npm ถอด native-runner และ img-to-native เมื่อ 28 กันยายน ผู้โจมตีเผยแพร่ runhelper และ imgbundle มาแทนในเช้าวันที่ 30 กันยายน (UTC) และในคืนเดียวกันก็เผยแพร่แพ็กเกจใหม่ชื่อ imgdecode จากบัญชี malfexteste8 ซึ่งมียอดดาวน์โหลด 979 ครั้งและยังอยู่บน npm ณ วันที่รายงาน เวอร์ชันล่าสุดคือ 1.0.3 (11 ตุลาคม) ซึ่งตัดการพึ่งพาแพ็กเกจ MALFEX ตัวอื่นออกทั้งหมด ส่วน imgbundle ถูกถอดเมื่อ 7 ตุลาคม และ cdn-img-fetch ถูกถอดเมื่อ 8 ตุลาคม

runhelper ทำทีเป็นเครื่องมือช่วยรันไบนารีจากโปรเจกต์ Node.js แต่หน้าที่จริงคือหาไฟล์ cdn-img-fetch/.runtime/rt.jpg ดึง shellcode ที่ซ่อนอยู่ออกมา คัดลอกเข้าหน่วยความจำที่รันได้ และเรียกผ่าน Koffi ซึ่งเป็นโมดูล FFI ของ Node.js เมื่อ runhelper ถูกถอดไปหกชั่วโมง ผู้โจมตีก็ย้ายตรรกะเดียวกันเข้าไปไว้ใน imgdecode ซึ่งไฟล์ JavaScript มีเพียง 9 บรรทัด ทำหน้าที่โหลด DLL ที่คอมไพล์เป็น native addon ของ Node.js แบบ 64 บิต (MSVC) เมื่อโปรแกรม Node.js เรียก require('imgdecode') จาก console ของ Windows DLL จะตรวจว่ากำลังรันในเทอร์มินัลของนักพัฒนาหรือไม่ จากนั้นดึงไฟล์ banner.jpg จาก GitHub repository cavecrew/proj ถอดรหัส payload ที่ฝังไว้ด้วยคีย์ nif-runtime-2027 แล้ว inject เข้าโปรเซส dllhost.exe ใหม่ SafeDep สังเกตว่าหลังถอดรหัส DLL จะตรวจไบต์แรก หากตรงกับลายเซ็น JPEG หรือ PNG ก็จะหยุดทำงาน ซึ่งอนุมานได้ว่าผู้โจมตีใช้เป็นสวิตช์ปิดตัวโหลดจากระยะไกล

บัญชี GitHub cavecrew ถูกปิดไปแล้ว แต่ภาพจาก Internet Archive ลงวันที่ 6 ตุลาคม แสดงว่าไฟล์ภาพนั้นบรรจุตัวดาวน์โหลดภาษา Go ตัวเดียวกับที่ดึงตัวขโมยข้อมูลและ RAT movinlike จาก 104.234.65[.]75:700 ส่วนแอป Node.js มีไฟล์ .env ที่ระบุที่อยู่ C2 104.234.65[.]75:7007 และ license key ของ MALFEX ซึ่งบ่งชี้ว่าใช้ระบบ builder หรือระบบไลเซนส์ในการสร้าง payload มัลแวร์ตรวจหาเครื่องเสมือน แซนด์บ็อกซ์ และเครื่องมือวิเคราะห์อย่าง Process Monitor และ Wireshark ก่อนเก็บไฟล์ seed phrase และไฟล์นามสกุล .kdbx, .pem, .ppk, .env ข้อมูลจากเบราว์เซอร์ตระกูล Chromium, Discord, Telegram, กระเป๋าคริปโต และแอปเกม (Steam, Epic Games, Riot, Battle.net, Minecraft, Ubisoft) และเปิด WebSocket รับคำสั่งรัน shell ส่งไฟล์ ควบคุมโปรเซส อ่านคลิปบอร์ด จับภาพหน้าจอ และควบคุมเมาส์กับแป้นพิมพ์ การคงอยู่ใช้ Registry Run key และ scheduled task ชื่อ MicrosoftEdgeUpdateService นักพัฒนาที่เคยติดตั้งแพ็กเกจเหล่านี้ควรถือว่าเครื่อง Windows อาจถูกยึด แยกเครื่องออกจากเครือข่าย ตรวจรายการคงอยู่ เปลี่ยนข้อมูลรับรองทั้งหมด และย้ายเงินไปกระเป๋าใหม่หากเคยเก็บ seed phrase ไว้ในเครื่อง

ผลกระทบ

ผู้ที่เสี่ยงคือนักพัฒนาและเครื่อง build ที่ติดตั้งแพ็กเกจของแคมเปญโดยตรง โดยเฉพาะ function-flag ที่ยังดาวน์โหลดได้และไม่มีการแจ้งเตือน เครื่องนักพัฒนามักมีข้อมูลที่มีค่าสูง ทั้ง session ของเบราว์เซอร์ที่ล็อกอินระบบงาน โทเคนของบริการคลาวด์ ข้อมูลเข้าถึงรีโพสิทอรี และกระเป๋าเงินคริปโต การติด RAT ที่มี shell ระยะไกลและ hidden desktop จึงอาจเป็นจุดเริ่มต้นให้ผู้โจมตีเข้าถึงระบบขององค์กรต่อได้

แม้ขอบเขตจะจำกัดเพราะไม่มีแพ็กเกจยอดนิยมพึ่งพาแพ็กเกจเหล่านี้ แต่ข่าวนี้ชี้จุดอ่อนเชิงโครงสร้างของระบบนิเวศ npm สองข้อ ข้อแรกคือแพ็กเกจอันตรายอยู่บน registry ได้นานกว่าหนึ่งปีและมียอดดาวน์โหลดนับหมื่นโดยไม่ถูกตรวจพบ ข้อสองคือองค์กรที่พึ่งเครื่องมือตรวจ dependency ซึ่งอิงฐานข้อมูล advisory อาจรู้สึกปลอดภัยเกินจริง เพราะแพ็กเกจที่ไม่มี advisory จะผ่านการตรวจได้

คำแนะนำ

  • ตรวจ package.json, lockfile และ node_modules ของทุกโครงการและเครื่อง build ว่ามี function-flag, function-color, cdn-img-fetch, tlxbnhd, tldriver, mxdriver, img-to-native หรือ native-runner หรือไม่ หากพบให้ถอดออกและถือว่าเครื่องนั้นอาจติดเชื้อ
  • เครื่อง Windows ที่เคยติดตั้งแพ็กเกจเหล่านี้ ให้สแกนหามัลแวร์ ตรวจโปรเซสและการเชื่อมต่อขาออกที่ผิดปกติ และเปลี่ยนรหัสผ่าน โทเคน และ session ที่เก็บในเบราว์เซอร์และ Discord รวมถึงย้ายทรัพย์สินคริปโตออกจากกระเป๋าเงินที่อาจรั่ว
  • อย่าพึ่งฐานข้อมูล advisory เพียงอย่างเดียว ใช้เครื่องมือที่วิเคราะห์พฤติกรรมของแพ็กเกจ เช่น การเรียกเครือข่ายหรือรันโค้ดตอนติดตั้งและตอนโหลด
  • ติดตั้งแพ็กเกจด้วย lockfile ที่ตรึงเวอร์ชัน ใช้ registry ภายในหรือ proxy ที่คัดกรองแพ็กเกจ และพิจารณา --ignore-scripts ในงาน CI โดยตระหนักว่าไม่ป้องกันโค้ดที่รันตอนโหลด
  • ตรวจสอบแพ็กเกจใหม่ที่มีผู้ดูแลน้อย ยอดดาวน์โหลดต่ำ หรือชื่อทั่วไปจนคล้ายแพ็กเกจยูทิลิตี้ ก่อนเพิ่มเข้าโครงการ

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