สรุปสั้น

บริษัท Amazon ได้เชื่อมโยงเหตุการณ์ยึดแพ็กเกจ npm ชื่อ debug และ chalk เมื่อเดือนกันยายน 2568 เข้ากับเกาหลีเหนือ หลังจากที่ตลอดสิบเดือนที่ผ่านมาเหตุการณ์นี้ถูกบันทึกไว้ในสาธารณะเพียงว่าเป็นการขโมยคริปโต โดยผู้ดูแลแพ็กเกจถูกฟิชชิงผ่านโดเมน npm ปลอมที่ตั้งชื่อคล้ายของจริง แล้วมีการฝังสคริปต์ดูดกระเป๋าเงินคริปโตลงในแพ็กเกจอย่างน้อย 18 ตัว ซึ่งรวมกันมียอดดาวน์โหลดมากกว่า 2 พันล้านครั้งต่อสัปดาห์ ทั้งนี้รายงานต้นฉบับของบริษัท Aikido และบริษัท Wiz ไม่ได้ระบุว่าเหตุการณ์นี้เชื่อมโยงกับเกาหลีเหนือแต่อย่างใด

ในงานวิจัยที่เผยแพร่เมื่อวันที่ 29 กรกฎาคม ทีมข่าวกรองภัยคุกคามของ Amazon ประเมินด้วยความเชื่อมั่นระดับกลางว่ากลุ่มที่อยู่เบื้องหลังการเจาะแพ็กเกจ axios เมื่อเดือนมีนาคม 2569 คือกลุ่มเดียวกับที่อยู่เบื้องหลังเหตุการณ์เดือนกันยายน 2568 นอกจากนี้ Amazon ยังระบุว่ากลุ่มดังกล่าวเคยฝังไฟล์ที่ถูกดัดแปลงไว้ในแพ็กเกจเล็กๆ ชื่อ typo-crypto ตั้งแต่เดือนมีนาคม 2568 ซึ่งเป็นเวลาหนึ่งปีเต็มก่อนจะไปถึง axios โดยนักวิเคราะห์พบมันระหว่างไล่ตามโดเมนที่จดทะเบียนในปี 2568 ที่โผล่ขึ้นมาระหว่างการสอบสวนกรณี axios แม้ยอดดาวน์โหลดจะต่ำ แต่ Amazon ระบุว่าเทคนิคการปฏิบัติงาน “สอดคล้องกับสิ่งที่เราสังเกตเห็นในภายหลังในการโจมตีแพ็กเกจที่ได้รับความนิยมมากกว่า” และบริษัทตีความแพ็กเกจนี้ว่าเป็นการทดลองซ้อมมือ ทั้งนี้ Amazon ไม่ได้รายงานการบุกรุกใหม่แต่อย่างใด สิ่งที่เปลี่ยนไปมีเพียงการระบุตัวผู้อยู่เบื้องหลังเท่านั้น

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

เว็บไซต์ The Hacker News รายงานเมื่อวันที่ 30 กรกฎาคม 2569 ว่า การระบุตัวผู้กระทำของ Amazon ครอบคลุมแพ็กเกจที่ระบุชื่อได้ 4 ตัวใน 3 แคมเปญภายในระยะเวลาสิบสองเดือน โดยบริษัทระบุว่าทั้งสามแคมเปญเริ่มต้นด้วยวิธีเดียวกัน คือใช้วิศวกรรมสังคมกับผู้ดูแลแพ็กเกจที่คนเชื่อถือ แล้วจึงเผยแพร่อัปเดตที่มีมัลแวร์ อย่างไรก็ตามหลักฐานที่ Amazon เปิดเผยออกมานั้นบางกว่าคำกล่าวอ้าง เพราะโพสต์ของบริษัทอ้างถึงเทคนิคการปฏิบัติงานที่ใช้ร่วมกันข้ามแคมเปญ ทั้งแพ็กเกจที่ถูกดัดแปลง การใช้ post-install hook การใช้โค้ดซ้ำ และตัวบ่งชี้เซิร์ฟเวอร์สั่งการที่ทับซ้อนกัน แต่ไม่ได้ระบุว่าหลักฐานชิ้นใดโยงกับเหตุการณ์ใด

ช่องว่างนี้สำคัญที่สุดกับกรณี debug และ chalk ซึ่งบริษัท Aikido และบริษัท Wiz เคยบันทึกไว้ว่าเป็นตัวดักจับฝั่งเบราว์เซอร์ที่ hook ฟังก์ชัน fetch, XMLHttpRequest และ API ของกระเป๋าเงินคริปโต เพื่อเขียนทับที่อยู่ปลายทางของธุรกรรมก่อนที่ผู้ใช้จะกดเซ็น โดยไม่ทิ้งกลไกฝังตัวไว้บนเครื่องเลย และต่างจากเพย์โหลดของ axios ตรงที่โค้ดชุดนี้ไม่ได้พึ่งพา post-install hook ของ npm เช่นเดียวกับ typo-crypto ที่รอทริกเกอร์แทนการรันทันที

