9 คะแนน โดย GN⁺ 2025-06-30 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • มัลแวร์ มักตรวจสอบการมีอยู่ของฮาร์ดแวร์อย่าง พัดลม CPU เพื่อหลีกเลี่ยงการทำงานในสภาพแวดล้อมเสมือน
  • สามารถตรวจสอบข้อมูลพัดลม CPU ได้ผ่านคลาส Win32_Fan ของ WMI และข้อมูลนี้ถูกเก็บไว้ใน SMBIOS
  • หากต้องการแทรกข้อมูล SMBIOS แบบกำหนดเองใน Xen จำเป็นต้องมีแพตช์และการตั้งค่าเพิ่มเติม โดยต้องกำหนดทั้งตาราง Cooling Device(Type 27) และ Temperature Probe(Type 28)
  • ใน QEMU/KVM สามารถใช้ SMBIOS แบบกำหนดเองได้อย่างง่ายดายผ่านตัวเลือก -smbios โดยไม่ต้องมีแพตช์เพิ่มเติม
  • วิธีนี้ช่วยให้เครื่องเสมือนถูกหลอกให้ดูราวกับว่ามีพัดลม CPU อยู่จริง เพื่อพยายามหลบเลี่ยงการตรวจจับของมัลแวร์

ทำไมต้องทำแบบนี้?

  • มัลแวร์ บางตัวตรวจสอบว่ากำลังรันอยู่ในสภาพแวดล้อมเสมือนหรือไม่ โดยเช็ก การมีอยู่ของฮาร์ดแวร์บางชนิด (เช่น พัดลม CPU)
  • มันตรวจสอบฮาร์ดแวร์ผ่าน WMI classes อย่าง Win32_Fan และหากไม่พบข้อมูลเหล่านี้ ก็จะตัดสินว่าเป็นเครื่องเสมือนและหลีกเลี่ยงการทำงาน
  • จุดประสงค์คือเพื่อไม่ให้นักวิเคราะห์สามารถวิเคราะห์มัลแวร์ได้
  • แม้จะมี WMI classes หลายแบบ เช่น Win32_CacheMemory และ Win32_VoltageProbe แต่บทความนี้จะโฟกัสที่พัดลม CPU

คอมพิวเตอร์รับรู้ได้อย่างไรว่ามีพัดลม CPU?

  • คอมพิวเตอร์อ่านข้อมูล SMBIOS เพื่อรับรู้ถึง การมีอยู่ของอุปกรณ์ระบายความร้อน (พัดลม CPU)
  • อินสแตนซ์ของ Win32_Fan ถูกให้บริการโดย cimwin32.dll และ DLL นี้จะอ่านข้อมูลพัดลมจากเอนทรี type 27 ของ SMBIOS
  • แม้จะสามารถใช้วิธีอย่าง DLL hooking ได้ แต่การแก้ไข SMBIOS โดยตรงเป็นแนวทางที่ดีกว่า

SMBIOS Type 27

  • SMBIOS type 27 หมายถึง "Cooling Device"
  • สามารถใช้ยูทิลิตี dmidecode เพื่อตรวจสอบข้อมูล Cooling Device ใน SMBIOS ได้โดยตรง
  • ตัวอย่าง:
    • Type: Chip Fan
    • Status: OK
    • Description: CPU Fan
    • Nominal Speed: 5600 rpm เป็นต้น

วิธีตั้งค่าข้อมูล SMBIOS แบบกำหนดเองใน Xen

  • ใน Xen สามารถใช้ตัวเลือก smbios_firmware ในไฟล์ตั้งค่า domain เพื่อระบุข้อมูล SMBIOS แบบไบนารีได้โดยตรง
  • สร้างไฟล์ smbios.bin แล้วแทรกข้อมูล Cooling Device(type 27) ลงไป
  • ต้องใส่ขนาดของโครงสร้าง SMBIOS (เช่น 24 ไบต์) นำหน้าในรูปแบบจำนวนเต็ม 32 บิต little-endian

