- มัลแวร์ มักตรวจสอบการมีอยู่ของฮาร์ดแวร์อย่าง พัดลม 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 ความคิดเห็น
ความเห็นจาก 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 และเดสก์ท็อปธนาคาร อุปกรณ์หลากหลายมากและถูกเซ็ตอัปอย่างประณีตจนน่าทึ่ง
ทำให้นึกถึงตอนตั้งค่า 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