內(nèi)核數(shù)據(jù)保護(hù)KDP:防止數(shù)據(jù)損壞的一種新平臺(tái)安全技術(shù)

對(duì)于攻擊者來說,隨著像代碼完整性(CI)、控制流防護(hù)(CFG)這樣防止內(nèi)存損壞的安全技術(shù)不斷出現(xiàn),他們開始將目光轉(zhuǎn)向數(shù)據(jù)損壞這一方面。攻擊者利用數(shù)據(jù)破壞技術(shù),可以修改系統(tǒng)安全策略、提升特權(quán)、篡改安全證明、修改“一次初始化”數(shù)據(jù)結(jié)構(gòu)等。

0x00 前言

對(duì)于攻擊者來說,隨著像代碼完整性(CI)、控制流防護(hù)(CFG)這樣防止內(nèi)存損壞的安全技術(shù)不斷出現(xiàn),他們開始將目光轉(zhuǎn)向數(shù)據(jù)損壞這一方面。攻擊者利用數(shù)據(jù)破壞技術(shù),可以修改系統(tǒng)安全策略、提升特權(quán)、篡改安全證明、修改“一次初始化”數(shù)據(jù)結(jié)構(gòu)等。

內(nèi)核數(shù)據(jù)保護(hù)(Kernel Data Protection,KDP)是一項(xiàng)新技術(shù),可以通過基于虛擬化的安全性(VBS)保護(hù)部分Windows內(nèi)核和驅(qū)動(dòng)程序。KDP是一組API,可以將某些內(nèi)核內(nèi)存標(biāo)記為只讀,從而防止攻擊者修改受保護(hù)的內(nèi)存。例如,我們已經(jīng)發(fā)現(xiàn)有攻擊者使用經(jīng)過簽名但易受攻擊的驅(qū)動(dòng)程序來攻擊策略數(shù)據(jù)結(jié)構(gòu),并安裝未經(jīng)簽名的惡意驅(qū)動(dòng)程序。KDP可以通過保證策略數(shù)據(jù)結(jié)構(gòu)不會(huì)被篡改的方式來緩解此類攻擊。

這種保護(hù)內(nèi)核內(nèi)存為只讀狀態(tài)的概念,在Windows內(nèi)核、收件箱組件、安全產(chǎn)品甚至第三方驅(qū)動(dòng)程序(例如:反作弊和數(shù)字版權(quán)管理DRM軟件)之中都有重要的應(yīng)用。除了該技術(shù)在安全性的重要性以及應(yīng)用程序防篡改保護(hù)之外,其他優(yōu)點(diǎn)還在于:

1、性能改進(jìn):KDP減輕了證明組件(attestation component)的負(fù)擔(dān),不再需要定期驗(yàn)證已經(jīng)設(shè)置寫保護(hù)的數(shù)據(jù)變量;

2、可靠性改進(jìn):借助KDP,可以更輕松地診斷出內(nèi)核損壞問題,而這些問題不一定屬于安全性漏洞。

3、可以促進(jìn)驅(qū)動(dòng)程序開發(fā)人員和廠商改善虛擬化安全方案的兼容性,并在生態(tài)系統(tǒng)中提高這些技術(shù)的采用率。

KDP使用安全核心計(jì)算機(jī)上默認(rèn)支持的技術(shù),這些技術(shù)實(shí)現(xiàn)了一組特定的設(shè)備要求,而這些要求將隔離最佳實(shí)踐、對(duì)Windows操作系統(tǒng)的信任最小化等安全性應(yīng)用到這些技術(shù)之中。KDP可以為敏感的系統(tǒng)配置數(shù)據(jù)增加另一層保護(hù),從而增強(qiáng)由安全核心PC(Secured-core PC)功能提供的安全性。

在這篇文章中,我們將分享有關(guān)內(nèi)核數(shù)據(jù)保護(hù)的工作原理,以及如何在Windows 10上實(shí)現(xiàn)的技術(shù)細(xì)節(jié),希望能促進(jìn)驅(qū)動(dòng)程序開發(fā)人員和廠商充分利用這項(xiàng)旨在防范數(shù)據(jù)損壞攻擊的安全技術(shù)。

