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/