ปัญหา: ข้อจำกัดของการ override โครงสร้าง

  • Xen จำกัดให้เขียนทับได้เฉพาะโครงสร้างหมายเลข 0, 1, 2, 3, 11, 22, 39 เท่านั้น
  • type 27 ไม่ได้รับอนุญาตโดยค่าเริ่มต้น จึงจำเป็นต้องแพตช์ซอร์สโค้ด
  • แม้จะมีการเสนอแพตช์ที่เกี่ยวข้องในฟอรัมนักพัฒนา Xen แต่ก็ยังไม่ได้รับการยอมรับอย่างเป็นทางการ (ต้องนำแพตช์ไปใช้และคอมไพล์เอง)

ต้องมี Type 28 ด้วย

  • Cooling Device(type 27) เชื่อมโยงกับ Temperature Probe(type 28)
  • หากไม่มีเอนทรี type 28 ใน SMBIOS คลาส Win32_Fan จะไม่แสดงผลอย่างถูกต้อง
  • ต้องดึงข้อมูล type 28 จากระบบ host แล้วเพิ่มลงใน smbios.bin เพื่อให้รับรู้ได้อย่างถูกต้อง

โครงสร้างสุดท้ายของ smbios.bin

  • รวมข้อมูลทั้ง Type 27 และ Type 28
  • แทรกข้อมูลขนาดของแต่ละโครงสร้างแบบ little-endian ไว้ด้านหน้า
  • ตัวอย่างเช่น: 18 00 00 00 ... (type 27) ... 29 00 00 00 ... (type 28) ...

การใช้งานและการตรวจสอบใน Xen

  • หลังบูตเครื่องเสมือน Windows ด้วยคำสั่งสร้าง domain แล้ว ให้ตรวจสอบใน WMI ว่าคลาส Win32_Fan ถูกมองเห็นอย่างถูกต้องหรือไม่
  • หากแสดง Description: Cooling Device และ Status: OK ก็ถือว่ารับรู้พัดลม CPU สำเร็จ

การตั้งค่าข้อมูล SMBIOS ใน QEMU/KVM

  • ใน QEMU/KVM สามารถตั้งค่า SMBIOS แบบกำหนดเองได้ง่าย ๆ ด้วยตัวเลือก -smbios file=path
  • ใช้เฉพาะข้อมูล raw โดยไม่ต้องมีข้อมูลขนาดของโครงสร้าง
  • สามารถนำข้อมูล SMBIOS ของ host มาใช้ตรง ๆ ได้เช่นกัน

เอกสารอ้างอิง

  • เอกสารไฟล์ตั้งค่า Xen domain, บันทึกการตั้งค่าของ mcnewton, คลังแพตช์ Xen ที่ถูกปฏิเสธ, System Management BIOS Reference, แพตช์ QEMU Anti Detection เป็นต้น