0x01 內(nèi)核數(shù)據(jù)保護(hù):概述

在VBS環(huán)境中,常規(guī)NT內(nèi)核在稱為VTL0的虛擬化環(huán)境中運(yùn)行,而安全內(nèi)核在稱為VTL1的環(huán)境中運(yùn)行,后者是一個(gè)更加安全的隔離環(huán)境。有關(guān)VBS和安全內(nèi)核的更多詳細(xì)信息,請(qǐng)參考這里(https://channel9.msdn.com/Blogs/Seth-Juarez/Isolated-User-Mode-in-Windows-10-with-Dave-Probert)和這里(https://channel9.msdn.com/Blogs/Seth-Juarez/Windows-10-Virtual-Secure-Mode-with-David-Hepkin)。KDP的目標(biāo)是保護(hù)Windows內(nèi)核中運(yùn)行的驅(qū)動(dòng)程序和軟件(即操作系統(tǒng)代碼本身)不會(huì)受到數(shù)據(jù)方面的攻擊。KDP分為兩個(gè)部分來實(shí)現(xiàn):

1、靜態(tài)KDP能使內(nèi)核模式下運(yùn)行的軟件能夠靜態(tài)保護(hù)其自身映像的一部分,以避免被VTL0中的任何其他實(shí)體篡改。

2、動(dòng)態(tài)KDP幫助內(nèi)核模式軟件從“安全池”分配和釋放只讀內(nèi)存。從池中返回的內(nèi)存只能初始化一次。

由KDP管理的內(nèi)存始終由安全內(nèi)核(VTL1)驗(yàn)證,并由虛擬機(jī)管理程序(hypervisor)使用二級(jí)地址轉(zhuǎn)換(SLAT)表進(jìn)行保護(hù)。最終,在NT內(nèi)核(VTL0)中運(yùn)行的任何軟件都將無法修改受保護(hù)內(nèi)存的內(nèi)容。

在最新版本的Windows 10 Insider Build中已經(jīng)提供了動(dòng)態(tài)KDP和靜態(tài)KDP,并且可以使用任何類型的內(nèi)存(可執(zhí)行頁面除外)。虛擬機(jī)管理程序保護(hù)的代碼完整性(HVCI)已經(jīng)為可執(zhí)行頁面提供了保護(hù),該功能可以防止任何未經(jīng)簽名的內(nèi)存被設(shè)置為可執(zhí)行狀態(tài),授予W^X(可寫或者可執(zhí)行,不能二者同時(shí))的條件。

本文沒有對(duì)HVCI和W^X條件進(jìn)行介紹,有關(guān)更多詳細(xì)信息,請(qǐng)參閱即將出版的Windows Internals圖書。

1.1 靜態(tài)KDP

如果驅(qū)動(dòng)程序需要通過靜態(tài)KDP保護(hù)其映像,則應(yīng)該調(diào)用MmProtectDriverSection API,該API具有以下原型:

NTSTATUS MmProtectDriverSection (PVOID AddressWithinSection, SIZE_T Size, ULONG Flags)

驅(qū)動(dòng)程序指定一個(gè)位于數(shù)據(jù)段內(nèi)部的地址、受保護(hù)區(qū)域的大?。蛇x)和一些標(biāo)志。在撰寫本文時(shí),“size”參數(shù)暫時(shí)保留以供將來使用。地址所駐留的整個(gè)數(shù)據(jù)部分將始終受到API保護(hù)。

如果函數(shù)成功執(zhí)行,則支持靜態(tài)部分的內(nèi)存對(duì)于VTL0變?yōu)橹蛔x,并且由SLAT保護(hù)。在這里,不允許卸載帶有受保護(hù)部分的驅(qū)動(dòng)程序,如果嘗試卸載,將會(huì)產(chǎn)生藍(lán)屏錯(cuò)誤。但是,我們知道有時(shí)應(yīng)該可以卸載驅(qū)動(dòng)程序。因此,我們引入了MM_PROTECT_DRIVER_SECTION_ALLOW_UNLOAD標(biāo)志。如果調(diào)用方指定了它,則系統(tǒng)可以卸載目標(biāo)驅(qū)動(dòng)程序,這意味著在這種情況下,受保護(hù)的部分將首先轉(zhuǎn)為不受保護(hù)的狀態(tài),然后再由NtUnloadDriver釋放。

