การเพิ่มสิทธิ์ในการเพิ่มสิทธิ์ในท้องถิ่นสำหรับไดรเวอร์เคอร์เนล CPU-Z
แอปพลิเคชัน CPU-Z จะติดตั้งไดรเวอร์ที่เซ็นชื่อที่มีช่องโหว่เพื่อเข้าถึงข้อมูลเคอร์เนลจาก USERMODE ก่อน V1.81 ไดรเวอร์ CPU-Z เปิดเผย IOCTL สามตัวที่อนุญาตให้แอปพลิเคชัน USERMODE ใด ๆ อ่านการลงทะเบียนควบคุมอ่าน DWORDs จากหน่วยความจำกายภาพและเขียน DWORS ไปยังหน่วยความจำทางกายภาพ เราใช้ฟังก์ชั่นนี้ในทางที่ผิดเพื่อให้ได้การดำเนินการรหัสโหมดเคอร์เนลเต็มรูปแบบและวางไข่เชลล์ระบบเป็นหลักฐานของแนวคิด
การใช้ประโยชน์นี้รองรับ Windows XP - Windows 10 1607:
การหาประโยชน์นี้ได้รับการทดสอบในระบบต่อไปนี้ด้วย CPU-Z v1.76:
* บน Windows 1703 และ Kernel Control Flow Guard (CFG) ถูกเปิดใช้งานโดยค่าเริ่มต้น [1] ส่งผลให้ Kernel_Security_Check_Failure ตรวจสอบข้อผิดพลาด
ในการเรียกใช้การหาประโยชน์นี้ให้เริ่มแอปพลิเคชัน CPU-Z และเรียกใช้ Exploit.exe จากพรอมต์คำสั่งเป็นผู้ใช้ปกติ หากประสบความสำเร็จควรวางไข่กระบวนการ cmd.exe ใหม่ที่ทำงานเป็นระบบ โปรดทราบว่าการหาประโยชน์นี้จะล้มเหลวหากรันจากกระบวนการที่มีความสมบูรณ์ต่ำเนื่องจากการใช้ NTQuerySysteminformation
ไดรเวอร์เคอร์เนล CPU-Z ก่อน V1.81 อนุญาตให้แอปพลิเคชัน USERMODE ใด ๆ อ่านการลงทะเบียนควบคุมอ่าน DWORDS จากหน่วยความจำกายภาพและเขียน DWORDS ไปยังหน่วยความจำทางกายภาพ เราใช้ฟังก์ชั่นนี้ในทางที่ผิดเพื่ออ่าน CR3 และสำรวจตารางหน้าเพื่อสร้างการอ่าน/เขียนแบบดั้งเดิมผ่านพื้นที่หน่วยความจำเสมือนทั้งหมดทั้งหมด
ด้วยการอ่าน/เขียนแบบเต็มเราจะพลิกบิตผู้ใช้/หัวหน้างานในรายการตารางหน้า (PTE) ที่มีน้ำหนักบรรทุกของเราเป็นเคอร์เนลเพื่อหลีกเลี่ยงการป้องกันการดำเนินการตามโหมดหัวหน้างาน (SMEP) จากนั้นเราเขียนทับตัวชี้ฟังก์ชั่นที่ NT! HaldispatchTable [1] และทริกเกอร์เพย์โหลดโดยเรียก ntQueryIntervalProfile
เพื่อเป็นหลักฐานของแนวคิด Payload จะกำหนดโทเค็นระบบให้กับกระบวนการ cmd.exe ที่ถูกระงับและดำเนินการต่อ สิ่งนี้ควรส่งผลให้พรอมต์คำสั่งใหม่ทำงานเป็นผู้มีอำนาจ/ระบบ NT น้ำหนักบรรทุกไม่พึ่งพาการชดเชยแบบคงที่และควรทำงานบน Windows XP+
มีการแนะนำการบรรเทาจำนวนมากในช่วงสองปีที่ผ่านมาซึ่ง จำกัด ประสิทธิภาพของการหาประโยชน์นี้ คำอธิบายสั้น ๆ อยู่ด้านล่าง
ในรุ่น 1.81 ไดรเวอร์ที่มาพร้อมกับ CPU-Z ได้รับการแก้ไขเพื่อ จำกัด ชุดของผู้โทรที่สามารถเปิดวัตถุอุปกรณ์และการใช้งาน IOCTL บางส่วนได้ถูกลบออก ในการร้องขอเพื่อเปิดวัตถุอุปกรณ์ของไดรเวอร์จะตรวจสอบเพื่อดูว่ากระบวนการปัจจุบันเปิดใช้งาน SeloadDriverPrivilege หรือไม่ หาก privilige นี้หายไปหรือปิดใช้งานไดรเวอร์จะปฏิเสธคำขอด้วย status_access_denied โปรดทราบว่าเมื่อทำงานเป็นผู้ดูแลระบบมันเป็นเรื่องเล็กน้อยที่จะเปิดใช้งานสิทธิ์นี้จาก USERMODE นอกจากนี้ IOCTL เพื่ออ่านรีจิสเตอร์ควบคุมได้ถูกลบออก (แม้ว่าการใช้งานการอ่าน/เขียนหน่วยความจำทางกายภาพยังคงอยู่) หากไม่มีความสามารถในการอ่านฐานตารางหน้าจาก CR3 วิธีการแสวงหาผลประโยชน์ในโครงการนี้จะไม่สามารถทำได้อีกต่อไป โปรดทราบว่าไดรเวอร์ CPU-Z ให้ IOCTL อื่น ๆ อีกมากมายที่สามารถใช้สำหรับการแสวงประโยชน์เช่นการอ่านและการเขียนไปยังการลงทะเบียนเฉพาะโมเดลโดยพลการ
ในฐานะของ Windows 10 1703 (อัปเดตผู้สร้าง) ตัวป้องกันการไหลของเคอร์เนลจะเปิดใช้งานโดยค่าเริ่มต้นใน X86_64 การโทรผ่าน HaldispatchTable จะส่งผลให้การตรวจสอบข้อผิดพลาดของ Kernel_Security_Check_Failure เนื่องจาก CFG ได้รับการปกป้อง หากไม่ได้เปิดใช้งาน Virtualization Security (VBS) ควรเพิ่มเพย์โหลดเป็นเป้าหมายการโทรที่ถูกต้องเพื่อข้าม CFG
หากเปิดใช้งาน Virtualization Security (VBS) มันจะฆ่าส่วนใหญ่ของการหาประโยชน์นี้ การจัดการ PTE ที่ใช้ในการปิดการใช้งาน SMEP จะไม่สามารถทำได้อีกต่อไปเนื่องจาก PTEs จะได้รับการปกป้องโดย hypervisor นอกจากนี้จะต้องใช้บายพาส CFG ใน X86_64 เพื่อรับการดำเนินการรหัสผ่าน HaldispatchTable เนื่องจากเคอร์เนล CFG บิตแมปจะไม่สามารถเขียนได้
ช่องโหว่ที่ใช้ในการหาประโยชน์นี้มีรายละเอียดใน CVE-2017-15302 และ CVE-2017-15303 หลักฐานอีกอย่างหนึ่งสามารถดูได้ที่ CPUZ-DSEFIX [5]
[1] https://community.osr.com/discussion/283374/control-flow-guard-question
[2] https://www.cvedetails.com/cve/cve-2017-15302/
[3] https://www.cvedetails.com/cve/cve-2017-15303/
[4] https://github.com/akayn/bugs/blob/master/cpuid/cve-2017-15302/readme.md
[5] https://github.com/samlarenn/cpuz-dsefix
นอกจากนี้วิธีการเขียนทับ HaldispatchTable ที่ใช้ในการหาประโยชน์นี้เป็นเวกเตอร์ที่ใช้กันทั่วไปเพื่อรับการดำเนินการรหัสจากการอ่าน/เขียนเคอร์เนลดั้งเดิม สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับเทคนิคนี้ดูทรัพยากรด้านล่าง
[6] http://poppopret.blogspot.com/2011/07/windows-kernel-exploitation-basics-part.html
[7] https://www.abatchy.com/2018/01/kernel-exploitation-7
[8] https://osandamalith.com/2017/06/14/windows-kernel-exploitation-arbitrary-overwrite/
[9] https://rootkits.xyz/blog/2017/09/kernel-write-what-where-