สรุปสั้น
นักวิจัยด้านความมั่นคงปลอดภัยของบริษัท Blackpoint Cyber เปิดเผยเฟรมเวิร์กโหลดเดอร์ที่เขียนด้วยภาษา Go ซึ่งไม่เคยมีการบันทึกไว้มาก่อน ใช้ชื่อว่า HollowFrame พร้อมกับมัลแวร์ตระกูลใหม่ที่เขียนด้วยภาษา Rust ชื่อ Matryoshka โดยทั้งคู่ถูกใช้ร่วมกันในเหตุบุกรุกที่พุ่งเป้าไปยังเครื่องปลายทาง 2 เครื่องของสำนักงานกฎหมายแห่งหนึ่งซึ่งไม่ได้มีการเปิดเผยชื่อ ลูกโซ่การโจมตีเริ่มจากข้อความหลอกลวงแบบเจาะจงเป้าหมายที่แนบลิงก์ไปยังไฟล์บีบอัดที่เข้ารหัสไว้ ภายในบรรจุไฟล์ทางลัดของ Windows หรือไฟล์ LNK ที่ปลอมชื่อเป็น “Case Documents” เพื่อหลอกให้ผู้รับซึ่งทำงานกับเอกสารคดีเป็นประจำอยู่แล้วคลิกเปิดโดยไม่ทันคิด
เมื่อไฟล์ถูกเปิด ลำดับการติดเชื้อหลายขั้นก็เริ่มทำงาน ตั้งแต่การยกระดับสิทธิ์ การลดทอนการป้องกันของ Microsoft Defender ไปจนถึงการดาวน์โหลดเพย์โหลดเพิ่มเติมเข้ามา ตัว HollowFrame ถูกเรียกขึ้นมาทำงานผ่านคู่ DLL side-loading ที่ประกอบด้วยไฟล์ python.exe ของแท้กับไฟล์ python311.dll ปลอม ส่วน Matryoshka มี 2 เวอร์ชัน เวอร์ชันแรกติดต่อเซิร์ฟเวอร์ควบคุมผ่าน HTTP และรับคำสั่งมารัน ส่วนอีกเวอร์ชันหนึ่งใช้ GitHub เป็นช่องทางสั่งการ ครอบคลุมทั้งการส่งสัญญาณ beacon การรับงาน การสำรวจระบบ การรับส่งไฟล์ และการส่งเพย์โหลดขั้นถัดไป
นาย Nevan Beal และนาย Sam Decker นักวิจัยของบริษัท Blackpoint Cyber ระบุว่า “HollowFrame และ Matryoshka เมื่อทำงานร่วมกันได้มอบจุดยืนแบบฝังตัวให้ผู้โจมตี ทั้งการรันคำสั่งจากระยะไกล การสำรวจ Active Directory การรับส่งไฟล์ และการติดตั้งเครื่องมือชุดถัดไป” พร้อมเสริมว่า “ความสามารถเหล่านี้สามารถรองรับการขโมยข้อมูลรับรอง การเคลื่อนตัวด้านข้าง และการยึดครองโดเมนในวงกว้างผ่านเครื่องมือเพิ่มเติมที่ส่งเข้ามาหลังเจาะระบบสำเร็จ” อย่างไรก็ตามยังไม่มีการระบุว่าใครอยู่เบื้องหลังปฏิบัติการนี้ ไม่มีการเปิดเผยชื่อสำนักงานกฎหมายที่ตกเป็นเหยื่อ และรายงานก็ไม่ได้ยืนยันว่าข้อมูลถูกขโมยออกไปแล้วหรือไม่
รายละเอียดข่าว
เว็บไซต์ The Hacker News รายงานเมื่อวันที่ 31 กรกฎาคม 2569 ว่า นักวิจัยด้านความมั่นคงปลอดภัยได้เปิดเผยรายละเอียดของเฟรมเวิร์กโหลดเดอร์ภาษา Go ที่ไม่เคยถูกบันทึกไว้มาก่อนชื่อ HollowFrame และมัลแวร์ตระกูลภาษา Rust ที่ถูกติดตามในชื่อ Matryoshka โดยอ้างอิงการวิเคราะห์ของบริษัท Blackpoint Cyber
ตามรายงาน เหตุบุกรุกครั้งนี้เป็นการโจมตีหลายขั้นตอนที่พุ่งเป้าไปยังเครื่องปลายทาง 2 เครื่องของสำนักงานกฎหมายแห่งหนึ่ง โดยจุดเริ่มต้นคือข้อความหลอกลวงแบบเจาะจงเป้าหมายที่แนบลิงก์ไปยังไฟล์บีบอัดที่ถูกเข้ารหัสไว้ ซึ่งเป็นเทคนิคที่ช่วยให้ไฟล์รอดจากการสแกนของเกตเวย์อีเมลและระบบตรวจไฟล์แนบ เพราะระบบเหล่านั้นเปิดไฟล์ที่มีรหัสผ่านไม่ได้
ภายในไฟล์บีบอัดคือไฟล์ทางลัด LNK ที่ตั้งชื่อว่า “Case Documents” ซึ่งเป็นการเลือกเหยื่อล่อที่เข้ากับบริบทของเป้าหมายอย่างตรงจุด เพราะพนักงานสำนักงานกฎหมายเปิดเอกสารคดีจากภายนอกเป็นงานประจำอยู่แล้ว เมื่อไฟล์ถูกเปิด มันจะกระตุ้นลำดับคำสั่งที่ใช้ PowerShell ไปดึงองค์ประกอบขั้นถัดไปจากเซิร์ฟเวอร์ระยะไกลที่หมายเลข 2.26.252[.]84
ลำดับถัดจากนั้นครอบคลุมทั้งการยกระดับสิทธิ์ การลดทอนความสามารถป้องกันของ Microsoft Defender และการดาวน์โหลดเพย์โหลดเพิ่ม ก่อนจะนำไปสู่การติดตั้ง HollowFrame ผ่านเทคนิค DLL side-loading ที่ใช้ไฟล์ python.exe ซึ่งเป็นไบนารีของแท้ จับคู่กับไฟล์ python311.dll ที่ถูกดัดแปลง วิธีนี้ทำให้โค้ดอันตรายถูกโหลดเข้าไปในโปรเซสของโปรแกรมที่มีลายเซ็นถูกต้อง จึงกลืนไปกับกิจกรรมปกติของเครื่อง
จุดที่นักวิจัยเน้นเป็นพิเศษคือการออกแบบให้แต่ละขั้นตอนเปิดเผยพฤติกรรมอันตรายน้อยที่สุด บริษัท Blackpoint Cyber ระบุว่า “ตลอดทั้งลูกโซ่ แต่ละขั้นตอนลดปริมาณพฤติกรรมอันตรายที่มองเห็นได้ในขั้นก่อนหน้า การแยกส่วนแบบนี้ทำให้การระบุตัวผู้ก่อเหตุและการตรวจจับซับซ้อนขึ้น เพราะไม่มีองค์ประกอบใดเพียงชิ้นเดียวที่บรรจุตรรกะการติดเชื้อทั้งหมดหรือภาพรวมของเซิร์ฟเวอร์ควบคุมเอาไว้ครบ”
ในส่วนของบัญชี GitHub ที่ถูกใช้เป็นช่องทางสั่งการ การสอบถามผ่าน GitHub API พบว่าบัญชีดังกล่าวถูกสร้างขึ้นเมื่อวันที่ 6 มกราคม 2566 และข้อมูลโปรไฟล์ถูกแก้ไขล่าสุดเมื่อวันที่ 7 มิถุนายน 2569 ซึ่งบ่งชี้ว่าบัญชีนี้ถูกเตรียมไว้ล่วงหน้าเป็นเวลานานก่อนถูกนำมาใช้จริง
ต้องระบุให้ชัดว่ารายงานฉบับนี้ยังไม่ทราบว่าใครอยู่เบื้องหลังกิจกรรมดังกล่าว ไม่ได้เปิดเผยชื่อสำนักงานกฎหมายที่ถูกโจมตี ไม่ได้ระบุประเทศของเหยื่อ และไม่ได้ยืนยันว่ามีข้อมูลใดถูกขโมยออกไปแล้วบ้าง ขอบเขตที่ชัดเจนคือเครื่องปลายทาง 2 เครื่องเท่านั้น ผู้อ่านจึงไม่ควรตีความว่าเป็นแคมเปญขนาดใหญ่ที่กระจายตัวไปทั่ว