1.2 動(dòng)態(tài)KDP

動(dòng)態(tài)KDP允許驅(qū)動(dòng)程序使用安全池提供的服務(wù)來分配和初始化只讀內(nèi)存,該池由安全內(nèi)核管理。使用者首先創(chuàng)建與標(biāo)簽關(guān)聯(lián)的安全池上下文,之后所有的內(nèi)存分配都將與創(chuàng)建的安全池上下文相關(guān)聯(lián)。在創(chuàng)建上下文后,可以通過ExAllocatePool3 API的新擴(kuò)展參數(shù)執(zhí)行只讀分配:

PVOID ExAllocatePool3 (POOL_FLAGS Flags, SIZE_T NumberOfBytes, ULONG Tag, PCPOOL_EXTENDED_PARAMETER ExtendedParameters, ULONG Count);

然后,調(diào)用方可以在POOL_EXTENDED_PARAMS_SECURE_POOL數(shù)據(jù)結(jié)構(gòu)中指定分配的大小,以及從中復(fù)制內(nèi)存的初始緩沖區(qū)。返回的內(nèi)存區(qū)域不能由在VTL0中運(yùn)行的任何實(shí)體修改。另外,在分配時(shí),調(diào)用方提供標(biāo)記和Cookie值,它們被編碼并嵌入到分配中。使用者可以隨時(shí)驗(yàn)證地址是否在為動(dòng)態(tài)KDP分配保留的內(nèi)存范圍內(nèi),預(yù)期的Cookie和標(biāo)記實(shí)際上已經(jīng)編碼為指定的分配。這樣一來,調(diào)用者就可以檢查其指向安全池分配的指針是否還沒有使用其他分配進(jìn)行切換。

與靜態(tài)KDP類似,動(dòng)態(tài)KDP在默認(rèn)情況下無法釋放或修改內(nèi)存區(qū)域。調(diào)用方可以在分配時(shí)使用SECURE_POOL_FLAGS_FREEABLE和SECURE_POOL_FLAG_MODIFIABLE標(biāo)志去指定分配是否可釋放或可修改。使用這些標(biāo)志,會(huì)降低分配的安全性,但可以允許動(dòng)態(tài)KDP內(nèi)存用于無法泄露所有分配的場景中,例如按照主機(jī)上的每個(gè)進(jìn)程而進(jìn)行的分配。

0x02 Windows 10上的KDP實(shí)現(xiàn)

如前所述,靜態(tài)KDP和動(dòng)態(tài)KDP都依賴于虛擬機(jī)管理程序(hypervisor)中SLAT保護(hù)的物理內(nèi)存。當(dāng)處理器支持SLAT時(shí),它將使用另一層進(jìn)行內(nèi)存地址轉(zhuǎn)換。AMD是通過“嵌入頁表”(nested page table)來實(shí)現(xiàn)SLAT,而Intel則使用“擴(kuò)展頁表”(extended page table)這一術(shù)語。

2.1 二級(jí)地址轉(zhuǎn)換(SLAT)

當(dāng)虛擬機(jī)管理程序(Hypervisor)啟用SLAT支持,并且虛擬機(jī)在VMX非root模式下執(zhí)行時(shí),處理器會(huì)將稱為“客體虛擬地址”(GVA,在ARM64中稱為第一階段虛擬地址)的初始虛擬地址轉(zhuǎn)換成叫做“客體物理地址”(GPA,在ARM64中稱為IPA)的中間物理地址。這一轉(zhuǎn)換過程仍然由頁表管理,由客體操作系統(tǒng)管理的CR3控制寄存器進(jìn)行尋址。轉(zhuǎn)換的最終結(jié)果將在客體頁表中指定訪問保護(hù)的情況下,將GPA返回給處理器。在這里,只有在內(nèi)核模式下運(yùn)行的軟件才能與頁表進(jìn)行交互。Rootkit通常在內(nèi)核模式下運(yùn)行,并且可以修改中間物理頁面的保護(hù)。