1 ความคิดเห็น

 
GN⁺ 2025-06-30
ความเห็นจาก Hacker News
  • มีการพูดถึงว่าวิธีแอนตี้มัลแวร์แบบใหม่อย่างหนึ่งคือซื้อพีซีแบบระบายความร้อนด้วยการพาความร้อนล้วน และการตั้งค่าคีย์บอร์ดเป็นภาษารัสเซียก็เป็นเคล็ดลับที่ช่วยกันมัลแวร์สายหลอกลวงได้ด้วย ดูลิงก์ที่เกี่ยวข้องได้

    • ผมใช้ Linux PC แบบพาสซีฟคูลลิง Streacom FC8 Evo พร้อมคีย์บอร์ดภาษารัสเซียอยู่จริง แต่พอลองดูด้วยคำสั่ง dmidecode ก็พบว่ายังมีข้อมูลอุปกรณ์ระบายความร้อนอยู่ และตรวจพบอุปกรณ์ทำความเย็นจริง รวมถึงดูข้อมูลอุณหภูมิจากเซ็นเซอร์ได้ด้วย

    • มีความเห็นว่าต่อให้ใช้พีซีแบบพาสซีฟคูลลิง เมนบอร์ดก็มักยังมีหัวต่อพัดลมเหลืออยู่ เลยอาจไม่ต่างมากนักแม้จะไม่ได้ต่อใช้งานจริง

  • มีการบอกว่าไม่ควรใช้คำอย่าง “smol pp” และชี้ให้เห็นว่าภาษาลักษณะนี้มีการล้อเลียนรูปร่างร่างกายแฝงอยู่

    • ในเมืองของฉันมีคนใช้ป้ายทะเบียนสั่งทำว่า “SML PP” อยู่เหมือนกัน แต่ก็ไม่รู้ว่าทำไม

    • มีความเห็นว่าการใช้คำว่า “ภาษาของพวกเรา” ทั้งที่เป็นคนในช่องคอมเมนต์บล็อกนั้นคลุมเครืออยู่แล้วว่าคำว่า ‘พวกเรา’ หมายถึงใคร

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

    • แทนที่จะทำให้ระบบปฏิบัติการทั่วไปดูเหมือน VM กลับควรทำให้ VM ไม่รู้ตัวเลยว่าตัวเองกำลังถูกรันแบบเสมือน โดยมีความเห็นว่าระบบ lpars ของ IBM ทำงานในลักษณะนั้น

    • มีการพูดถึงว่าถ้าเป็นแบบนี้ บริษัทซอฟต์แวร์แอนตี้ชีตก็น่าจะเสียผลประโยชน์ด้วย ฉันเองอยากรู้ชัดเจนว่าซอฟต์แวร์ของฉันรันอยู่ที่ไหน แต่ผู้เล่นมัลติเพลเยอร์จำนวนมากก็เกลียดคนโกงยิ่งกว่าการโกงเสียอีก จึงมองว่าในทางปฏิบัติคงเปลี่ยนแปลงได้ยาก

    • มีความเห็นว่าในโลกการพัฒนาแอปมือถือ กรอบลักษณะนี้กลายเป็นความจริงไปแล้ว

  • ฉันยังไม่เคยเห็นคำอธิบาย SMBIOS บนเมนบอร์ดฝั่งผู้บริโภคที่ตรงกับฮาร์ดแวร์จริงเลย มัลแวร์ที่เช็ก SMBIOS แบบนี้อาจพลาดบนฮาร์ดแวร์จริงถึง 50% แต่ถ้ากันได้แน่ ๆ เฉพาะบน VM หรือดีบักเกอร์ 100% ก็ยังคุ้มค่าสำหรับฝั่งมัลแวร์อยู่ดี แต่ก็มองว่าการตรวจด้วยการวัดเวลาน่าจะเชื่อถือได้มากกว่าวิธีนี้

    • ปรากฏการณ์ที่คำอธิบาย SMBIOS ไม่ตรงกับฮาร์ดแวร์จริงเห็นได้ชัดมากโดยเฉพาะบนกล่องจีนราคาถูก ค่าอย่าง “to be filled in by OEM” ที่ปล่อยว่างไว้เจอบ่อยมากตอนดูไบออสอิมเมจจริงตอนเขียนโค้ด แค่ค่าแบบนี้อย่างเดียวก็ชวนขำพอแล้ว

    • มัลแวร์เองก็มีบั๊กเยอะ เหมือนกรณีในอดีตที่โค้ดเครือข่ายมีบั๊กจนไวรัสแพร่ได้ช้ากว่าที่ตั้งใจไว้ครึ่งหนึ่ง ดังนั้นต่อให้มัลแวร์ติดไม่ครบทุกเครื่อง มันก็ยังสร้างความเสียหายใหญ่หลวงได้อยู่ดี

    • ช่วงนี้เลยสงสัยว่า Linux ตรวจจับพัดลมอย่างไร ใช้ ACPI หรือ EFI หรือไม่ เพราะบนเครื่องของฉันส่วนใหญ่พัดลมและเซ็นเซอร์ก็ถูกตรวจจับได้ค่อนข้างถูกต้อง

    • มีคำถามว่าการเช็ก SMBIOS แบบนี้เป็นสิ่งที่มัลแวร์จริงใช้กัน หรือมีแค่ในตัวอย่างที่นักวิจัยสร้างขึ้น

  • มีความเห็นว่าทริกที่มัลแวร์ใช้ API เพื่อทำให้วิเคราะห์ยากอาจดูน่ารัก แต่โดยมากการเรียก API แบบนี้ตรวจเจอได้ง่ายมากในการวิเคราะห์แบบสถิต และถ้าไบนารีไม่ได้ถูกทำให้อ่านยากก็อาจยิ่งส่งผลเสียกับตัวมัลแวร์เอง มีการแชร์ประสบการณ์ว่าซอฟต์แวร์ที่มีเป้าหมายจริงจังมักกระจายพร้อมลายเซ็นจาก CA ที่เชื่อถือได้ จึงมักถูกจับว่าเป็นพฤติกรรมน่าสงสัยในการวิเคราะห์ด้านความปลอดภัย ตอนเป็นจูเนียร์ก็เคยจับการใช้ API แบบนี้ด้วยแพตเทิร์น regex ซึ่งได้ผลพอสมควรกับการตรวจมัลแวร์พื้นฐานที่กระจายเป็นวงกว้าง

    • ช่วงหลังมัลแวร์ก็เซ็นไฟล์กันค่อนข้างบ่อยแล้ว ความคาดหวังว่ากลุ่มมัลแวร์จะไม่เซ็นไบนารีอีกต่อไปนั้นไม่จริง ใบรับรองสำหรับเซ็นโค้ดที่ถูกขโมยก็พบได้ทั่วไป และยังมีการพูดถึงว่า Microsoft มักไม่ค่อยเต็มใจเพิกถอนใบรับรองเพราะกลัวซอฟต์แวร์ของลูกค้าเดิมจะพัง มัลแวร์ยังมักใช้ไดรเวอร์ที่มีช่องโหว่เพื่อทะลุเข้าเคอร์เนลด้วย ดังนั้นในโลกจริง ไบนารีเล็ก ๆ ที่ทำ WMI call อาจดูน่าสงสัย แต่ยูทิลิตีโอเวอร์คล็อกที่มีช่องโหว่มากมายทำคิวรีเดียวกันกลับแทบไม่ถูกตั้งข้อสงสัย วิธีนี้จึงไม่ได้มีเป้าหมายหลักเพื่อหลบการตรวจจับ แต่เพื่อไม่ให้เพย์โหลดของมัลแวร์ถูกเปิดใช้งานบนพีซีของนักวิเคราะห์ กล่าวคือถ้าถูกตรวจพบ ก็จะไม่ดาวน์โหลดเพย์โหลดขั้นที่สอง และชะลอพฤติกรรม C&C ที่อาจก่อการโจมตีจริงไว้

    • มีข้อเสนอว่าในมุมมองด้านความปลอดภัย การรันซอฟต์แวร์ทั้งหมดใน VM น่าจะดีกว่าหรือไม่

    • มีความเห็นว่าการที่แอนติไวรัสพยายามตัดสินจากการวิเคราะห์แบบสถิตอย่างเดียวว่าอะไรเป็นมัลแวร์ก็ดูคลุมเครือ ถ้าอย่างนั้นก็อาจใช้วิธีไวต์ลิสต์ อนุญาตเฉพาะซอฟต์แวร์ที่เชื่อถือได้ และมองที่เหลือทั้งหมดเป็นมัลแวร์ไปเลย ซึ่งผลลัพธ์ก็แทบไม่ต่างกัน

    • มีการวิจารณ์ว่าบริษัทอย่าง CrowdStrike ได้รับการเซ็นรับรองอย่างเป็นทางการให้รันซอฟต์แวร์หละหลวมในระดับเคอร์เนลและทำ system call ได้เต็มที่โดยแทบไม่มีใครสนใจ ไม่เกี่ยวว่าเป็น VM หรือไม่ ปัญหาคือมีการปล่อยโค้ดและรีลีสที่ยังไม่ผ่านการพิสูจน์ไปใช้จริงในโปรดักชัน พอโลกพังขึ้นมาจริง เที่ยวบินล่าช้าหรือโครงสร้างพื้นฐานสำคัญล่ม ก็แทบไม่มีใครรับผิดชอบอย่างเหมาะสม กลายเป็นว่าบริษัทถูกกฎหมายต่างหากที่อาจสร้างความเสียหายได้มากกว่าแฮกเกอร์หรือผู้โจมตีระดับรัฐเสียอีก และมีความเห็นว่าเหตุการณ์ xz utils ก็เป็นเหตุด้านความปลอดภัยครั้งใหญ่พอจะถูกนำไปเทียบกับ SolarWinds และ ClownStrike ได้

  • ฉันเคยเห็นเพื่อนในวงการ infosec ใช้เวลาส่วนใหญ่ไปกับการทำ honeypot มัลแวร์ให้เหมือนฮาร์ดแวร์จริงทุกอย่างอย่างสมบูรณ์ ตั้งแต่เทอร์โมสตัทบน Windows XP ไปจนถึงคอนโทรลเลอร์ PLC ของ Siemens และเดสก์ท็อปธนาคาร อุปกรณ์หลากหลายมากและถูกเซ็ตอัปอย่างประณีตจนน่าทึ่ง

    • ได้แต่หวังว่าในโลกนี้จะไม่มีเทอร์โมสตัทที่รันด้วย Windows XP จริง ๆ
  • ทำให้นึกถึงตอนตั้งค่า Hackintosh ที่จำเป็นต้องใช้ SMBIOS ที่เหมาะสม มี PC API จิปาถะที่ค่อนข้างเฉพาะทางจำนวนมากถูกเพิ่มเข้ามาตลอดหลายสิบปีที่ผ่านมา และมักถูกใช้ทดสอบว่าซอฟต์แวร์จำลองเสมือนหรือมัลแวร์สะท้อนรายละเอียดเหล่านี้ได้ดีแค่ไหน ถ้าจะไปให้ไกลกว่านั้น ก็น่าจะต้องมีการจำลองเซ็นเซอร์อุณหภูมิที่เปลี่ยนแบบไดนามิกตามโหลดจริงของ CPU ด้วย

  • ตาม Mitre ATT&CK T1497.001 (VM Detection) การเช็ก SMBIOS เป็นเวกเตอร์ที่รู้จักกันอยู่แล้ว ฉันก็ลองเองแล้วพบว่าสามารถตั้งค่า power supply ให้แสดงเป็น ‘HotReplaceable=Yes’, ‘Status=OK’ เพื่อให้ดูเหมือนเซิร์ฟเวอร์ bare metal ราคา $5,000 ได้ คำสั่งที่ใช้คือ pip install dmigen หลังจากนั้น dmigen -o smbios.bin --type0 vendor="American Megatrends",version="F.1" --type1 manufacturer="Dell Inc.",product="PowerEdge T630" --type39 name="PSU1",location="Bay 1",status=3,hotreplaceable=1

    • อ้างอิงเพิ่มเติมว่าใน Hacker News ถ้าต้องการขึ้นบรรทัดใหม่จริง ๆ ต้องเว้นบรรทัดสองครั้งขึ้นไป หรือย่อหน้าแต่ละบรรทัดด้วยการเว้นสองช่องเพื่อให้เข้าโหมดโค้ด