亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        Windows內(nèi)存防護(hù)機(jī)制研究

        2017-11-23 07:09:05魯婷婷王俊峰
        關(guān)鍵詞:機(jī)制

        魯婷婷,王俊峰,2

        (1. 四川大學(xué)計(jì)算機(jī)學(xué)院,四川 成都 610065;2. 四川大學(xué)空天科學(xué)與工程學(xué)院,四川 成都 610065)

        Windows內(nèi)存防護(hù)機(jī)制研究

        魯婷婷1,王俊峰1,2

        (1. 四川大學(xué)計(jì)算機(jī)學(xué)院,四川 成都 610065;2. 四川大學(xué)空天科學(xué)與工程學(xué)院,四川 成都 610065)

        近30年來(lái),攻擊者利用Windows內(nèi)存漏洞發(fā)起的攻擊事件層出不窮,其慣用手段是攻擊控制數(shù)據(jù)以劫持執(zhí)行流。為此,微軟在Windows上加注了層層防護(hù)以遏止此類攻擊,但現(xiàn)階段部署的防護(hù)機(jī)制無(wú)法阻止針對(duì)非控制數(shù)據(jù)的攻擊。鑒于目前研究Windows內(nèi)存防護(hù)機(jī)制的文獻(xiàn)寥寥無(wú)幾,對(duì)Windows采用的各種內(nèi)存防護(hù)機(jī)制及其突破技術(shù)進(jìn)行了深入研究,并詳述非控制數(shù)據(jù)防護(hù)的研究現(xiàn)狀,在此基礎(chǔ)上,分析了Windows內(nèi)存防護(hù)面臨的挑戰(zhàn),并討論了內(nèi)存防護(hù)的未來(lái)之路。

        Windows內(nèi)存防護(hù);內(nèi)存防護(hù)機(jī)制;控制數(shù)據(jù)防護(hù);非控制數(shù)據(jù)防護(hù)

        1 引言

        近30年來(lái),針對(duì)內(nèi)存溢出漏洞發(fā)起的攻擊數(shù)不勝數(shù),從第一代網(wǎng)絡(luò)蠕蟲(chóng) Morris[1]到Heartbleed[2],每次攻擊都造成災(zāi)難性后果。此類攻擊大多通過(guò)緩沖區(qū)溢出修改影響程序執(zhí)行流程的控制數(shù)據(jù),如返回地址[3]、虛表指針[4]等,進(jìn)而劫持控制流,使其指向定制的shellcode,執(zhí)行惡意代碼以達(dá)到攻擊目標(biāo),如圖1所示。安全界針對(duì)此類攻擊的防護(hù)已有大量的研究成果,如控制流完整性(CFI, control flow integrity)[5]、代碼指針完整性(CPI, code-pointer integrity)[6]等,多種成熟的防護(hù)技術(shù)也已部署到商業(yè)應(yīng)用。但隨著控制數(shù)據(jù)防護(hù)技術(shù)的大范圍部署,另一類針對(duì)非控制數(shù)據(jù)的攻擊應(yīng)運(yùn)而生。非控制數(shù)據(jù)攻擊完全遵循合法的控制流,通過(guò)非法寫(xiě)程序的關(guān)鍵數(shù)據(jù)(如決策數(shù)據(jù)[7])或者讀敏感數(shù)據(jù)破壞數(shù)據(jù)的完整性和機(jī)密性[8],以達(dá)到改變執(zhí)行流、泄露安全信息或提升權(quán)限等目的,圖2為覆寫(xiě)決策數(shù)據(jù)改變程序分支的示意。針對(duì)非控制數(shù)據(jù)攻擊的防護(hù)研究也已有數(shù)十載,相繼提出了很多防護(hù)技術(shù),如數(shù)據(jù)流完整性(DFI, data flow integrity)[9]、數(shù)據(jù)空間隨機(jī)化(DSR, data space randomization)[10]等,但由于自身的局限性,目前此類防護(hù)技術(shù)還未能廣泛地部署到商業(yè)應(yīng)用。

        Windows作為全球占有量最大的桌面系統(tǒng),其安全性直接關(guān)乎高達(dá) 90%[11]個(gè)人計(jì)算機(jī)的安全。面對(duì)馮·諾依曼體系的天然缺陷,接二連三的內(nèi)存攻擊,微軟不得不在Windows系統(tǒng)上相繼部署層層防護(hù),如數(shù)據(jù)執(zhí)行保護(hù)(DEP, data execution prevention)[12]、控制流防護(hù)(CFG, control flow guard)[13]等,以加強(qiáng)系統(tǒng)的安全性。雖然這些內(nèi)存防護(hù)機(jī)制加大了攻擊的難度,但由于每種機(jī)制都受限于特定的條件,因此也給攻破層層防護(hù)留下了機(jī)會(huì)。從Windows XP到Windows 10,隨著系統(tǒng)的逐步加固,利用緩沖區(qū)溢出實(shí)施控制數(shù)據(jù)攻擊的事件逐漸減少,與此同時(shí),針對(duì)非控制數(shù)據(jù)的攻擊卻在增長(zhǎng),內(nèi)存防護(hù)仍任重道遠(yuǎn)。圖3展示了Windows已部署的內(nèi)存防護(hù)機(jī)制及非控制數(shù)據(jù)防護(hù)技術(shù)的研究成果。接下來(lái)對(duì)Windows上的每種內(nèi)存防護(hù)機(jī)制進(jìn)行詳細(xì)介紹,并指出其局限性和突破技術(shù);隨后介紹安全界針對(duì)非控制數(shù)據(jù)攻擊提出的各種防護(hù)方案;最后討論Windows內(nèi)存防護(hù)存在的挑戰(zhàn),以及未來(lái)之路。

        圖1 覆蓋返回地址劫持控制流

        圖2 覆寫(xiě)決策數(shù)據(jù)改變程序分支

        圖3 Windows已部署的內(nèi)存防護(hù)機(jī)制及非控制數(shù)據(jù)防護(hù)研究成果

        2 Windows已部署的內(nèi)存防護(hù)機(jī)制

        隨著緩沖區(qū)溢出漏洞利用的泛濫,微軟在每一次發(fā)布的Windows系統(tǒng)中都引入新的內(nèi)存保護(hù)機(jī)制,這些機(jī)制成功阻擾了很多針對(duì)控制數(shù)據(jù)的攻擊,使Windows平臺(tái)下能利用的漏洞大大減少。然而每種機(jī)制都受限于特定條件,這給攻擊者留下了突破的機(jī)會(huì)。

        2.1 GS安全編譯選項(xiàng)

        微軟在吸收StackGuard[14]技術(shù)的思想上,獨(dú)立開(kāi)發(fā)并在Windows XP SP2中引入GS[15]編譯技術(shù),在visual studio 2003及以后版本中默認(rèn)啟用此編譯選項(xiàng)。GS編譯選項(xiàng)為每個(gè)函數(shù)調(diào)用增加額外數(shù)據(jù)Security cookie和安全校驗(yàn)操作,以檢測(cè)溢出攻擊。在函數(shù)調(diào)用時(shí),系統(tǒng)以.data節(jié)中的第一個(gè)雙字作為Security cookie的種子,將其與函數(shù)棧幀棧頂指針ESP異或后的結(jié)果壓入棧中,作為當(dāng)前函數(shù)的 Security cookie;由于 Security cookie位于函數(shù)局部變量和函數(shù)返回地址之間,當(dāng)通過(guò)緩沖區(qū)溢出直接覆蓋返回地址時(shí),也會(huì)覆蓋Security cookie;在函數(shù)返回時(shí),系統(tǒng)執(zhí)行安全校驗(yàn)操作,將棧幀中的Security cookie還原并與保存在.data節(jié)中的Security cookie種子進(jìn)行一致性驗(yàn)證,若兩者不一致,表明棧幀中的 Security cookie遭到破壞,發(fā)生了溢出攻擊,立即進(jìn)入異常處理流程,反之函數(shù)正常返回。此過(guò)程如圖 4所示。

        除加入Security cookie之外,微軟在visual studio 2005及后續(xù)版本中使用了 Variables reordering[16]技術(shù),將字符串變量移動(dòng)到棧幀高地址,同時(shí)在棧幀低地址存儲(chǔ)指針類型和字符串類型參數(shù)的副本,避免溢出破壞局部變量和函數(shù)參數(shù)。此外,微軟在visual studio 2005 SP1引入新的安全標(biāo)識(shí)#pragma strict_gs_check[17],實(shí)現(xiàn)對(duì)不符合GS保護(hù)條件的函數(shù)添加保護(hù)。

        盡管GS能夠有效遏止直接修改返回地址的溢出攻擊,但其本身在設(shè)計(jì)上存在缺陷。一方面,GS只在函數(shù)返回時(shí)進(jìn)行一致性驗(yàn)證,在此之前沒(méi)有任何的安全檢查;另一方面,影響GS驗(yàn)證結(jié)果的Security cookie種子保存在.data節(jié)的固定位置;此外,若定義了安全處理函數(shù),其指針也將存放在.data節(jié)。因此大部分突破GS防護(hù)的技術(shù)都利用這三大缺陷,設(shè)法在函數(shù)返回之前劫持控制流、泄露.data節(jié)中的種子或同時(shí)修改棧幀中的Security cookie和.data節(jié)中的種子,修改保存在.data節(jié)中的安全處理函數(shù)指針。Litchfield[18]給出了多種突破GS防護(hù)機(jī)制的方案,如覆蓋異常處理函數(shù)指針、修改 cookie、重寫(xiě)安全處理函數(shù)指針等。

        圖4 GS防護(hù)機(jī)制原理示意

        2.2 SafeSEHamp;SEHOP

        結(jié)構(gòu)化異常處理(SEH, structured exception handling)[19]是Windows采用的異常處理機(jī)制,其關(guān)鍵結(jié)構(gòu) EXCEPTION_REGISTRATION包含2個(gè)重要的指針:SEH鏈表指針和異常處理函數(shù)指針,通過(guò)溢出覆蓋異常處理函數(shù)指針是Windows平臺(tái)下經(jīng)典的漏洞利用方式,從前述可知攻擊覆蓋異常處理函數(shù)指針也是突破 GS防護(hù)的重要手段。微軟在Windows XP SP2及Windows Vista SP1中分別引入SafeSEH和結(jié)構(gòu)化異常處理覆蓋保護(hù)(SEHOP, structured exception handling overwrite protection)機(jī)制,以加強(qiáng)對(duì)SEH的保護(hù)。

        SafeSEH在調(diào)用異常處理函數(shù)之前,對(duì)其進(jìn)行有效性驗(yàn)證。啟用/SafeSEH[20]鏈接選項(xiàng)的編譯器在編譯程序時(shí)將所有的異常處理函數(shù)地址提取出來(lái)存放到一張SafeSEH表中;當(dāng)調(diào)用異常處理函數(shù)時(shí),將其地址與SafeSEH表中的表項(xiàng)進(jìn)行匹配;若SafeSEH表中沒(méi)有與其地址匹配的表項(xiàng),表明其地址已被攻擊,立即終止異常處理函數(shù)調(diào)用,反之繼續(xù)調(diào)用。

        SEHOP[21]是對(duì) SafeSEH 的進(jìn)一步完善,其思想最初由 Miller[22]提出。程序一般有多個(gè)EXCEPTION_REGISTRATION結(jié)構(gòu),這些結(jié)構(gòu)組織成SEH鏈表存放在棧中,且此鏈末端保存系統(tǒng)默認(rèn)的異常處理。在攻擊異常處理函數(shù)指針時(shí),也會(huì)同時(shí)覆蓋指向下一個(gè)SEH結(jié)構(gòu)的指針,這樣SEH鏈就被破壞?;诖?,SEHOP在進(jìn)行SafeSEH校驗(yàn)之前,先檢查SEH鏈的完整性。如果SEH鏈中的最后一個(gè)異常處理函數(shù)指針沒(méi)有指向系統(tǒng)默認(rèn)的異常處理函數(shù)ntdll!FinalExceptionHandler,則SEH鏈被破壞,立即終止異常處理函數(shù)調(diào)用,反之繼續(xù)SafeSEH校驗(yàn)。整個(gè)SEH安全校驗(yàn)過(guò)程如圖5所示。

        SafeSEH和SEHOP對(duì)SEH的保護(hù)已經(jīng)相當(dāng)完善,能夠抵御大部分的SEH攻擊,但卻不能從根本上消除此類攻擊。SEHOP通過(guò)檢查SEH鏈的完整性實(shí)施安全防護(hù),事實(shí)上可以偽造SEH鏈[23],使其最后一個(gè)異常處理函數(shù)指針指向ntdll!FinalExceptionHandler,從而通過(guò)檢查。對(duì)于SafeSEH,本身在實(shí)現(xiàn)時(shí)就有多個(gè)限制條件,Sotirov[24]在2008年Black Hat大會(huì)上提出了多種繞過(guò)SafeSEH的技術(shù)。

        2.3 DEP

        微軟在Windows XP SP2中引入DEP[12]來(lái)彌補(bǔ)數(shù)據(jù)與代碼混淆存儲(chǔ)的缺陷,將數(shù)據(jù)所在頁(yè)面標(biāo)識(shí)為不可執(zhí)行,當(dāng)溢出成功轉(zhuǎn)向shellcode時(shí),會(huì)企圖在數(shù)據(jù)頁(yè)執(zhí)行指令,此時(shí)拋出異常,從而遏止shellcode的執(zhí)行。

        硬件DEP需要CPU和操作系統(tǒng)的雙重支持,2004年以后發(fā)行的CPU都支持DEP。要實(shí)現(xiàn)此功能,需在頁(yè)表項(xiàng)中添加新的標(biāo)志位NX/XD,以標(biāo)識(shí)是否允許在頁(yè)面上執(zhí)行指令。當(dāng) NX/XD設(shè)置為1時(shí),表示頁(yè)面不允許執(zhí)行指令;當(dāng)為0時(shí),表示頁(yè)面允許執(zhí)行指令。在 CPU不支持硬件NX/XD時(shí),軟件DEP通過(guò)檢查SEH異常處理函數(shù)指針,確保其位于可執(zhí)行頁(yè)的.text節(jié)。

        圖5 SEH安全校驗(yàn)機(jī)制原理示意

        出于兼容性考慮,Windows并不能對(duì)所有進(jìn)程都開(kāi)啟DEP保護(hù),尤其是無(wú)法確定一些第三方插件DLL是否支持DEP,對(duì)涉及這些DLL的程序一般都不會(huì)開(kāi)啟DEP。DEP將數(shù)據(jù)頁(yè)標(biāo)識(shí)為不可執(zhí)行,以防止攻擊,但對(duì)于可寫(xiě)可執(zhí)行頁(yè),DEP不起作用,典型的例子是JVM為JAVA對(duì)象或其他數(shù)據(jù)分配的是可寫(xiě)可執(zhí)行頁(yè)面,便可利用heap spray布局shellcode實(shí)施攻擊。另一種突破思路是代碼重用,在.text節(jié)中找到可重用的gadget組成具有一定攻擊目的的shellcode,面向返回的編程(ROP, return-orient programming)[25,26]是代碼重用的成熟技術(shù),ret2libc[27]技術(shù)也可看作 ROP的特例。

        2.4 ASLR

        前述的所有防護(hù)機(jī)制都是針對(duì)控制數(shù)據(jù)的攻擊,這類攻擊都需要一個(gè)明確的跳轉(zhuǎn)地址,用來(lái)覆蓋控制數(shù)據(jù)。地址空間布局隨機(jī)化(ASLR,address space layout randomization)[28]是一種地址隨機(jī)化技術(shù),在加載程序時(shí)不再使用固定的基址加載,從而增大定位跳轉(zhuǎn)地址的難度。

        Whitehouse[29]詳細(xì)介紹了映像隨機(jī)化、堆棧隨機(jī)化、進(jìn)程環(huán)境塊(PEB, process environment block)與線程環(huán)境塊(TEB, thread environment block)隨機(jī)化。映像隨機(jī)化在系統(tǒng)每次重啟時(shí)實(shí)現(xiàn)可執(zhí)行文件(PE, portable executable)加載基址隨機(jī)化,使通用跳板指令的地址不再固定。堆棧隨機(jī)化在程序每次運(yùn)行時(shí)隨機(jī)地選擇堆?;?,增大攻擊 SHE結(jié)構(gòu)、虛表指針等堆棧數(shù)據(jù)的難度。PEB和TEB不再使用固定的加載基址,增加攻擊其中的函數(shù)指針難度。

        ASLR給定位shellcode的跳轉(zhuǎn)地址帶來(lái)了巨大挑戰(zhàn),固定的跳轉(zhuǎn)地址只在系統(tǒng)重啟前甚至是程序的本次運(yùn)行中才有效。但ASLR仍然留下了可利用的缺陷。映像隨機(jī)化只對(duì)模塊加載基址的前2個(gè)字節(jié)做了隨機(jī)處理,后2個(gè)字節(jié)保持不變,加之并沒(méi)有對(duì)指令序列進(jìn)行隨機(jī)化,故通用跳板、虛表指針等數(shù)據(jù)相對(duì)于加載基址的位置不變,如此便可利用“相對(duì)尋址”的概念動(dòng)態(tài)地進(jìn)行部分覆蓋[24,30]以定位跳轉(zhuǎn)地址。堆?;冯S機(jī)化使程序每次運(yùn)行時(shí)變量地址不同,但只能用來(lái)防止精準(zhǔn)攻擊,無(wú)法防御只需大概的地址范圍就可實(shí)施攻擊的技術(shù),如heap spray[31]。PEB和TEB即使完全隨機(jī)化,也可以通過(guò)FS寄存器確定其地址,防護(hù)能力很有限。

        2.5 CFG

        微軟在Windows 8.1 update 3和Windows 10中引入 CFG[13],進(jìn)一步加固了內(nèi)存防護(hù)堡壘。CFG是目前針對(duì)控制數(shù)據(jù)攻擊的最強(qiáng)防護(hù),主要通過(guò)檢驗(yàn)間接跳轉(zhuǎn)地址的有效性來(lái)防范攻擊。

        編譯程序時(shí)啟動(dòng)/guard:cf[32]選項(xiàng),編譯器會(huì)分析出程序中所有間接調(diào)用地址,將其保存在Guard CF function table中,并在所有函數(shù)調(diào)用之前插入一段校驗(yàn)代碼;當(dāng)程序加載運(yùn)行時(shí),將進(jìn)程空間中的每8個(gè)字節(jié)映射到CFGBitmap中的一位,如果8個(gè)字節(jié)中包含一個(gè)函數(shù)地址,對(duì)應(yīng)位置為1,如此Guard CF function table中的每個(gè)地址都會(huì)轉(zhuǎn)換成CFGBitmap中的對(duì)應(yīng)比特位。間接調(diào)用之前,將先以目標(biāo)地址為參數(shù)調(diào)用校驗(yàn)函數(shù)ntdll!LdrpValidateUserCallTarget(由函數(shù)指針_guard_check_icall_fptr指向),訪問(wèn)CFGBitmap,若以目標(biāo)地址索引到的CFGBitmap位為1,表明目標(biāo)是一個(gè)有效的函數(shù)地址,進(jìn)行間接調(diào)用;若為0,表明目標(biāo)無(wú)效,或許已被攻擊,拋出異常,終止間接調(diào)用。此過(guò)程如圖6所示。

        盡管CFG是強(qiáng)有力的防護(hù)措施,但CFG并不是完美無(wú)缺的。Tang[33]已詳細(xì)分析了CFG機(jī)制的缺陷,如CFGBitmap空間基址固定且能獲取、調(diào)用 NtAllocVirtualMemory 函數(shù)分配的可執(zhí)行虛擬內(nèi)存對(duì)應(yīng)的CFGBitmap位全為1等。有缺陷就有突破的機(jī)會(huì),可以通過(guò)獲取CFGBitmap基址改寫(xiě)特定位狀態(tài),使間接目標(biāo)地址合法;借助虛擬內(nèi)存操作NtAllocVirtualMemory定制位圖,繞過(guò)CFG檢驗(yàn)。此外,CFG只對(duì)函數(shù)指針進(jìn)行有效性檢查,并沒(méi)有檢查返回地址,因此另一種繞過(guò)CFG的方法是設(shè)法攻擊返回地址。Theori[34]在其博士論文中詳細(xì)介紹了基于Chakra JIT繞過(guò)CFG機(jī)制的方法。2017年Black Hat ASIA大會(huì)上,Sun[35]介紹了利用目標(biāo)地址指針可寫(xiě)并且不受 CFG保護(hù)的memory-based 間接調(diào)用來(lái)繞過(guò)CFG。

        2.6 RFG

        微軟部署的 CFG防護(hù)并沒(méi)有執(zhí)行完全的CFI[5],CFG只檢查函數(shù)指針,而沒(méi)有檢查返回地址,也就無(wú)法防御針對(duì)返回地址[3]的攻擊或ROP[25,26]攻擊。為了彌補(bǔ)這一缺陷,2016年微軟又引入了返回流防護(hù)(RFG, return flow guard)[36]。

        RFG將返回地址保存到fs:[rsp],并在函數(shù)返回前將其與棧上返回地址進(jìn)行比較,從而有效阻止了針對(duì)返回地址的攻擊。開(kāi)啟RFG需要操作系統(tǒng)和編譯器的雙重支持,在編譯階段,編譯器會(huì)以nop指令的形式在目標(biāo)函數(shù)的首尾預(yù)留出指令空間。當(dāng)目標(biāo)可執(zhí)行文件在支持并開(kāi)啟RFG的系統(tǒng)上運(yùn)行時(shí),預(yù)留的指令空間會(huì)在加載階段被替換為RFG指令,首部替換的指令用來(lái)讀取函數(shù)的返回地址,并將該地址存放到fs:[rsp],尾部替換的指令在函數(shù)返回時(shí)檢查棧中的返回地址是否與fs:[rsp]中的一致,若一致,函數(shù)正常返回;若不一致,表明可能受到攻擊,將跳轉(zhuǎn)到_guard_ss_verify_failure,引發(fā)int29異常,進(jìn)程崩潰,從而阻止惡意攻擊的進(jìn)行。在不支持RFG的操作系統(tǒng)上運(yùn)行時(shí),這些nop指令不會(huì)影響程序的執(zhí)行流程。RFG防護(hù)原理如圖7所示。RFG將返回地址保存到攻擊者不可控制的Thread Control Stack,極大增加了后向轉(zhuǎn)移攻擊的難度與代價(jià),其與CFG的結(jié)合可實(shí)現(xiàn)對(duì)控制流比較完善的防護(hù)。

        圖6 CFG防護(hù)原理示意

        2.7 堆區(qū)防護(hù)技術(shù)

        除了以上防護(hù)機(jī)制外,微軟專門(mén)針對(duì)堆區(qū)增加了很多安全校驗(yàn)機(jī)制。Sotirov[24]在2008年Black Hat大會(huì)上詳細(xì)介紹了 Safe unlinking、Heap metadata cookies和 Heap metadata encryption堆區(qū)防護(hù)技術(shù)。Safe unlinking是在分配堆塊時(shí),先驗(yàn)證堆塊前向指針flink和后向指針blink的完整性,若完整性被破壞,將進(jìn)行異常處理,反之才分配堆塊,此過(guò)程如圖 8所示。Heap metadata cookies類似于 GS的 Security cookie,主要在堆塊塊首加入安全cookie,以防止利用溢出覆蓋塊首中的 flink和 blink。Heap metadata encryption將堆塊塊首的重要數(shù)據(jù)與一個(gè)4 byte隨機(jī)數(shù)異或后進(jìn)行存儲(chǔ),以防止直接破壞這些數(shù)據(jù)。雖然這些技術(shù)可以減少堆區(qū)攻擊,但不難看出,大多都是對(duì)堆塊結(jié)構(gòu)的防護(hù),而沒(méi)有對(duì)堆區(qū)存儲(chǔ)的數(shù)據(jù)進(jìn)行保護(hù),如果攻擊堆區(qū)存儲(chǔ)的函數(shù)指針等關(guān)鍵數(shù)據(jù),其后果不堪設(shè)想,因此這些機(jī)制的局限性很大。在Windows 10中,微軟又加入了Heap allocation randomization[37],每個(gè)新分配的堆塊都會(huì)加上一個(gè)隨機(jī)的偏移量,從而增大定位堆溢出目標(biāo)的難度;此外,在堆塊前后分別加入了 Heap guard pages[37],凡企圖通過(guò)溢出攻擊堆塊,都會(huì)引起保護(hù)頁(yè)的修改,而修改保護(hù)頁(yè)的行為被視為內(nèi)存破壞操作,此時(shí)系統(tǒng)就會(huì)立即終止程序。

        圖7 RFG防護(hù)原理示意

        圖8 Safe unlinking防護(hù)示意

        3 非控制數(shù)據(jù)防護(hù)方案

        上述都是微軟采用的針對(duì)控制數(shù)據(jù)攻擊的防護(hù)機(jī)制,目前微軟還沒(méi)有部署針對(duì)非控制數(shù)據(jù)攻擊的系統(tǒng)級(jí)防護(hù)措施,但此類攻擊卻頻頻出現(xiàn),而且危害極其嚴(yán)重。例如,攻擊者利用2014年披露的 Heartbleed[2]漏洞實(shí)施攻擊,導(dǎo)致大量 Web服務(wù)器上的私鑰、cookie及密碼泄露,造成巨大的經(jīng)濟(jì)損失。由于非控制數(shù)據(jù)攻擊完全遵循合法的控制流,所以現(xiàn)有的防護(hù)機(jī)制無(wú)法阻止非控制數(shù)據(jù)攻擊;而且隨著控制數(shù)據(jù)防護(hù)的逐步加固,可以預(yù)見(jiàn),針對(duì)非控制數(shù)據(jù)的攻擊將紛沓而至;但就在此類防護(hù)還沒(méi)有大范圍部署的情況下,研究人員卻已提出多種利用方案,如 Data-Oriented Exploits[38]和面向數(shù)據(jù)的編程(DOP, data-oriented programming)[39]等,因此對(duì)于非控制數(shù)據(jù)的防護(hù)迫在眉睫。

        自 Chen等[7]首次分析了非控制數(shù)據(jù)攻擊的嚴(yán)重危害之后,安全界陸陸續(xù)續(xù)提出多種針對(duì)非控制數(shù)據(jù)攻擊的防護(hù)技術(shù),如 DFI[9]、DSR[10]、寫(xiě)完整性檢查(WIT, write integrity testing)[40]和數(shù)據(jù)機(jī)密性與完整性(DCI, data confidentiality and integrity)[8]等,其中也不乏能同時(shí)防護(hù)控制數(shù)據(jù)和非控制數(shù)據(jù)的方案。

        3.1 DIFT

        Suh等[41]在2004年ASPLOS會(huì)議上提出動(dòng)態(tài)信息流追蹤(DIFT, dynamic information flow tracking),盡管DIFT最初實(shí)現(xiàn)并不是為了防護(hù)非控制數(shù)據(jù)攻擊,但可以將其應(yīng)用到非控制數(shù)據(jù)防護(hù)。DIFT通過(guò)追蹤并監(jiān)控I/O數(shù)據(jù)的使用來(lái)實(shí)現(xiàn)防護(hù),主要有3部分工作:首先,操作系統(tǒng)將來(lái)自I/O的潛在惡意數(shù)據(jù)標(biāo)記為不可信數(shù)據(jù);運(yùn)行時(shí),處理器根據(jù)每條指令的操作數(shù)和操作類型來(lái)傳播不可信數(shù)據(jù),即動(dòng)態(tài)信息流追蹤;當(dāng)處理器檢測(cè)到一個(gè)可疑的不可信數(shù)據(jù)操作,立即生成一個(gè)陷阱,并交由操作系統(tǒng)的陷阱處理器處理,若陷阱處理器檢測(cè)到該操作違背了安全策略,將立即終止程序。防護(hù)原理如圖9所示。

        DIFT防護(hù)對(duì)應(yīng)用完全透明,不需要對(duì)程序進(jìn)行任何修改,由操作系統(tǒng)和處理器實(shí)現(xiàn),而且執(zhí)行開(kāi)銷相當(dāng)小,僅有1.1%。但DIFT在實(shí)現(xiàn)之初存在一個(gè)嚴(yán)重的問(wèn)題,采用寬松的不可信數(shù)據(jù)追蹤規(guī)則,這導(dǎo)致引入了不必要的陷阱。

        圖9 DIFT防護(hù)原理

        3.2 Pointer Taintedness Detection

        Chen等[42]繼首次分析非控制數(shù)據(jù)攻擊的危害后,在 2005年 DSN會(huì)議上提出了 Pointer Taintedness Detection技術(shù)。該技術(shù)主要基于指針污染的概念實(shí)現(xiàn)攻擊檢測(cè)與防護(hù),一個(gè)污染指針是指其值直接或間接地來(lái)自用戶輸入的數(shù)據(jù),對(duì)污染指針的非法解引用被視為一起惡意攻擊。為實(shí)現(xiàn)污染,首先擴(kuò)展了內(nèi)存模型,為每個(gè)字節(jié)都增加了額外的污染位;當(dāng)外部數(shù)據(jù)存入內(nèi)存時(shí),污染位被設(shè)置;處理器運(yùn)行時(shí),污染位將隨著每條指令對(duì)污染數(shù)據(jù)的操作而傳播;一旦包含污染位的數(shù)據(jù)被用作內(nèi)存訪問(wèn)的地址,便認(rèn)為發(fā)生了污染指針的非法解引用,處理器將拋出異常,操作系統(tǒng)處理異常并終止進(jìn)程,從而遏止攻擊。

        Pointer Taintedness Detection是一個(gè)處理器級(jí)的防護(hù)技術(shù),對(duì)應(yīng)用完全透明,因此不需要重編譯/鏈接,并且能同時(shí)防護(hù)控制數(shù)據(jù)攻擊和非控制數(shù)據(jù)攻擊。從實(shí)現(xiàn)原理看,Pointer Taintedness Detection與DIFT都要對(duì)來(lái)自外部的數(shù)據(jù)進(jìn)行標(biāo)記,只是指針污染引入污染位進(jìn)行標(biāo)記,而DIFT是軟件標(biāo)記方式,因此指針污染分析的執(zhí)行開(kāi)銷更小,但加入污染位增加了硬件開(kāi)銷。此外,Chen等[42]的實(shí)驗(yàn)結(jié)果表明,Pointer Taintedness Detection尚沒(méi)有發(fā)現(xiàn)已知的誤報(bào),換言之,誤報(bào)率比較低,逼近 0。盡管指針污染防護(hù)能檢測(cè)大范圍的內(nèi)存破壞,但并不能保證 100%的覆蓋,因此仍存在漏報(bào)。

        3.3 DFI

        Castro等[9]在2006年的OSDI會(huì)議上提出了針對(duì)非控制數(shù)據(jù)攻擊的防護(hù)技術(shù)數(shù)據(jù)流完整性(DFI, data flow integrity)。DFI通過(guò)檢查變量操作是否符合數(shù)據(jù)流來(lái)防范針對(duì)非控制數(shù)據(jù)的攻擊。首先,通過(guò)靜態(tài)的定義可達(dá)性分析獲得程序的數(shù)據(jù)流圖(DFG, data flow graph),并在每個(gè)變量寫(xiě)操作之前插入檢測(cè)指令;運(yùn)行時(shí),對(duì)每個(gè)變量進(jìn)行實(shí)際的定義可達(dá)性分析,將其最后一條寫(xiě)指令的 identifier存入運(yùn)行時(shí)定義表(RDT, runtime definitions table);當(dāng)讀一個(gè)變量時(shí),先以變量地址索引 RDT表中的 identifier,再檢查 identifier是否存在于靜態(tài)DFG,若不存在,數(shù)據(jù)流完整性被破壞,拋出異常。此過(guò)程如圖10所示。DFI通過(guò)流敏感的過(guò)程內(nèi)分析和上下文敏感的過(guò)程間分析生成可達(dá)性定義,流敏感的過(guò)程內(nèi)分析計(jì)算在函數(shù)內(nèi)聲明的局部變量的可達(dá)性定義,上下文敏感的過(guò)程間分析計(jì)算在函數(shù)外聲明的變量的可達(dá)性定義。

        DFI是一個(gè)比較通用的防御技術(shù),可以同時(shí)防護(hù)控制數(shù)據(jù)攻擊和非控制數(shù)據(jù)攻擊,可自動(dòng)應(yīng)用到C/C++程序而不需要任何的修改。但DFI的實(shí)現(xiàn)相對(duì)保守,為變量的每個(gè)讀操作都包含了所有的可達(dá)性定義,這些可達(dá)性定義對(duì)某些讀操作來(lái)說(shuō)可能是多余的,因此 DFI不精確,存在漏報(bào);此外 DFI是一個(gè)全局防護(hù)技術(shù),對(duì)所有變量進(jìn)行檢查而沒(méi)有考慮變量的安全敏感性,因此執(zhí)行開(kāi)銷大。

        圖10 DFI防護(hù)流程

        3.4 DSR

        繼ASLR[28]和指令集隨機(jī)化(ISR, instruction set randomization)[43,44]之后,2008年Bhatkar等[10]提出了另一種隨機(jī)化技術(shù)數(shù)據(jù)空間隨機(jī)化(DSR,data space randomization)。DSR對(duì)內(nèi)存數(shù)據(jù)進(jìn)行隨機(jī)化處理,同一等價(jià)類中的變量使用相同掩碼進(jìn)行加密存儲(chǔ),不同等價(jià)類使用不同掩碼,讀變量時(shí)再使用該掩碼異或得到實(shí)際數(shù)據(jù)。DSR的工作主要分為3步:首先,利用Steensgaard[45]指針?lè)治龇Q定不同數(shù)據(jù)的掩碼;隨后,生成程序的指針指向圖(points-to graph),用來(lái)計(jì)算等價(jià)類,以便為其分配掩碼;最后對(duì)程序中的變量進(jìn)行轉(zhuǎn)換,即用變量與其掩碼的異或值替換變量本身。

        相比于ASLR和ISR只能防御控制數(shù)據(jù)攻擊,DSR亦能防護(hù)非控制數(shù)據(jù)攻擊。相對(duì)于DFI運(yùn)行時(shí)平均代價(jià)44%~103%[9],DSR性能開(kāi)銷更低,平均只有15%。鑒于C語(yǔ)言中指針的使用,很難為每個(gè)變量分配唯一的掩碼,因此DSR使用了等價(jià)類的概念為指針解引用相同的變量分配同一個(gè)掩碼,計(jì)算等價(jià)類依賴于points-to graph生成算法,DSR使用Steensgaard算法,而Steensgaard算法將相同指針指向的變量合成一個(gè)節(jié)點(diǎn),因此算法的效率較高,但同時(shí)導(dǎo)致分析不精確。

        3.5 WIT

        Akritidis等[40]在2008年的IEEE Samp;P會(huì)議上提出了一種可以同時(shí)防護(hù)控制數(shù)據(jù)攻擊和非控制數(shù)據(jù)攻擊的技術(shù)寫(xiě)完整性檢查(WIT, write integrity testing)。在編譯階段,WIT利用過(guò)程間的points-to分析計(jì)算程序的控制流圖和程序中可寫(xiě)的對(duì)象集;運(yùn)行時(shí),WIT執(zhí)行寫(xiě)完整性檢查,阻止指令對(duì)非靜態(tài)分析的可寫(xiě)對(duì)象集之外的其他對(duì)象進(jìn)行寫(xiě)操作,并執(zhí)行控制流完整性,確??刂妻D(zhuǎn)移遵循靜態(tài)控制流圖。具體來(lái)說(shuō),WIT通過(guò)points-to分析為可寫(xiě)的對(duì)象和其相應(yīng)的寫(xiě)指令分配相同的顏色,并將其顏色保存到顏色表中,執(zhí)行寫(xiě)完整性檢查時(shí),再在顏色表中查找寫(xiě)對(duì)象的顏色并將其與寫(xiě)指令的顏色進(jìn)行比較,不一致表明違背了寫(xiě)完整性,將拋出異常;對(duì)于控制流防護(hù)也一樣,為間接調(diào)用指令和其對(duì)應(yīng)的目標(biāo)地址分配相同的顏色值,執(zhí)行間接調(diào)用檢查時(shí),比較目標(biāo)地址與間接調(diào)用指令的顏色是否相同,不同表明發(fā)生了控制流劫持,拋出異常。此過(guò)程如圖11所示。

        WIT利用靜態(tài)分析和動(dòng)態(tài)插樁檢測(cè)確保寫(xiě)完整性和控制流完整性,有力防護(hù)針對(duì)控制數(shù)據(jù)和非控制數(shù)據(jù)的攻擊;通過(guò)靜態(tài)分析決定安全對(duì)象(不會(huì)違背寫(xiě)完整性的對(duì)象),只對(duì)不安全的可寫(xiě)對(duì)象執(zhí)行寫(xiě)完整性,減少不必要的安全檢查,降低了執(zhí)行開(kāi)銷(平均7%);同時(shí)WIT編譯C/C++程序時(shí)不需要對(duì)其進(jìn)行任何修改。但WIT并不是很完美,靜態(tài)分析時(shí)利用points-to計(jì)算不安全對(duì)象,只對(duì)其進(jìn)行完整性檢查,雖然降低了執(zhí)行開(kāi)銷,但限于points-to分析的精度,無(wú)法保證100%的覆蓋,可能會(huì)存在漏報(bào)的情況;此外,WIT只對(duì)寫(xiě)操作進(jìn)行了完整性檢查,并沒(méi)有對(duì)讀操作進(jìn)行安全檢查,因此仍然無(wú)法阻止信息泄露;另外在實(shí)現(xiàn)WIT時(shí)需要維護(hù)顏色表,引入了額外的空間開(kāi)銷。

        圖11 WIT防護(hù)過(guò)程

        3.6 SIDAN

        2009年,Demay等[46]構(gòu)建了一個(gè)面向非控制數(shù)據(jù)攻擊的檢測(cè)模型 SIDAN(software instrumentation for detecting attacks on non-control-data)。SIDAN主要通過(guò)驗(yàn)證系統(tǒng)調(diào)用所依賴的數(shù)據(jù)項(xiàng)(系統(tǒng)調(diào)用參數(shù)及影響系統(tǒng)調(diào)用執(zhí)行的條件變量)狀態(tài)的一致性來(lái)檢測(cè)內(nèi)存錯(cuò)誤,從而檢測(cè)非控制數(shù)據(jù)攻擊。首先進(jìn)行靜態(tài)分析,利用程序依賴圖(PDG, program dependency graph)獲取每個(gè)系統(tǒng)調(diào)用所依賴的變量集,導(dǎo)出這些變量之間的約束,從而建立起一個(gè)數(shù)據(jù)行為模型,同時(shí)在系統(tǒng)調(diào)用之前加入合理性檢查;運(yùn)行時(shí),檢測(cè)系統(tǒng)調(diào)用所依賴的變量是否符合靜態(tài)分析的約束,如不符合,說(shuō)明發(fā)生了非法系統(tǒng)調(diào)用。

        鑒于在系統(tǒng)調(diào)用點(diǎn)并不是所有變量都可見(jiàn),SIDAN并不能對(duì)所有的系統(tǒng)調(diào)用都進(jìn)行檢查。檢查時(shí)在每個(gè)函數(shù)調(diào)用中插入斷言來(lái)檢測(cè)執(zhí)行路徑上可見(jiàn)并影響系統(tǒng)調(diào)用的變量,所以SIDAN的檢測(cè)精度依賴于生成的斷言數(shù)量和質(zhì)量,但無(wú)法保證所有的斷言都被發(fā)現(xiàn),因此SIDAN存在漏報(bào)。但如果違背了變量約束,說(shuō)明發(fā)生了非控制數(shù)據(jù)攻擊,因此沒(méi)有誤報(bào)。

        3.7 ValueGuard

        ValueGuard[47]的原理十分簡(jiǎn)單,主要借鑒StackGuard[14]思想,只是將其防護(hù)對(duì)象從返回地址擴(kuò)展到了所有變量,所以可防御非控制數(shù)據(jù)攻擊。ValueGuard在每個(gè)變量前加入canary,并將canary及變量封裝成一個(gè)結(jié)構(gòu)體,在使用變量時(shí),先檢查canary的完整性,若被破壞,表明發(fā)生了溢出攻擊,立即終止程序。ValueGuard對(duì)所有變量進(jìn)行保護(hù),代價(jià)相當(dāng)大;而且由其實(shí)現(xiàn)原理可知,ValueGuard只能檢測(cè)通過(guò)溢出覆蓋非控制數(shù)據(jù)的攻擊;而且實(shí)現(xiàn)ValueGuard需要進(jìn)行重編譯,因此 ValueGuard并不適用于商業(yè)應(yīng)用。

        圖12 DCI防護(hù)流程

        3.8 DCI

        前述的非控制數(shù)據(jù)防護(hù)技術(shù)大部分都是對(duì)程序的所有數(shù)據(jù)進(jìn)行檢查,而這些數(shù)據(jù)中有大量非安全敏感數(shù)據(jù),所以引入了不必要的開(kāi)銷,致使其無(wú)法應(yīng)用于商業(yè)軟件。為了應(yīng)對(duì)這一情況,Carr等[8]在2017年ASIA CCS會(huì)議上提出了數(shù)據(jù)機(jī)密性與完整性(DCI, data confidentiality and integrity)[8]。DCI按照類型將數(shù)據(jù)分為安全敏感數(shù)據(jù)和不敏感數(shù)據(jù),只對(duì)敏感數(shù)據(jù)進(jìn)行精確的空間和時(shí)間安全檢測(cè);對(duì)于不敏感數(shù)據(jù),DCI只進(jìn)行粗粒度的邊界檢查,從而降低執(zhí)行開(kāi)銷??臻g安全檢測(cè)通常涉及越界的指針解引用,時(shí)間安全檢測(cè)通常涉及未初始化或已釋放的指針解引用。DCI在C/C++語(yǔ)言中引入注解,允許程序員定義保護(hù)類型(安全敏感數(shù)據(jù)類型),運(yùn)行時(shí),DCI禁止對(duì)此類型數(shù)據(jù)的非法讀或?qū)?,從而保證了數(shù)據(jù)的機(jī)密性和完整性。具體流程如下。首先程序員向源代碼中加入注解定義程序中的敏感數(shù)據(jù)類型。編譯時(shí),識(shí)別敏感變量及相關(guān)數(shù)據(jù)流,加入安全檢測(cè)程序。運(yùn)行時(shí),遵循隨后策略進(jìn)行安全檢查。1) 對(duì)于敏感數(shù)據(jù):檢查指向敏感數(shù)據(jù)的指針解引用是否在相關(guān)的內(nèi)存對(duì)象邊界內(nèi)或者是否是有效的內(nèi)存對(duì)象,若不在邊界內(nèi)或不是有效的對(duì)象,表明發(fā)生了越界讀或非法寫(xiě),破壞了數(shù)據(jù)機(jī)密性或完整性,立即終止程序;2) 對(duì)于非敏感數(shù)據(jù):檢查其指針解引用是否在敏感數(shù)據(jù)內(nèi)存區(qū),若是,終止程序;3) 敏感數(shù)據(jù)和非敏感數(shù)據(jù)之間禁止任何的數(shù)據(jù)流。此過(guò)程如圖12所示。

        DCI將數(shù)據(jù)分為安全敏感數(shù)據(jù)和非敏感數(shù)據(jù),對(duì)非敏感數(shù)據(jù)進(jìn)行粗粒度的安全檢測(cè),從而降低了開(kāi)銷,同時(shí)對(duì)敏感數(shù)據(jù)進(jìn)行精確的安全檢查,實(shí)現(xiàn)對(duì)非控制數(shù)據(jù)的防護(hù),兼顧了性能與效能。但DCI需要程序員定義敏感數(shù)據(jù)類型,如此DCI的防護(hù)效能就依賴于程序員的專業(yè)素質(zhì);同時(shí)由于人工干預(yù),DCI無(wú)法實(shí)現(xiàn)自動(dòng)分析敏感數(shù)據(jù)類型。另外,由于人工定義敏感數(shù)據(jù)類型難免有疏漏,若將敏感數(shù)據(jù)誤判為非敏感數(shù)據(jù),而DCI又對(duì)非敏感數(shù)據(jù)只進(jìn)行粗粒度安全檢測(cè),最終還是可以通過(guò)修改非敏感數(shù)據(jù)實(shí)施攻擊。

        無(wú)論是Windows已部署的針對(duì)控制數(shù)據(jù)的防護(hù)機(jī)制還是未部署的非控制數(shù)據(jù)防護(hù)技術(shù),在實(shí)現(xiàn)上或多或少都存在問(wèn)題,但就效能來(lái)說(shuō),都起到很好的防護(hù)作用,表1對(duì)各類防護(hù)方案的優(yōu)缺點(diǎn)進(jìn)行了分析。

        表1 各類防護(hù)方案分析

        4 結(jié)束語(yǔ)

        隨著Windows每個(gè)版本的發(fā)布,都會(huì)引進(jìn)大量的內(nèi)存防護(hù)機(jī)制,系統(tǒng)的安全性在不斷加強(qiáng)。雖然微軟已為堆棧等內(nèi)存區(qū)加注了層層防護(hù),增大了攻擊此區(qū)域內(nèi)控制數(shù)據(jù)的難度,也成功遏止了大部分的控制流劫持攻擊。但每種防護(hù)機(jī)制,鑒于實(shí)現(xiàn)時(shí)的限制條件,多多少少都存在可以繞過(guò)的缺陷,甚至激發(fā)出成熟的突破技術(shù)。對(duì)于GS[15]防護(hù),關(guān)鍵的校驗(yàn)數(shù)據(jù)Security cookie可以通過(guò)各種方式被泄露;偽造SEH鏈亦能通過(guò)SEH安全校驗(yàn)機(jī)制[23];而DEP[12]和ASLR[28]又分別促進(jìn)ROP[25,26]和heap spray[31]技術(shù)的發(fā)展,而且由于兼容性問(wèn)題,很多第三方應(yīng)用的DLL并不支持DEP,ASLR也只對(duì)加載基址進(jìn)行隨機(jī)化,并沒(méi)有實(shí)施 ISR[43,44]對(duì)指令序列進(jìn)行隨機(jī)化,仍無(wú)法阻止部分覆蓋攻擊[24];CFG[13]和RFG[36]盡管對(duì)控制流進(jìn)行了強(qiáng)有力的防護(hù),但并沒(méi)有實(shí)現(xiàn)完全的CFI[5],只是通過(guò)對(duì)目標(biāo)程序進(jìn)行靜態(tài)分析獲得所有間接跳轉(zhuǎn)地址,在運(yùn)行時(shí)將間接跳轉(zhuǎn)地址與靜態(tài)分析的結(jié)果進(jìn)行簡(jiǎn)單的匹配來(lái)檢查間接跳轉(zhuǎn)地址的有效性,并沒(méi)有實(shí)施Path-sensitive CFI[48]、Context-sensitive CFI[49]和 CPI[6],仍無(wú)法完全遏止控制流劫持攻擊(如 call-oriented programming[50]),因此對(duì)已部署的控制數(shù)據(jù)防護(hù)機(jī)制仍需進(jìn)一步完善。

        此外,微軟目前還沒(méi)有在Windows上部署針對(duì)非控制數(shù)據(jù)攻擊的防護(hù)措施,而此類攻擊卻正在泛濫,盡管現(xiàn)階段安全界提出的非控制防護(hù)技術(shù)不乏可以有效防御此類攻擊的方案,但大多都因其限制條件無(wú)法應(yīng)用于商業(yè)軟件,因此Windows的內(nèi)存防護(hù)任務(wù)仍很艱巨。DFI[9]、DSR[10]盡管可以檢測(cè)大范圍的非控制數(shù)據(jù)破壞,同時(shí)也能檢測(cè)控制數(shù)據(jù)攻擊,但因全局防護(hù)帶來(lái)了很大的執(zhí)行開(kāi)銷;DIFT[41]和Pointer Taintedness Detection[42]雖執(zhí)行開(kāi)銷小,也能防護(hù)大部分的攻擊,但由于污染數(shù)據(jù)的標(biāo)記算法不精確,會(huì)造成很多漏報(bào),而且增加污染位也引入了空間開(kāi)銷;SIDAN[46]和ValueGuard[47]需要對(duì)源碼進(jìn)行修改,而且防護(hù)范圍很有限,SIDAN只對(duì)系統(tǒng)調(diào)用進(jìn)行檢測(cè),ValueGuard只能阻止堆棧攻擊;WIT[40]算是一個(gè)比較高效的防護(hù)方案,比DFI和DSR的執(zhí)行開(kāi)銷都小,并且能同時(shí)防護(hù)控制數(shù)據(jù)攻擊和非控制數(shù)據(jù)攻擊,但WIT只對(duì)寫(xiě)操作進(jìn)行了完整性檢查,并沒(méi)有對(duì)讀操作進(jìn)行檢查,因此仍無(wú)法阻止越界讀而引起的信息泄露;DCI[8]對(duì)非敏感數(shù)據(jù)進(jìn)行粗粒度的安全檢測(cè),對(duì)敏感數(shù)據(jù)進(jìn)行精確的安全檢查,較DFI、DSR的大范圍防護(hù)降低了執(zhí)行開(kāi)銷,較WIT只對(duì)寫(xiě)操作進(jìn)行檢查,DCI可同時(shí)對(duì)寫(xiě)操作與讀操作進(jìn)行檢查,但DCI需要程序員定義敏感數(shù)據(jù)類型,存在漏報(bào)情況,而且由于DCI對(duì)非敏感數(shù)據(jù)只進(jìn)行粗粒度安全檢測(cè),仍無(wú)法阻止通過(guò)修改非敏感數(shù)據(jù)實(shí)施攻擊。因此仍需要研究兼顧防護(hù)效能與代價(jià)的非控制數(shù)據(jù)防護(hù)方案。

        面對(duì)如此嚴(yán)峻的內(nèi)存防護(hù)任務(wù),微軟應(yīng)從多個(gè)方面入手,加強(qiáng)Windows的安全性,將針對(duì)內(nèi)存攻擊的危害最小化。對(duì)于已部署的控制數(shù)據(jù)防護(hù)方案應(yīng)進(jìn)一完善,如可考慮利用路徑敏感分析和上下文敏感分析增強(qiáng) CFG的防護(hù)效能、實(shí)施ISR阻撓針對(duì)ASLR的部分覆蓋攻擊等;其次,將現(xiàn)有的多種防護(hù)機(jī)制配合使用,以發(fā)揮最大的防護(hù)效力;另外,出于兼容性考慮,現(xiàn)有的防護(hù)機(jī)制并不全都默認(rèn)開(kāi)啟,因此,微軟應(yīng)加強(qiáng)與第三方軟件合作,引導(dǎo)其用安全的代碼保護(hù)功能開(kāi)發(fā)第三方軟件,以解決兼容性問(wèn)題,最大化安全機(jī)制的防護(hù)范圍。而隨著控制數(shù)據(jù)攻擊代價(jià)的與日俱增,攻擊者必會(huì)將視角轉(zhuǎn)移到非控制數(shù)據(jù)攻擊,未來(lái)針對(duì)非控制數(shù)據(jù)的攻擊將會(huì)泛濫,部署系統(tǒng)級(jí)非控制數(shù)據(jù)防護(hù)機(jī)制刻不容緩;同時(shí)由于現(xiàn)存的非控制數(shù)據(jù)防護(hù)方案很難取得效能與代價(jià)的平衡,因此仍需研究兼顧兩者且適應(yīng)商用的方案。

        [1] Morris worm[EB/OL]. https://en.wikipedia.org/wiki/Morris_worm.

        [2] DURUMERIC Z, LI F, KASTEN J, et al. The matter of heartbleed[C]//2014 Conference on Internet Measurement. 2014:475-488.

        [3] ZATKO P. How to write buffer overflows[EB/OL]. http://insecure.org/stf/mudge_buffer_overflow_tutorial.html.

        [4] HOGLUND G. Advanced buffer overflow technique[EB/OL].http://www.blackhat.com/presentations/bh-asia-00/greg/greg-asia-0 0-stalking.ppt.

        [5] ABADI M, BUDIU M, ERLINGSSON U, et al. Control-flow integrity[C]//The 12th ACM Conference on Computer and Communications Security. 2005: 340-353.

        [6] KUZNETSOV V, SZEKERES L, PAYER M, et al. Code-pointer integrity[C]//The 11th USENIX Symposium on Operating Systems Design and Implementation. 2014: 147-163.

        [7] CHEN S, XU J, SEZER E C, et al. Non-control-data attacks are realistic threats[C]//The 14th USENIX Security Symposium. 2005:177-191.

        [8] CARR S A, PAYER M. DataShield: configurable data confidentiality and integrity[C]//2017 ACM on Asia Conference on Computer and Communications Security. 2017:193-204.

        [9] CASTRO M, COSTA M, HARRIS T. Securing software by enforcing data-flow integrity[C]//The 7th USENIX Symposium on Operating Systems Design and Implementation. 2006:147-160.

        [10] BHATKAR S, SEKAR R. Data space randomization[C]//The 5th International Conference on Detection of Intrusion and Malware,and Vulnerability Assessment. 2008:1-22.

        [11] Usage share of operating systems[EB/OL]. https://en.wikipedia.org/wiki/Usage_share_of_operating_systems#Desktop_and_laptop_computers.

        [12] ANDERSEN S. Memory protection technologies[EB/OL]. https://technet.microsoft.com/en-us/library/bb457155(d=printer).aspx.

        [13] Control flow guard[EB/OL]. https://msdn.microsoft.com/library/Windows/desktop/mt637065(v=vs.85).aspx.

        [14] COWAN C, PU C, MAIER D, et al. StackGuard: automatic adaptive detection and prevention of buffer-overflow attacks[C]//The 7th USENIX Security Symposium. 1998:63-77.

        [15] GS compiler option documentation for Visual Studio 2003[EB/OL].https://msdn.microsoft.com/en-us/library/8dbf701c(v=vs.71).aspx.

        [16] RICHARTE G. Four different tricks to bypass StackShield and StackGuard protection[EB/OL]. https://www.cs.purdue.edu/homes/xyzhang/fall07/Papers/defeat-stackguard.pdf.

        [17] strict_gs_check pragma documentation for Visual Studio 2005[EB/OL].https://msdn.microsoft.com/en-us/library/bb507721 (v=vs.80).aspx.

        [18] LITCHFIELD D. Defeating the stack based buffer overflow prevention mechanism of Microsoft Windows 2003 server[EB/OL].http://www.blackhat.com/presentations/bh-federal-03/bh-fed-03-litc hfield.pdf.

        [19] PIETREK M. A crash course on the depths of Win32 structured exception handling[EB/OL]. https://www.microsoft.com/msj/0197/exception/exception.aspx.

        [20] SAFESEH linker option documentation for Visual Studio 2003[EB/OL].https://msdn.microsoft.com/en-us/library/9a89h429(v=vs.71).aspx.

        [21] Preventing the exploitation of structured exception handler (SEH)overwrites with SEHOP[EB/OL]. https://blogs.technet. microsoft.com/srd/2009/02/02/preventing-the-exploitation-of-structured-exce ption-hander-seh-overwrites-with-sehop/.

        [22] Miller M. Preventing the exploitation of SEH overwrites[EB/OL].http://www.uninformed.org/?v=5amp;a =2amp;t=pdf.

        [23] BERRE S L, CAUQUIL D. Bypassing SEHOP[EB/OL].https://repo.zenk-security.com/Reversing%20.%20cracking/Bypassi ng%20SEHOP.pdf.

        [24] SOTIROV A, DOWD M. Bypassing browser memory protections[EB/OL]. http://www.blackhat.com/presentations/bh-usa-08/Sotirov_Dowd/bh08-sotirov-dowd.pdf.

        [25] SHACHAM H. The geometry of innocent flesh on the bone: return-into-libc without function calls (on the x86)[C]//The 14th ACM CCS. 2007:552-561.

        [26] BUCHANAN E, ROEMER R, SAVAGE S, et al. Return-oriented programming: exploitation without code Injection[EB/OL]. http://www.blackhat.com/presentations/bh-usa-08/Shacham/BH_US_08_Shacham_Return_Oriented_Programming.pdf.

        [27] Bypassing Windows hardware-enforced data execution prevention[EB/OL]. http://www.uninformed.org/?v=2amp;a=4amp;t=pdf.

        [28] PaX ASLR[EB/OL]. http://pax.grsecurity.net/docs/aslr.txt.

        [29] WHITEHOUSE O. An analysis of address space layout randomization on Windows VistaTM[EB/OL]. http://www.symantec.com/ avcenter/reference/Address_Space_Layout_Randomization.pdf.

        [30] SOTIROV A. Windows ANI header buffer overflow[EB/OL].http://www.phreedom.org/research/vulner-abilities/ani-header/.

        [31] Heap spraying[EB/OL]. https://en.wikipedia.org/wiki/Heap_spraying#cite_note-8.

        [32] Guard compiler option documentation for Visual Studio 2015[EB/OL].https://msdn.microsoft.com/en-us/library/8dbf701c (v=vs.71).aspx.

        [33] TANG J. Exploring control flow guard in Windows 10[EB/OL].http://sjc1-te-ftp.trendmicro.com/assets/wp/exploring-control-flowguard-in-Windows10.pdf.

        [34] THEORI. Chakra jit cfg bypass[EB/OL]. http://theori.io/research/chakra-jit-cfg-bypass.

        [35] SUN K, OU Y, ZHAO Y H, et al. Never let your guard down: finding unguarded gates toby-pass control flow guard with big data[EB/OL].https://www.blackhat.com/docs/asia-17/materials/asia-1 7-Sun-Never-Let-Your-Guard-Down-Finding-Unguarded-Gates-To-Bypass-Control-Flow-Guard-With-Big-Data.pdf.

        [36] Return flow guard[EB/OL]. http://xlab.tencent.com/en/2016/11/02/return-flow-guard/.

        [37] Mitigate threats by using Windows 10 security features[EB/OL].https://docs.microsoft.com/en-us/Windows/threat-protection/overvi ew-of-threat-mitigations-in-Windows-10.

        [38] HU H, CHUA Z L, ADRIAN S, et al. Automatic generation of data-oriented exploits[C]//The 24th USENIX Security Symposium.2015: 177-192.

        [39] HU H, SHINDE S, ADRIAN S, et al. Data-oriented programming:on the expressiveness of non-control data attacks[C]//2016 IEEE Symposium on Security and Privacy. 2016: 969-986.

        [40] AKRITIDIS P, CADAR C, RAICIU C, et al. Preventing memory error exploits with WIT[C]//2008 IEEE Symposium on Security and privacy. 2008:263-277.

        [41] SUH G E, LEE J W, ZHANG D, et al. Secure program execution via dynamic information flow tracking[C]//The 11th International Conference on Architectural Support for Programming Languages and Operating Systems. 2004:85-96.

        [42] CHEN S, XU J, NAKKA N, et al. Defeating memory corruption attacks via pointer taintedness detection[C]//2005 International Conference on Dependable Systems and Networks. 2005:378-387.

        [43] BARRANTES E G, ACKLEY D, PALMER T S, et al. Randomized instruction set emulation to disrupt binary code injection attacks[C]//The 10th ACM Conference on Computer and Communications Security. 2003:281-289.

        [44] KC G S, KEROMYTIS A D, PREVELAKIS V. Countering code injection attacks with instruction-set randomization[C]//The 10th ACM Conference on Computer and Communications Security.2003:272-280.

        [45] STEENSGAARD B. Points-to analysis in almost linear time[C]//The 23rd ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages. 1996:32-41.

        [46] DEMAY J C, TOTEL E, TRONEL R. SIDAN: a tool dedicated to software instrumentation for detecting attacks on non-control- data[C]//2009 Fourth International Conference on Risks and Security of Internet and Systems. 2009:51-58.

        [47] ACKER S V, NIKIFORAKIS N, PHILIPPAERTS P, et al. Valueguard: protection of native applications against data-only buffer overflows[C]//The 6th International Conference on Information Systems Security. 2010:156-170.

        [48] DING R, QIAN C X, SONG C Y, et al. Efficient protection of path-sensitive control security[C]//The 26th USENIX Security Symposium. 2017:131-148.

        [49] VEEN V V D, ANDRIESSE D, G?KTAS E, et al. Practical context-sensitive CFI[C]//The 22nd ACM SIGSAC Conference on Computer and Communications Security. 2015: 927-940.

        [50] G?KTAS E, ATHANASOPOULOS E, BOS H, et al. Out of control:overcoming control-flow integrity[C]//2014 IEEE Symposium on Security and Privacy. 2014: 575-589.

        Research on Windows memory protection mechanism

        LU Ting-ting1, WANG Jun-feng1,2

        (1. College of Computer Science, Sichuan University, Chengdu 610065, China;2. School of Aeronautics and Astronautics, Sichuan University, Chengdu 610065, China)

        Over the past three decades, attacks exploiting Windows memory holes have emerged in an endless stream, and the usual means is to attack control-data to hijack the execution flow of the program. To this end, Microsoft has added layers of protection mechanisms to Windows to prevent such attacks. But at this stage, the defensive mechanisms deployed on Windows cannot prevent attacks against non-control-data. In view of the published articles lacking comprehensive study of Windows memory protection mechanism, a detailed introduction to Windows memory protection mechanism and its breakthrough techniques, and non-control-data protection research status was conducted. On this basis, the challenges of Windows memory protection were analyzed and the future of memory protection was discussed.

        Windows memory protection, memory protection mechanism, control-data protection, non-control-data protection

        s:The National Key Research and Development Program (No.2016QY06X1205, No.2016YFB0800605), The National Natural Science Foundation of China (No.91438120, No.91338107, No.91438119), The Technology Research and Development Program of Sichuan Province (No.17ZDYF2583)

        TP309

        A

        10.11959/j.issn.2096-109x.2017.00208

        2017-09-06;

        2017-09-18。

        王俊峰,wangjf@scu.edu.cn

        國(guó)家重點(diǎn)研發(fā)計(jì)劃基金資助項(xiàng)目(No.2016QY06X1205, No.2016YFB0800605);國(guó)家自然科學(xué)基金資助項(xiàng)目(No.91438120, No.91338107, No.91438119);四川省重點(diǎn)研發(fā)計(jì)劃基金資助項(xiàng)目(No.17ZDYF2583)

        魯婷婷(1994-),女,甘肅正寧人,四川大學(xué)博士生,主要研究方向?yàn)樾畔踩?/p>

        王俊峰(1976-),男,安徽蕪湖人,博士,四川大學(xué)教授、博士生導(dǎo)師,主要研究方向?yàn)榭臻g信息網(wǎng)絡(luò)、網(wǎng)絡(luò)與信息安全、大數(shù)據(jù)處理在醫(yī)學(xué)和交通等領(lǐng)域應(yīng)用。

        猜你喜歡
        機(jī)制
        構(gòu)建“不敢腐、不能腐、不想腐”機(jī)制的思考
        自制力是一種很好的篩選機(jī)制
        文苑(2018年21期)2018-11-09 01:23:06
        “三項(xiàng)機(jī)制”為追趕超越蓄力
        丹鳳“四個(gè)強(qiáng)化”從嚴(yán)落實(shí)“三項(xiàng)機(jī)制”
        保留和突破:TPP協(xié)定ISDS機(jī)制中的平衡
        定向培養(yǎng) 還需完善安置機(jī)制
        破除舊機(jī)制要分步推進(jìn)
        氫氣對(duì)缺血再灌注損傷保護(hù)的可能機(jī)制
        注重機(jī)制的相互配合
        打基礎(chǔ) 抓機(jī)制 顯成效
        内射交换多p国产| 亚洲三级视频一区二区三区| 无码人妻久久一区二区三区蜜桃 | 乱码窝窝久久国产无人精品| 国产成人精品综合在线观看| 日本免费人成视频播放| 久久视频在线视频精品| 国产女同舌吻1区2区| 国产午夜伦鲁鲁| 欧美亚洲日韩国产区| 性感人妻中文字幕在线| 男女交射视频免费观看网站| a级毛片免费完整视频| 特黄aa级毛片免费视频播放| 99国产精品欲av麻豆在线观看| 国产让女高潮的av毛片| 久久国内精品自在自线图片| 日韩av在线毛片| 在线观看视频国产一区二区三区| 久久黄色视频| 一本大道久久香蕉成人网| 爆乳无码AV国内| 日本a级黄片免费观看| 少妇粉嫩小泬喷水视频www| 四虎永久在线精品免费观看地址| 国产大学生自拍三级视频| 77777亚洲午夜久久多喷| 国产99久久精品一区二区| 蜜桃一区二区三区在线看| 中文字幕有码在线亚洲 | 给我看免费播放的视频在线观看| 性xxxx18免费观看视频| 草莓视频一区二区精品| 亚洲香蕉久久一区二区| 欧美性生交活xxxxxdddd| 99re热这里只有精品最新| 中文字幕日本熟妇少妇| 国内精品少妇高潮视频| 一区二区三区国产亚洲网站| 久久青草国产免费观看| 中文字幕精品一区二区的区别|