虛擬機(jī)管理程序幫助處理器使用擴(kuò)展頁表(嵌入頁表)來轉(zhuǎn)換GPA。在非SLAT系統(tǒng)上,當(dāng)TLB中不存在虛擬地址時(shí),處理器需要查找層次結(jié)構(gòu)中的所有頁表,以重建最終的虛擬地址。如下圖所示,虛擬地址分為4個(gè)部分(在LA48系統(tǒng)上)。每個(gè)部分代表該層次結(jié)構(gòu)的頁表中的索引。初始PML4表的物理地址由CR3寄存器指定。這就解釋了為什么處理器始終能夠轉(zhuǎn)換地址,并獲得層次結(jié)構(gòu)中下一個(gè)表的下一個(gè)物理地址。請(qǐng)務(wù)必注意,在層次結(jié)構(gòu)的每個(gè)頁表?xiàng)l目中,NT內(nèi)核都通過一組屬性來指定頁保護(hù)。只有在每個(gè)頁表?xiàng)l目上指定的保護(hù)全部都允許的情況下,才能訪問最終的物理地址。

X64第一階段地址轉(zhuǎn)換(虛擬地址到客體物理地址):

啟用SLAT時(shí),需要將客體的CR3寄存器中指定的中間物理地址轉(zhuǎn)換為真實(shí)系統(tǒng)物理地址(SPA)。這個(gè)機(jī)制與上面類似,虛擬機(jī)管理程序?qū)⒈硎井?dāng)前正在執(zhí)行的虛擬機(jī)的活動(dòng)虛擬機(jī)控制塊(VMCB)的nCR3字段設(shè)置為嵌入頁表(擴(kuò)展頁表)的物理地址。(在Intel架構(gòu)中,該字段稱為“EPT指針”)。嵌入頁表的構(gòu)建方式與標(biāo)準(zhǔn)的頁表相似,因此處理器需要掃描整個(gè)層次結(jié)構(gòu),以找到正確的物理地址,如下圖所示。在圖中,“n”表示層次結(jié)構(gòu)中的嵌套頁表,由虛擬機(jī)管理程序管理,而“g”表示客體頁表,由NT內(nèi)核管理。

下圖展示了從GPA到SPA的X64第二階段物理地址轉(zhuǎn)換。

X64第二階段物理地址轉(zhuǎn)換(GPA到SPA):

如圖所示,客體虛擬地址到系統(tǒng)物理地址的最終轉(zhuǎn)換需要經(jīng)過兩次轉(zhuǎn)換:GVA到GPA,這是由客體虛擬機(jī)的內(nèi)核配置,以及GPA到SPA,這是由虛擬機(jī)管理程序配置。需要注意的是,在最不理想的情況下,由于轉(zhuǎn)換涉及到4個(gè)頁面層次結(jié)構(gòu),將會(huì)導(dǎo)致20個(gè)表查找。這個(gè)機(jī)制可能會(huì)比較慢,并會(huì)隨著處理器對(duì)增強(qiáng)TLB的支持而得到緩解。在TLB條目中,包含了另一個(gè)標(biāo)識(shí)當(dāng)前正在執(zhí)行的虛擬機(jī)的ID(在Intel系統(tǒng)中稱為虛擬處理器標(biāo)識(shí)符或VPID,在AMD系統(tǒng)中稱為地址空間ID或ASID),因此處理器可以緩存屬于兩個(gè)不同虛擬機(jī)的一個(gè)虛擬地址的轉(zhuǎn)換結(jié)果,不會(huì)產(chǎn)生任何沖突。

層次結(jié)構(gòu)中NPT頁表的嵌入條目:

如上圖所示,NPT條目指定了多個(gè)訪問保護(hù)屬性。這使得虛擬機(jī)管理程序可以進(jìn)一步保護(hù)系統(tǒng)物理地址。除了管理程序本身之外,其他任何實(shí)體都不能訪問NPT。當(dāng)處理器嘗試讀取、寫入或運(yùn)行NPT不允許訪問的地址時(shí),會(huì)引發(fā)NPT沖突(Intel體系結(jié)構(gòu)中叫做“EPT沖突”),并導(dǎo)致虛擬機(jī)退出。由于NPT沖突導(dǎo)致的虛擬機(jī)退出事件不會(huì)經(jīng)常發(fā)生。通常,這種情況會(huì)在嵌套配置或在HVCI使用MBEC軟件時(shí)產(chǎn)生。如果由于其他原因?qū)е铝薔PT沖突,Microsoft虛擬機(jī)管理程序會(huì)向當(dāng)前虛擬處理器(VP)發(fā)送一個(gè)訪問沖突異常,該異常會(huì)由客體操作系統(tǒng)以不同方式進(jìn)行管理,如果沒有異常處理程序選擇處理異常,則通常會(huì)進(jìn)入到Bug檢查中。

2.2 靜態(tài)KDP實(shí)現(xiàn)

SLAT保護(hù)是KDP的重要基礎(chǔ)。在Windows中,動(dòng)態(tài)KDP和靜態(tài)KDP的實(shí)現(xiàn)相類似,都由安全內(nèi)核管理。安全內(nèi)核是唯一能夠向虛擬機(jī)管理程序發(fā)出ModifyVtlProtectionMask超級(jí)調(diào)用(hypercall)的實(shí)體,作用是修改較低VTL0中映射的物理頁面的SLAT訪問保護(hù)。

對(duì)于靜態(tài)KDP,NT內(nèi)核會(huì)驗(yàn)證驅(qū)動(dòng)程序并不是會(huì)話驅(qū)動(dòng)程序,也沒有映射大頁面。如果上述驗(yàn)證沒有通過,或者是屬于可丟棄段(Discardable Section),則無法應(yīng)用靜態(tài)KDP。如果調(diào)用MmProtectDriverSection API的實(shí)體沒有請(qǐng)求卸載目標(biāo)映像,則NT內(nèi)核將會(huì)對(duì)安全內(nèi)核執(zhí)行第一個(gè)調(diào)用,該調(diào)用將固定與驅(qū)動(dòng)程序關(guān)聯(lián)的普通地址范圍(NAR)。“固定”操作可以防止重復(fù)使用驅(qū)動(dòng)程序的地址空間,從而使驅(qū)動(dòng)程序不可卸載。然后,NT內(nèi)核將屬于該段的所有頁面都放入內(nèi)存,并將它們?cè)O(shè)置為私有。然后,頁面在子PTE結(jié)構(gòu)中標(biāo)記為只讀(在上圖中以“gPTE”表示)。在這一階段,NT內(nèi)核最終可以通過SLAT調(diào)用安全內(nèi)核來保護(hù)基礎(chǔ)物理頁面。安全內(nèi)核的保護(hù)分為兩個(gè)階段:

1、注冊(cè)屬于該段的所有物理頁面,在數(shù)據(jù)庫中添加適當(dāng)?shù)腘TE(普通表地址)并更新屬于VTL1的基礎(chǔ)安全PFN,從而將它們標(biāo)記為“由VTL0擁有”。這樣將會(huì)讓安全內(nèi)核可以跟蹤仍然屬于NT內(nèi)核的物理頁面。

2、對(duì)VTL0 SLAT表應(yīng)用只讀保護(hù)。虛擬機(jī)管理程序針對(duì)每個(gè)VTL使用一個(gè)SLAT表和VMCB。

現(xiàn)在,目標(biāo)映像的區(qū)域已經(jīng)受到保護(hù)。VTL0中的任何實(shí)體都無法寫入屬于該段的任何頁面。在這種情況下,安全內(nèi)核保護(hù)了NT內(nèi)核最初在VTL0中分配的一些內(nèi)存頁面。

2.3 動(dòng)態(tài)KDP實(shí)現(xiàn)

動(dòng)態(tài)KDP使用新Segment Heap提供的服務(wù),從安全池分配內(nèi)存,這個(gè)池幾乎完全由安全內(nèi)核管理。