ในส่วนของชื่อเรียกกลุ่ม บริษัท Google ได้ระบุอย่างเป็นอิสระว่าเหตุการณ์ axios เป็นฝีมือของกลุ่ม UNC1069 โดยอ้างถึงแบ็กดอร์ WAVESHAPER.V2 และโหนด AstrillVPN ที่กลุ่มนี้เคยใช้มาก่อน ขณะที่บริษัท Microsoft ระบุว่าการเจาะครั้งเดียวกันเป็นฝีมือของ Sapphire Sleet ซึ่งบริษัทระบุว่าทับซ้อนกับกิจกรรมที่ผู้ให้บริการรายอื่นติดตามในชื่อ UNC1069, STARDUST CHOLLIMA, BlueNoroff, Alluring Pisces, CageyChameleon และ CryptoCore ดังนั้นช่องว่างเรื่องชื่อเรียกจึงคลี่คลายแล้ว แต่ช่องว่างด้านหลักฐานของ Amazon ยังไม่คลี่คลาย เพราะในบรรดาแหล่งข้อมูลที่ตรวจสอบ ไม่มีงานวิจัยของผู้ให้บริการรายอื่นที่ระบุชื่อผู้กระทำสำหรับกรณี debug, chalk และ typo-crypto เลย ขณะที่การระบุตัวผู้กระทำของ axios เกิดขึ้นภายในสองวันหลังการเจาะ ส่วนอีกสองกรณีถูกระบุตัวหลังเหตุการณ์ผ่านไปแล้วสิบเดือนและสิบหกเดือนตามลำดับ โดย Amazon ตีความรูปแบบทั้งหมดว่ามีแรงจูงใจทางการเงิน ขณะที่บริษัท Socket เคยแจ้งกับ The Hacker News ในเวลานั้นว่ากระเป๋าเงินจากปฏิบัติการเดือนกันยายนทำเงินได้เพียงประมาณ 600 ดอลลาร์สหรัฐฯ เท่านั้น

ประเด็นที่ทำให้เรื่องซับซ้อนขึ้นคือ เมื่อ The Hacker News ตรวจสอบ registry เมื่อวันที่ 30 กรกฎาคม 2569 พบว่า typo-crypto เวอร์ชัน 4.3.0 ยังคงถูกเผยแพร่อยู่และยังติดตั้งได้ โดยแพ็กเกจไม่ได้ประกาศสคริปต์ติดตั้ง การดึงมาจึงไม่ได้รันอะไรด้วยตัวเอง และไฟล์ tarball ที่ npm ให้บริการก็ตรงกับค่าแฮชความถูกต้องของ registry เอง อีกทั้ง registry แสดงเพียงเวอร์ชันเดียวที่ถูกสร้างและเผยแพร่ห่างกันเพียง 204 มิลลิวินาทีเมื่อวันที่ 31 มีนาคม 2568 และบัญชีที่เผยแพร่ก็ไม่ตรงกับชื่อนักพัฒนาในฟิลด์ author ของแพ็กเกจ ส่วนคำอธิบายและคีย์เวิร์ดก็คัดลอกมาจาก crypto-js โดยตั้งเลขเวอร์ชันล้ำหน้าเวอร์ชันล่าสุดของ crypto-js เองไปหนึ่งรุ่น ซึ่งบันทึกลักษณะนี้ไม่เข้ากับรูปแบบ “ผู้ดูแลถูกยึดบัญชีแล้วตามด้วยอัปเดตอันตราย” ที่ Amazon ใช้อธิบายทั้งสามแคมเปญ แต่เข้ากับแพ็กเกจที่ถูกสร้างขึ้นมาเพื่อปลอมเป็น crypto-js ตั้งแต่การเผยแพร่ครั้งแรกมากกว่า

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

ไฟล์อันตรายที่ Amazon อธิบายมีชื่อว่า core.js ซึ่งปลอมตัวเป็นแพ็กเกจ core-js ของแท้ภายใน repository โดยมันจะทำงานเมื่อได้รับค่าแฮชนำเข้าที่ขึ้นต้นด้วย 0098273 จากนั้นจะดึงเพย์โหลดขั้นที่สองซึ่งเจาะจงตามระบบปฏิบัติการมาจากเซิร์ฟเวอร์สั่งการที่ฝังไว้แบบตายตัว โดยมีการพรางด้วย base64 ซ้อนบนรหัสลับแบบ XOR ที่ใช้กุญแจ 01042025 ส่วนตัวบ่งชี้ฝั่งเครือข่ายคือโดเมน npmjs[.]store และหมายเลขไอพี 216[.]74[.]123[.]126

