CPU-Z内核驱动程序的本地特权升级利用。
CPU-Z应用程序将安装易受伤害的签名驱动程序,以访问Usermode的内核数据。在v1.81之前,CPU-Z驱动程序暴露了三个IOCTL,这些IOCTL允许任何USERMODE应用程序读取控制寄存器,从物理内存中读取Dwords,然后将Dwords写入物理内存。我们滥用此功能以获得完整的内核模式代码执行并催生系统外壳作为概念证明。
此利用支持Windows XP -Windows 10 1607:
使用CPU-Z v1.76在以下系统上测试了此功能:
*默认情况下[1]启用了Windows 1703和后来的内核控制流程护罩(CFG),从而导致kernel_security_check_failure bug检查。
要运行此漏洞利用,请启动CPU-Z应用程序,然后以正常用户的命令提示符从命令提示符运行exploit.exe。如果成功,它应该产生一个新的cmd.exe流程作为系统。请注意,由于使用NtquerySystemInformation,如果从低融合过程中运行,此漏洞将失败。
V1.81之前的CPU-Z内核驱动程序允许任何USERMODE应用程序读取控制寄存器,从物理内存中读取DWORD,然后将DWords写入物理内存。我们滥用此功能以读取CR3并遍历页面表,以便在整个虚拟内存空间上构建任意读取/写入原始性。
使用完整的读/写入,我们将用户/主管位在页面表条目(PTE)上翻转,其中包含有效载荷到kernelmode,以绕过主管模式执行预防(SMEP)。然后,我们在NT!HaldisPatchTable [1]覆盖功能指针,并通过调用NTQueryIntervalProfile触发有效负载。
作为概念证明,有效载荷将把系统令牌分配给悬挂的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的保护。如果未启用基于虚拟化的安全性(VBS),则应将有效载荷作为有效的呼叫目标添加到旁路CFG。
如果启用了基于虚拟化的安全性(VBS),它将杀死此漏洞的大多数。用于禁用SMEP的PTE操纵将不再可能,因为PTE将受到管理程序的保护。此外,X86_64上将需要一个CFG旁路,以通过HALDISPATCHTTABLE获得代码执行,因为内核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-whath-where/