在啟動(dòng)過程的早期,NT內(nèi)存管理器會(huì)計(jì)算用于安全池的512GB區(qū)域隨機(jī)虛擬基址,該地址恰好包含了256個(gè)內(nèi)核PML4條目之一。在第一階段的后面,NT內(nèi)存管理器會(huì)發(fā)出一個(gè)安全調(diào)用,內(nèi)部稱為INITIALIZE_SECURE_POOL,其中包含計(jì)算出的內(nèi)存區(qū)域,并運(yùn)行安全內(nèi)核初始化安全池。

安全內(nèi)核會(huì)創(chuàng)建一個(gè)NAR,表示屬于不安全NT內(nèi)核的整個(gè)512GB虛擬區(qū)域,并初始化屬于NAR的所有相對(duì)NTE。安全內(nèi)核中的安全池虛擬地址空間為256GB,這意味著映射它的PML4會(huì)與其他一些內(nèi)容共享,并且與NT相比不在同一個(gè)基址上。因此,在初始化安全池描述符時(shí),安全內(nèi)核還會(huì)計(jì)算一個(gè)Delta值,該Delta值是安全內(nèi)核中安全池基址與NT內(nèi)核中保留池基址之間的差(如下圖所示)。這非常關(guān)鍵,因?yàn)樗试S安全內(nèi)核向NT內(nèi)核指定將屬于安全池的物理頁面映射到的位置。

安全池VTL1與VTL0的DELTA值:

當(dāng)在VTL0內(nèi)核中運(yùn)行的軟件請(qǐng)求從安全池中分配一些內(nèi)存時(shí),將對(duì)安全內(nèi)核進(jìn)行安全調(diào)用,該調(diào)用將調(diào)用內(nèi)部RtlpHpAllocateHeap堆函數(shù),該函數(shù)在兩個(gè)VTL中都公開。如果Segment Heap計(jì)算出安全池中沒有剩余的可用內(nèi)存段,則將調(diào)用SkmmAllocatePoolMemory例程,該例程為池分配新的內(nèi)存頁。如果沒有需要,堆會(huì)避免提交新的內(nèi)存頁面。

與NT內(nèi)核公開的NtAllocateVirtualMemory API一樣,SkmmAllocatePoolMemory API支持兩種操作——保留和提交。保留操作允許安全內(nèi)核的內(nèi)存管理器保留池分配所需的一些PTE。提交操作實(shí)際上分配了空閑的物理頁面。

物理頁是從屬于安全內(nèi)核(其安全PFN處于安全狀態(tài))的一組空閑頁面中分配的,并映射到VTL 1的頁表中,這種情況就表明此前所有VTL 1分頁表層次結(jié)構(gòu)都已經(jīng)分配。與靜態(tài)KDP一樣,安全內(nèi)核會(huì)將ModifyVtlProtectionMask超級(jí)調(diào)用(hypercall)發(fā)送到虛擬機(jī)管理程序,目的是在VTL0 SLAT表中將物理頁面映射為只讀。在頁面變?yōu)閂TL0可訪問之后,安全內(nèi)核將復(fù)制調(diào)用方指定的數(shù)據(jù),并回調(diào)NT。

NT內(nèi)核使用內(nèi)存管理器提供的服務(wù)來映射VTL0中的客體物理頁。需要注意的是,VTL0和VTL1的整個(gè)root分區(qū)物理地址空間都通過身份映射進(jìn)行映射,這意味著在VTL0中有效的客體物理頁號(hào)在VTL1中也同樣有效。安全內(nèi)核要求NT內(nèi)存管理器準(zhǔn)確知道該頁面應(yīng)該映射到哪個(gè)虛擬地址,從而映射屬于安全池的頁面。而這一計(jì)算,就需要用到在先前第一階段中計(jì)算出的Delta值。

分配在VTL0中返回給調(diào)用方。與靜態(tài)KDP一樣,底層頁面也不能從VTL0中的任何實(shí)體寫入。