อย่างไรก็ตาม The Hacker News ตรวจสอบระเบียน OSV ที่ Amazon อ้างถึงโดยไม่ได้ระบุเลขเวอร์ชัน แล้วพบว่า MAL-2026-3400 ระบุถึง typo-crypto@4.3.0 ให้เครดิตแก่ Amazon Inspector และถูกเผยแพร่ตั้งแต่วันที่ 8 พฤษภาคม ซึ่งเป็นเวลาเกือบสามเดือนก่อนการประกาศระบุตัวผู้กระทำครั้งนี้ นอกจากนี้ไฟล์จริงตรงกับโพสต์ของ Amazon ในแง่หนึ่ง คือ core.js บรรจุทั้งค่าทริกเกอร์และกุญแจ XOR ตามที่ Amazon ระบุจริง แต่ค่าแฮชกลับไม่ตรงกัน เพราะ Amazon ระบุค่า SHA256 ของ core.js ไว้เป็นค่าแฮชของทั้งแพ็กเกจ และค่าแฮชของ core.js ที่บริษัทระบุก็ไม่ปรากฏในไฟล์ใดเลยใน tarball ซึ่งอาจเป็นได้ทั้งตัวบ่งชี้ที่ติดป้ายผิดหรือค่าแฮชที่มาจากไฟล์คนละชุด โดยโพสต์ของ Amazon ไม่ได้ระบุว่ากรณีใด

ด้านบริษัท Aikido ซึ่งเป็นผู้ตรวจพบการบุกรุกเมื่อเดือนกันยายน 2568 โต้แย้งว่า Amazon ไม่ใช่แหล่งเดียวที่เชื่อมโยงเรื่องนี้ โดยแจ้งกับ The Hacker News ว่าบริษัทได้เชื่อมโยงการโจมตีครั้งนั้นรวมถึงกรณี axios และ Mastra เข้ากับเกาหลีเหนือมาระยะหนึ่งแล้ว ทั้งในบล็อก การบรรยายในงานประชุม และพอดแคสต์ และระบุว่าความเชื่อมโยงนี้เป็นความรู้ทั่วไปในแวดวงความปลอดภัยห่วงโซ่อุปทาน พร้อมเรียกการค้นพบนี้ว่าเป็น “ข่าวเก่า” เมื่อถูกถามว่าอะไรเชื่อมโยงเหตุการณ์เหล่านี้เข้าด้วยกัน Aikido อ้างถึงการทับซ้อนของเซิร์ฟเวอร์สั่งการระหว่างการโจมตี axios กับ Mastra และอธิบายว่ากรณี debug และ chalk เป็น “สไตล์เกาหลีเหนือแบบคลาสสิก” ในเชิงวิธีการ พร้อมยอมรับว่าไม่ได้วิเคราะห์ typo-crypto เพราะเริ่มสแกน npm หลังจากเดือนมีนาคม 2568 อีกทั้งยังยืนยันเรื่องความแตกต่างของกลไกด้วยว่า การโจมตี debug และ chalk ไม่ได้ใช้สคริปต์วงจรชีวิตหรือสคริปต์ติดตั้งเลย ขณะที่การโจมตี axios และ Mastra ใช้

ในด้านมาตรการของ registry เอง npm ได้ปล่อยเวอร์ชัน 12 เมื่อวันที่ 8 กรกฎาคม โดยปิดการทำงานของสคริปต์วงจรชีวิตของ dependency เป็นค่าเริ่มต้น ซึ่งตัดเส้นทาง post-install ที่ axios ใช้ออกไป แต่ไม่ได้ปิดเส้นทางการยึดบัญชีผู้ดูแลที่อยู่เบื้องหลังทั้ง debug, chalk และ axios โดยนางสาว Sarah Gooding ซึ่งเขียนให้กับบริษัท Socket ตั้งข้อสังเกตในบทวิจารณ์รุ่นนี้ว่า “ทั้งการบล็อกสคริปต์ติดตั้งและ OIDC ต่างก็ไม่ได้ปิดช่องทางเข้านั้น” ต่อมาในวันที่ 28 กรกฎาคม npm ได้เริ่มสแกนหามัลแวร์ในแพ็กเกจที่เผยแพร่ใหม่ก่อนที่จะติดตั้งได้ แต่การสแกนนี้ใช้กับการเผยแพร่ใหม่เท่านั้น ไม่ครอบคลุมแพ็กเกจที่อยู่บน registry อยู่แล้ว

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