วิธีการโจมตี
HollowFrame ทำหน้าที่เป็นทั้งโหลดเดอร์แบบโมดูลและเฟรมเวิร์กสำหรับฝังตัว โดยรองรับหลายวิธีในการโหลดองค์ประกอบเสริมเข้ามาทำงาน จุดที่ทำให้มันยากต่อการวิเคราะห์คือชุดการตรวจสอบต่อต้านการวิเคราะห์ก่อนเริ่มทำงานจริง มัลแวร์จะประเมินว่าตัวเองกำลังรันอยู่ในแซนด์บ็อกซ์หรือไม่จากปัจจัย 4 อย่าง ได้แก่ ระยะเวลาที่ระบบเปิดใช้งานมา ปริมาณหน่วยความจำที่ติดตั้งอยู่ จำนวนไฟล์ในโปรไฟล์ของผู้ใช้ และการเคลื่อนไหวของเคอร์เซอร์เมาส์ เกณฑ์ทั้งสี่นี้ถูกเลือกมาอย่างแม่นยำ เพราะเครื่องวิเคราะห์อัตโนมัติมักเพิ่งบูตขึ้นมาใหม่ มีหน่วยความจำน้อย มีไฟล์ในโปรไฟล์ผู้ใช้ไม่กี่ไฟล์ และไม่มีคนขยับเมาส์จริง ส่วนกลไกฝังตัวอาศัยการสร้าง scheduled task ในระบบ
ตัวโหลดเดอร์ภาษา Go ฝังคอนเทนเนอร์ที่เข้ารหัสไว้ภายใน เมื่อถึงเวลาก็จะคลายออกมาเพื่อเริ่มลูกโซ่ DLL side-loading รอบที่สอง สำหรับติดตั้ง Matryoshka ในรูปของไฟล์ version.dll ซึ่งเป็นแบ็กดอร์ภาษา Rust ที่ติดต่อกับเซิร์ฟเวอร์ควบคุมที่ 45.158.196[.]184:8888 ผ่านโพรโทคอล HTTP เพื่อเปิดเชลล์บนเครื่องเหยื่อและส่งเครื่องมือเพิ่มเติมเข้ามา
องค์ประกอบที่น่าสนใจที่สุดคือไฟล์ DLL อีกตัวหนึ่งชื่อ wtsapi32.dll ที่ถูกกู้คืนมาจากกิจกรรมชุดเดียวกัน ซึ่งถูกระบุว่าเป็น Matryoshka อีกเวอร์ชันหนึ่งที่ใช้ที่เก็บโค้ดส่วนตัวบน GitHub ชื่อ adioziaete/memio เป็นช่องทางรับคำสั่งเฉพาะของเหยื่อแต่ละราย ส่งผลลัพธ์กลับ และดึงเพย์โหลดเพิ่ม
บริษัท Blackpoint Cyber อธิบายโครงสร้างของที่เก็บโค้ดดังกล่าวว่า “ที่เก็บโค้ดทำหน้าที่เป็นชุดกล่องจดหมายรายเครื่อง โดยเหยื่อแต่ละรายถูกกำหนดไดเรกทอรีเฉพาะในรูปแบบ computer_username” พร้อมระบุว่าไดเรกทอรีเหล่านี้บรรจุไฟล์ beacon.json, cmd.json, result.json และในบางกรณีมีโครงสร้าง upload สำหรับส่งไฟล์ด้วย และเสริมว่า “โครงสร้างแบบนี้ทำให้ผู้ควบคุมสามารถบริหารการสั่งงานและผลลัพธ์ของเครื่องปลายทางแต่ละเครื่องผ่าน GitHub ได้โดยไม่ต้องดูแลเซิร์ฟเวอร์สั่งการของตัวเอง ขณะเดียวกันก็ทิ้งประวัติการเปลี่ยนแปลงของที่เก็บโค้ดไว้เป็นเวอร์ชัน เว้นแต่จะมีการลบ commit ที่เกี่ยวข้องหรือลบที่เก็บโค้ดนั้นทิ้ง”
การเลือกใช้ GitHub เป็นเซิร์ฟเวอร์ควบคุมมีข้อได้เปรียบชัดเจนสำหรับผู้โจมตี เพราะทราฟฟิกที่วิ่งไปยังโดเมนของ GitHub เป็นสิ่งที่พบได้ปกติในองค์กรแทบทุกแห่ง ทั้งยังเข้ารหัสด้วย TLS และมักถูกจัดอยู่ในหมวดที่ระบบกรองเว็บอนุญาตให้ผ่านโดยไม่ตั้งคำถาม ผู้โจมตีจึงไม่ต้องเช่าเซิร์ฟเวอร์ ไม่ต้องจดโดเมน และไม่ต้องกังวลว่าโครงสร้างพื้นฐานจะถูกถอดถอน
ผลกระทบ
ผลกระทบที่หนักที่สุดของการออกแบบแบบนี้ตกอยู่กับการตรวจจับและการสืบสวน เพราะเมื่อแต่ละขั้นตอนถูกออกแบบให้ซ่อนพฤติกรรมของขั้นก่อนหน้า ทีมที่เก็บได้เพียงชิ้นส่วนใดชิ้นส่วนหนึ่งจะไม่มีทางเห็นภาพรวม ไฟล์ python311.dll ที่ยึดมาได้จะไม่บอกว่าเซิร์ฟเวอร์ควบคุมปลายทางคือที่ใด และไฟล์ version.dll ก็ไม่บอกว่ามาถึงเครื่องได้อย่างไร การตอบสนองเหตุที่หยุดอยู่แค่การลบไฟล์ที่ตรวจเจอจึงมีโอกาสสูงมากที่จะเหลือช่องทางของผู้โจมตีค้างอยู่ในระบบ
การใช้ GitHub เป็นช่องทางสั่งการยังท้าทายสมมติฐานพื้นฐานของการเฝ้าระวังเครือข่าย เพราะกฎที่มองหาการเชื่อมต่อไปยังโดเมนแปลกหน้าหรือที่อยู่ IP ที่มีชื่อเสียงไม่ดีจะไม่ทำงานเลยในกรณีนี้ องค์กรที่มีนักพัฒนาใช้ GitHub เป็นประจำจะยิ่งแยกทราฟฟิกอันตรายออกจากทราฟฟิกงานได้ยาก สัญญาณที่เหลือให้จับได้จริงจึงเป็นเรื่องของต้นทาง คือเครื่องที่ไม่มีเหตุผลต้องคุยกับ GitHub กลับเริ่มคุยกับ GitHub มากกว่าจะเป็นตัวปลายทางเอง
สำหรับสำนักงานกฎหมายและที่ปรึกษาวิชาชีพ การตกเป็นเป้าหมายไม่ใช่เรื่องบังเอิญ องค์กรกลุ่มนี้ถือครองข้อมูลของลูกความจำนวนมากรวมไว้ในที่เดียว ทั้งสัญญา ข้อมูลการควบรวมกิจการ ข้อพิพาท และเอกสารที่มีเอกสิทธิ์ทางกฎหมาย การเจาะสำนักงานกฎหมายแห่งเดียวจึงให้ผลตอบแทนเทียบเท่ากับการเจาะลูกความหลายรายพร้อมกัน ขณะที่หลายแห่งมีทีมไอทีขนาดเล็กและใช้อีเมลรับไฟล์จากภายนอกเป็นกระบวนการทำงานหลัก ซึ่งเป็นเงื่อนไขที่เอื้อกับเหยื่อล่อแบบเอกสารคดีอย่างยิ่ง
คำแนะนำ
มาตรการที่ให้ผลตอบแทนสูงที่สุดและทำได้ทันทีคือการปิดกั้นไฟล์ LNK ที่มาจากภายนอกองค์กร ทั้งผ่านนโยบายเกตเวย์อีเมลและผ่านกฎ Attack Surface Reduction บนเอนด์พอยต์ ควบคู่กับการตั้งกฎแจ้งเตือนเมื่อไฟล์ LNK ถูกเปิดแล้วเรียก PowerShell ต่อ ซึ่งเป็นรูปแบบที่แทบไม่มีเหตุผลทางธุรกิจรองรับเลยในเครื่องของผู้ใช้ทั่วไป นอกจากนี้ควรกำหนดนโยบายให้ถือว่าไฟล์บีบอัดที่ใส่รหัสผ่านจนระบบสแกนเปิดดูไม่ได้ เป็นความเสี่ยงที่ต้องตรวจสอบเพิ่ม ไม่ใช่ไฟล์ปกติ
ด้าน DLL side-loading ให้เฝ้าระวังกรณีที่ไบนารีที่มีลายเซ็นถูกต้องอย่าง python.exe ถูกรันจากตำแหน่งที่ผิดปกติ เช่น โฟลเดอร์ชั่วคราวหรือโฟลเดอร์ในโปรไฟล์ผู้ใช้ แล้วโหลดไฟล์ DLL ที่วางอยู่ในไดเรกทอรีเดียวกันแทนที่จะโหลดจากตำแหน่งติดตั้งจริง โดยเน้นชื่อไฟล์ที่พบในเคสนี้อย่าง python311.dll, version.dll และ wtsapi32.dll ที่ปรากฏนอกโฟลเดอร์ระบบ
ให้ยกระดับการเปลี่ยนแปลงการตั้งค่าของ Microsoft Defender เป็นสัญญาณความสำคัญสูง ทั้งการเพิ่มรายการยกเว้น การปิดโมดูลป้องกันแบบเรียลไทม์ และการแก้ไขค่าใน Registry ที่เกี่ยวข้อง เพราะเป็นขั้นตอนที่ผู้โจมตีทำก่อนปล่อยเพย์โหลดหลักในเคสนี้ พร้อมทั้งตรวจสอบ scheduled task ที่ถูกสร้างขึ้นใหม่โดยไม่มีที่มา ซึ่งเป็นกลไกฝังตัวที่ HollowFrame ใช้
สำหรับช่องทางสั่งการผ่าน GitHub ให้สร้างเส้นฐานว่าเครื่องใดในองค์กรมีเหตุผลต้องติดต่อ GitHub บ้าง แล้วแจ้งเตือนเมื่อเครื่องนอกกลุ่มนั้นเริ่มเรียก GitHub API หรือดึงข้อมูลจากที่เก็บโค้ดเป็นจังหวะสม่ำเสมอแบบ beacon โดยเฉพาะเมื่อรูปแบบการเรียกวนอยู่กับไฟล์ JSON ขนาดเล็กซ้ำ ๆ สุดท้าย เมื่อพบการติดเชื้อบนเครื่องใด ให้ถือว่าข้อมูลรับรองบนเครื่องนั้นรั่วทั้งหมด และตรวจสอบ Active Directory ย้อนหลังว่ามีการสำรวจโครงสร้างโดเมนหรือการเคลื่อนตัวด้านข้างเกิดขึ้นแล้วหรือยัง เพราะรายงานระบุชัดว่าความสามารถสำรวจ Active Directory เป็นหนึ่งในสิ่งที่ผู้โจมตีได้ไป
Indicators of Compromise (IoCs)
หมายเหตุ: ที่อยู่ IP ด้านล่างถูก defang (ใส่วงเล็บคั่นจุด) เพื่อป้องกันการเชื่อมต่อโดยไม่ตั้งใจ ให้แปลงกลับเฉพาะภายในระบบข่าวกรองภัยคุกคามที่ควบคุมได้ เช่น MISP, VirusTotal หรือ SIEM ขององค์กร
| ประเภท | ตัวบ่งชี้ | คำอธิบาย |
|---|---|---|
| Staging server | 2.26.252[.]84 | เซิร์ฟเวอร์ที่ PowerShell ดึงองค์ประกอบขั้นถัดไปมาใช้ |
| C2 | 45.158.196[.]184:8888 | เซิร์ฟเวอร์ควบคุมของ Matryoshka ที่ติดต่อผ่าน HTTP |
| GitHub repo | adioziaete/memio | ที่เก็บโค้ดส่วนตัวที่ใช้เป็นช่องทางสั่งการ (บัญชีสร้าง 6 ม.ค. 2566 · แก้โปรไฟล์ล่าสุด 7 มิ.ย. 2569) |
| ไฟล์ | python311.dll | DLL ปลอมที่ถูก side-load ผ่าน python.exe เพื่อเรียก HollowFrame |
| ไฟล์ | version.dll | แบ็กดอร์ Matryoshka เวอร์ชันที่ใช้ HTTP |
| ไฟล์ | wtsapi32.dll | แบ็กดอร์ Matryoshka เวอร์ชันที่ใช้ GitHub เป็นช่องทางสั่งการ |
| เหยื่อล่อ | ไฟล์ LNK ชื่อ Case Documents ในไฟล์บีบอัดที่ใส่รหัสผ่าน | ไฟล์เริ่มต้นลูกโซ่การติดเชื้อ |
| โครงสร้างใน repo | ไดเรกทอรีชื่อ computer_username ที่มี beacon.json, cmd.json, result.json และบางครั้งมี upload | กล่องจดหมายสั่งงานแยกรายเครื่อง |
| Persistence | scheduled task ที่ถูกสร้างใหม่โดยไม่มีที่มา | กลไกฝังตัวของ HollowFrame |