一些細(xì)心的讀者可能會(huì)注意到,上面描述的KDP僅涉及為支持特定受保護(hù)內(nèi)存的客體物理地址建立SLAT保護(hù)。KDP不會(huì)強(qiáng)制轉(zhuǎn)換映射受保護(hù)區(qū)域的虛擬地址范圍?,F(xiàn)在,安全內(nèi)核僅定期驗(yàn)證受保護(hù)的內(nèi)存區(qū)域轉(zhuǎn)換為適當(dāng)?shù)?、受SLAT保護(hù)的GPA。KDP的設(shè)計(jì)允許未來的擴(kuò)展性,可以對(duì)受保護(hù)內(nèi)存區(qū)域的地址轉(zhuǎn)換層次結(jié)構(gòu)進(jìn)行更直接地控制。

0x03 KDP在收件箱組件上的應(yīng)用

為了演示KDP如何提供有價(jià)值的兩個(gè)收件箱組件,我們重點(diǎn)介紹如何在CI.dll、Windows代碼完整性以及Windows Defender System Guard運(yùn)行時(shí)證明引擎中實(shí)現(xiàn)KDP。

首先,我們來介紹CI.dll。這里使用KDP的目的是在內(nèi)部策略狀態(tài)初始化后(即從注冊(cè)表中讀取,或在引導(dǎo)時(shí)生成)保護(hù)內(nèi)部策略狀態(tài)。這些數(shù)據(jù)結(jié)構(gòu)一旦被篡改則影響非常大,經(jīng)過正確簽名但容易受到攻擊的驅(qū)動(dòng)程序有可能會(huì)攻擊策略數(shù)據(jù)結(jié)構(gòu),然后在系統(tǒng)上安裝未經(jīng)簽名的驅(qū)動(dòng)程序。使用KDP,就可以確保策略數(shù)據(jù)結(jié)構(gòu)不被篡改,從而緩解這種攻擊。

對(duì)于Windows Defender System Guard,為了提供運(yùn)行時(shí)認(rèn)證,僅允許認(rèn)證代理連接到認(rèn)證驅(qū)動(dòng)程序一次。這是因?yàn)闋顟B(tài)存儲(chǔ)在VTL1內(nèi)存中。驅(qū)動(dòng)程序?qū)⑦B接狀態(tài)存儲(chǔ)在其內(nèi)存中,并且需要對(duì)其進(jìn)行保護(hù),以防止嘗試使用可能被篡改的代理重置連接。KDP可以鎖定這些變量,并確保只能在代理和驅(qū)動(dòng)程序之間建立單個(gè)連接。

代碼完整性和Windows Defender System Guard是安全核心PC的兩個(gè)關(guān)鍵功能。KDP增強(qiáng)了對(duì)這些重要安全系統(tǒng)的保護(hù),并提高了攻擊者破壞安全核心PC的技術(shù)門檻。

這些僅僅是幾個(gè)示例,來說明以只讀方式保護(hù)內(nèi)核和驅(qū)動(dòng)程序內(nèi)存對(duì)于系統(tǒng)的安全性和完整性的促進(jìn)。隨著KDP被更加廣泛地采用,我們希望能夠不斷擴(kuò)大保護(hù)的范圍,更廣泛地防御數(shù)據(jù)損壞攻擊。

0x04 使用KDP

除了運(yùn)行基于虛擬化的安全性這一要求之外,動(dòng)態(tài)KDP和靜態(tài)KDP都沒有其他要求。理想情況下,我們可以在任何支持下述功能的計(jì)算機(jī)上啟動(dòng)VBS:

1、Intel、AMD或ARM虛擬化擴(kuò)展;

2、二級(jí)地址轉(zhuǎn)換:AMD中稱為NPT,Intel中稱為EPT、ARM中稱為二級(jí)地址轉(zhuǎn)換;

3、硬件MBEC,可以降低與HVCI相關(guān)的性能成本(可選)。

有關(guān)VBS要求的更多信息,請(qǐng)參考這里(https://docs.microsoft.com/en-us/windows-hardware/design/device-experiences/oem-vbs)。在安全核心PC上,支持虛擬化的安全性,并且默認(rèn)啟用了硬件支持的安全性功能。大家可以從各種合作伙伴供應(yīng)商那里購買到具有核心安全功能的個(gè)人計(jì)算機(jī),目前已經(jīng)使用KDP進(jìn)行了加固。

THEEND

最新評(píng)論(評(píng)論僅代表用戶觀點(diǎn))

更多
暫無評(píng)論