แพ็กเกจ debug และ chalk เป็น dependency พื้นฐานที่แทบทุกโปรเจกต์ Node.js ในไทยดึงมาใช้โดยอ้อมผ่านไลบรารีอื่น ไม่ว่าจะเป็นเว็บแอปของธนาคาร ระบบอีคอมเมิร์ซ แดชบอร์ดภายในองค์กร หรือเครื่องมือของทีมพัฒนาเอง นักพัฒนาไทยส่วนใหญ่จึงเคยดึงแพ็กเกจเหล่านี้เข้าโปรเจกต์โดยไม่รู้ตัวและไม่เคยตรวจสอบ ซึ่งแม้เหตุการณ์จริงจะผ่านมาแล้วสิบเดือนและ Amazon ยืนยันว่าไม่มีการบุกรุกใหม่ แต่ประเด็นสำคัญคือขอบเขตการตอบสนองสำหรับ debug และ chalk ยังคงเดิม นั่นคือต้องตรวจ bundle ฝั่งเบราว์เซอร์และแคชที่อาจยังมีโค้ดชุดเก่าค้างอยู่ โดยเฉพาะระบบที่ build ไว้ในช่วงเดือนกันยายน 2568 แล้วยังไม่เคย build ใหม่

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

คำแนะนำ

  • ตรวจสอบว่าโปรเจกต์เคยดึงแพ็กเกจ debug, chalk เวอร์ชันที่ถูกฝังโค้ดในช่วงเดือนกันยายน 2568 หรือ axios เวอร์ชันที่ถูกเจาะเมื่อเดือนมีนาคม 2569 หรือไม่ และ build ใหม่พร้อมล้างแคชของ bundle ฝั่งเบราว์เซอร์ทั้งหมด
  • ห้ามติดตั้งแพ็กเกจ typo-crypto และให้เพิ่มเข้าบัญชีปฏิเสธ (deny list) ภายใน เพราะยังเผยแพร่และติดตั้งได้อยู่บน npm
  • ตรวจหาการติดต่อกับโดเมน npmjs[.]store และไอพี 216[.]74[.]123[.]126 ในล็อกของเครือข่ายและเครื่องของนักพัฒนา
  • ล็อกเวอร์ชัน dependency ด้วย lockfile และเปิดใช้การตรวจสอบ integrity hash พร้อมทั้งพิจารณาใช้ registry ภายในองค์กรที่มีการหน่วงเวลาก่อนอนุญาตให้ดึงแพ็กเกจใหม่
  • อัปเกรดเป็น npm 12 ขึ้นไปเพื่อให้สคริปต์วงจรชีวิตของ dependency ถูกปิดโดยค่าเริ่มต้น แต่อย่าถือว่าเพียงพอ เพราะไม่ได้ปิดช่องทางการยึดบัญชีผู้ดูแล
  • บังคับใช้ MFA แบบต้านฟิชชิงกับบัญชีผู้ดูแลแพ็กเกจทุกบัญชีขององค์กร และฝึกอบรมทีมพัฒนาให้ระวังโดเมนที่ตั้งชื่อคล้าย registry ของจริง
  • สำหรับผู้ให้บริการสินทรัพย์ดิจิทัล ควรเพิ่มการตรวจสอบความถูกต้องของที่อยู่ปลายทางฝั่งเซิร์ฟเวอร์และแสดงให้ผู้ใช้ยืนยันซ้ำ เพื่อลดผลกระทบจากโค้ดฝั่งเบราว์เซอร์ที่ถูกดัดแปลง

Indicators of Compromise (IoCs)

ประเภทตัวบ่งชี้คำอธิบาย
Domainnpmjs[.]storeเซิร์ฟเวอร์สั่งการที่ฝังไว้ในไฟล์ core.js (defang แล้ว)
IP216[.]74[.]123[.]126ไอพีปลายทางที่ใช้ดึงเพย์โหลดขั้นที่สอง (defang แล้ว)
ไฟล์core.jsไฟล์อันตรายที่ปลอมเป็นแพ็กเกจ core-js ภายใน repository
แพ็กเกจtypo-crypto@4.3.0แพ็กเกจปลอมที่ยังเผยแพร่อยู่บน npm ระเบียน OSV คือ MAL-2026-3400
ค่าทริกเกอร์0098273ค่าแฮชนำเข้าที่ขึ้นต้นด้วยสตริงนี้จะกระตุ้นการทำงานของเพย์โหลด
กุญแจเข้ารหัส01042025กุญแจ XOR ที่ใช้พรางเพย์โหลดร่วมกับ base64

ตัวบ่งชี้ทั้งหมด defang แล้วเพื่อความปลอดภัย ต้องแปลงกลับก่อนนำไปใช้ในระบบตรวจจับ

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