一種基于攻擊樹的rop防護(hù)方法
【專利摘要】本發(fā)明公開了一種基于攻擊樹的ROP防護(hù)方法,屬于計算機(jī)軟件安全領(lǐng)域,所述發(fā)明包括提取待保護(hù)程序和系統(tǒng)庫文件中的gadgets指令片段,確定提取出的每一個gadgets指令片段的類型,選取多個敏感系統(tǒng)函數(shù),利用提取出來的gadgets指令片段以構(gòu)造攻擊樹的方法進(jìn)行攻擊建模,對所有攻擊方法進(jìn)行分析,得到關(guān)鍵的gadgets,最后對這些關(guān)鍵的gadgets進(jìn)行保護(hù)。本發(fā)明通過使用攻擊建模的方式對程序進(jìn)行保護(hù),加強了攻擊者劫持控制流的難度,提高了保護(hù)效率,最終使得程序控制流更加的安全。
【專利說明】
-種基于攻擊樹的ROP防護(hù)方法
技術(shù)領(lǐng)域
[0001 ]本發(fā)明屬于計算機(jī)軟件安全領(lǐng)域,設(shè)及應(yīng)對控制流劫持中的Return-Oriented Program(ROP)攻擊技術(shù),尤其設(shè)及一種基于攻擊樹的ROP防護(hù)方法。
【背景技術(shù)】
[0002] 當(dāng)今軟件已經(jīng)深入到生活的方方面面,在人們的飲食、出行、交通等領(lǐng)域均扮演著 越來越重要的角色??刂屏鹘俪止羰擒浖踩媾R的一個重要威脅,如何增強軟件的防 護(hù)能力已經(jīng)成為重要的工作。
[0003] 在現(xiàn)有技術(shù)中,為了應(yīng)對控制流劫持攻擊通常采用了DEP,ASLRdDEP通過對程序內(nèi) 存頁屬性設(shè)置,避免內(nèi)存頁即可寫又可執(zhí)行,從而使得利用可寫頁進(jìn)行攻擊的方法失敗。 ASLR目的是對程序地址空間進(jìn)行隨機(jī)化,使得攻擊者靜態(tài)分析時獲取的地址空間和真正運 行時不符,從而使得攻擊失敗。但是運些保護(hù)方法都有自己的缺點。DEP和ASLR已經(jīng)被當(dāng)前 的研究證明是可W被繞過的。
[0004] CFI是當(dāng)前學(xué)術(shù)研究的主要方向。CFI通過對程序間接分支跳轉(zhuǎn)指令的地址進(jìn)行校 驗,從而避免被攻擊者劫持。但是CFI具有兩個問題:第一:開銷大,不適于實際使用。(因為 CFI要求對每個間接分支轉(zhuǎn)移指令進(jìn)行檢查)。第二:當(dāng)前CFI采用上下文不敏感的方法,仍 然可W被攻擊者繞過。
【發(fā)明內(nèi)容】
[0005] 針對上述現(xiàn)有技術(shù)中存在的問題,本發(fā)明的目的在于,提供一種基于攻擊樹的R0P 防護(hù)方法。
[0006] 為了實現(xiàn)上述目的,本發(fā)明采用如下技術(shù)方案:
[0007] -種基于攻擊樹的R0P防護(hù)方法,具體包括:
[000引步驟1,選取待保護(hù)程序和系統(tǒng)庫文件;
[0009] 步驟2,提取待保護(hù)程序和系統(tǒng)庫文件中的gadgets指令片段;
[0010] 步驟3,確定提取出的每一個gadgets指令片段的類型;
[0011] 步驟4,選取多個敏感系統(tǒng)函數(shù);
[0012] 步驟5,利用步驟2提取出來的gadgets指令片段W構(gòu)造攻擊樹的方法進(jìn)行攻擊建 模,即W提取出來的gadgets指令片段為攻擊對象,W實現(xiàn)多個敏感系統(tǒng)函數(shù)的調(diào)用為攻擊 目的,W實現(xiàn)每個敏感系統(tǒng)函數(shù)的調(diào)用分別所采用的多種方法為攻擊方法進(jìn)行攻擊樹的構(gòu) 造;
[0013] 步驟6,針對每個敏感函數(shù),對實現(xiàn)該敏感函數(shù)調(diào)用的多種方法中使用到的 gadgets指令片段進(jìn)行分析總結(jié),得到每個敏感函數(shù)對應(yīng)的關(guān)鍵的gadgets指令片段;
[0014] 步驟7,對步驟的尋到的所有關(guān)鍵的gadgets指令片段進(jìn)行保護(hù)。
[001引具體地,所述步驟4中的敏感系統(tǒng)函數(shù)為:mprotect函數(shù)簇,mmap函數(shù)簇,exec函數(shù) 簇或1/0系統(tǒng)調(diào)用函數(shù)簇。
[0016] 具體地,所述步驟6的具體實現(xiàn)方法包括:
[0017] 針對一個敏感函數(shù),實現(xiàn)該敏感函數(shù)調(diào)用的方法包含多種,分析每種方法所使用 的gadgets指令片段的類型,確定所有方法中使用次數(shù)最多的gadgets指令片段的類型,貝U 該類型的gadget指令片段為該敏感函數(shù)對應(yīng)的關(guān)鍵的gadget指令片段;
[0018]針對所有敏感函數(shù),均采用所述方法確定所有敏感函數(shù)對應(yīng)的關(guān)鍵的gadge t指令 片段。
[0019] 具體地,所述步驟3中確定提取出的每一個gadgets指令片段的類型,所采用的方 法為基于語義的分析方法或者模式匹配的方法。
[0020] 具體地,所述步驟7中對步驟6得到的所有關(guān)鍵的gadgets指令片段進(jìn)行保護(hù),對于 來自于系統(tǒng)庫文件中的關(guān)鍵的gadgets指令片段,采用黑名單機(jī)制;對于來自于待保護(hù)程序 中的關(guān)鍵的gadgets指令片段,采用指令替換的方式或者粗粒度控制流完整性的方式。
[0021] 與現(xiàn)有技術(shù)相比,本發(fā)明具有W下技術(shù)效果:
[0022] 1、本發(fā)明提出的基于攻擊建模的R0P保護(hù)方法,從攻擊者的角度對程序進(jìn)行分析, 尋找到攻擊者實現(xiàn)攻擊的關(guān)鍵的gadgets指令片段,然后對它們進(jìn)行保護(hù),使得程序更加具 有抵抗性,最終提高程序的保護(hù)效果。
[0023] 2、本發(fā)明只針對某一類或兩類關(guān)鍵的gadgets指令片段進(jìn)行保護(hù),造成的開銷相 對較小,可W大大提高保護(hù)效率。
【附圖說明】
[0024] 圖1是本發(fā)明的方法流程圖;
[0025] 圖2是實現(xiàn)mprotectO函數(shù)調(diào)用的方法示意圖;
[0026] 圖3是構(gòu)造攻擊樹的流程圖;
[0027] 圖4是gadgets指令片段進(jìn)行分析的示意圖;
[00巧]圖5是Kerne 132. dl 1中g(shù)adgets指令片段的分類情況;
[0029] 下面結(jié)合附圖和【具體實施方式】對本發(fā)明的方法做進(jìn)一步詳細(xì)地解釋和說明。
【具體實施方式】
[0030] 本發(fā)明的基于攻擊樹的R0P防護(hù)方法,參見圖1,具體包括W下幾個步驟:
[0031 ]步驟1,選取待保護(hù)程序和系統(tǒng)庫文件
[0032] 在運里特別提到將系統(tǒng)庫文件也作為輸入,原因在于,系統(tǒng)庫文件是操作系統(tǒng)自 帶的,其中也存在gadgets指令片段。如果攻擊者在系統(tǒng)庫文件中找到gadgets指令片段并 劫持控制流,運樣即使攻擊者在不知道源代碼的情況下依然可W實施控制流劫持攻擊,一 些遠(yuǎn)程攻擊就是W系統(tǒng)庫文件作為攻擊目標(biāo)。
[0033] 步驟2,提取待保護(hù)程序和系統(tǒng)庫文件中的gadgets指令片段
[0034] 提取待保護(hù)程序和庫文件中的gadgets指令片段,可W采用已有的工具,比如: mona插件。此處選擇mona插件是因為它是由著名的corelan team出品的,它是很多漏桐分 析人員或者攻擊者使用的工具。通過mona插件可W快速提取待保護(hù)程序和系統(tǒng)庫文件中的 gadgets指令片段。
[0035] 比如:下邊代碼就是通過mona插件提取出來的gadgets指令片段。
[0036]
[0037] 步驟3,確定提取出的每一個gadgets指令片段的類型
[0038] Gadgets指令片段的類型主要可分為W下幾類:
[0039] 第一類:加載寄存器類型;比如:pop eax;XXX;retn;
[0040] 第二類:內(nèi)存讀寫類型;比如:mov[esi] ,eax;xor eax,eax;XXX;retn;
[0041 ] 第Ξ類:算術(shù)運算類型;比如:Aro能,抓;retn;
[0042] 第四類:空操作類型,不產(chǎn)生任何影響的指令片段。
[0043] 第五類:分支跳轉(zhuǎn)類型:比如:add esp,lah;XXX;retn;
[0044] 第六類:間接函數(shù)調(diào)用類型:比如:call eax,XXX;retn;
[0045] 使用基于語義的分析方法來判斷gadgtes指令片段的類型,也可W采用模式匹配 的方法來確定。假如指令片段中存在call eax/esi/···,通過模式匹配,發(fā)現(xiàn)是call指令且 后邊跟著一個寄存器,運就可W確定它屬于間接函數(shù)調(diào)用類型的gadgets指令片段。基于語 義的分析較為復(fù)雜,但是分類效果會更好。圖5中展示了 Kernel32.dll中g(shù)adgets指令片段 的分類情況。
[0046] 步驟4,選取多個敏感系統(tǒng)函數(shù)
[0047] 為了簡化分析,同時為了盡可能的降低開銷,只針對一些敏感系統(tǒng)函數(shù)進(jìn)行分析。 敏感系統(tǒng)函數(shù)主要選取W下幾種:mprotect函數(shù)簇,mmap函數(shù)簇,exec函數(shù)簇或I/O系統(tǒng)調(diào) 用函數(shù)簇。
[004引步驟5,利用步驟2提取出來的gadgets指令片段W構(gòu)造攻擊樹的方法進(jìn)行攻擊建 模,即W提取出來的gadgets指令片段為攻擊對象,W實現(xiàn)多個敏感系統(tǒng)函數(shù)的調(diào)用為攻擊 目的,W實現(xiàn)每個敏感系統(tǒng)函數(shù)的調(diào)用分別所采用的多種方法為攻擊方法進(jìn)行攻擊樹的構(gòu) 造。
[0049]此實施例中,攻擊建模采用構(gòu)造攻擊樹方法,圖2展示了實現(xiàn)mprotectO函數(shù)調(diào)用 的一種方法,圖3展示構(gòu)造攻擊樹的一個簡單例子。軟件攻擊模型要素分為W下幾個:攻擊 對象,攻擊目的和攻擊方法(攻擊技術(shù))。攻擊對象是提取出來的gadgets指令片段;攻擊目 的是實現(xiàn)多個敏感系統(tǒng)函數(shù)的調(diào)用,比如實現(xiàn)vidualprotectO敏感系統(tǒng)函數(shù)的調(diào)用, ¥山化日191'〇1日(31:〇敏感系統(tǒng)函數(shù)屬于1]191'〇1日(31:函數(shù)簇;攻擊方法就是實現(xiàn)每個敏感函數(shù)的 調(diào)用分別所采用的多種方法。如下是一個實現(xiàn)vbtualprotectO敏感函數(shù)調(diào)用的方法,其 中每個WRETN結(jié)尾的指令片段都是一個gadget指令片段,其他的屬于數(shù)據(jù)信息(參數(shù)信息) 和垃圾填充信息(比如:Filler)。
[0化2]
[0053] 攻擊樹按照攻擊方法進(jìn)行構(gòu)造:攻擊樹的根節(jié)點是敏感系統(tǒng)函數(shù),子節(jié)點就是攻 擊方法中依次出現(xiàn)的gadget指令片段。比如上述代碼中0x7588巧69#P0P EAX #RETN是一個 寄存器加載類型的gadget指令片段,目的是為了獲取vbtualprotectO的首地址。依次遍 歷后邊出現(xiàn)的gadget指令片段,就可W構(gòu)造出用于實現(xiàn)敏感系統(tǒng)函數(shù)調(diào)用的攻擊樹。
[0054] 下表列出了上述敏感函數(shù)調(diào)用的方法中出現(xiàn)的所有g(shù)adget指令片段W及其所屬 類型。
[0化5]
[0056] 本發(fā)明從攻擊者的角度,對gadgets指令片段進(jìn)行攻擊建模,更具有針對性。
[0057] 步驟6,針對每個敏感函數(shù),實現(xiàn)對該敏感函數(shù)調(diào)用的多種方法中使用到的 gadgets指令片段進(jìn)行分析總結(jié),得到每個敏感函數(shù)對應(yīng)的關(guān)鍵的gadgets指令片段;
[005引實現(xiàn)一個敏感函數(shù)的調(diào)用方法包含多種,在運里盡可能的對每種調(diào)用方法都設(shè)及 到,然后尋找運些調(diào)用方法對哪種類型的gadgets指令片段依賴度高,即對哪種類型 gadgets指令片段使用最為頻繁;如果大部分方法都依賴某一種類型的gadget指令片段,我 們就說該類型的gadget指令片段是該敏感函數(shù)對應(yīng)的關(guān)鍵的gadget指令片段。
[0059] 依次類推,對所有的敏感函數(shù),針對實現(xiàn)其調(diào)用的方法都進(jìn)行總結(jié),并找到所有敏 感函數(shù)對應(yīng)的關(guān)鍵的gadget指令片段。圖4展示了一個簡單的分析過程,圖中每種形狀的圖 像代表一種類型的gadget指令片段。
[0060] 步驟7,對步驟的尋到的所有關(guān)鍵的gadgets指令片段進(jìn)行保護(hù)
[0061 ]經(jīng)過分析之后會找到關(guān)鍵的gadgets指令片段,接下來就是對運些關(guān)鍵的gadgets 進(jìn)行保護(hù)。保護(hù)方法也包含多種,假如關(guān)鍵的gadgets指令片段來自于系統(tǒng)庫文件,我們使 用黑名單機(jī)制,為了安全起見,操作系統(tǒng)是不允許用戶對系統(tǒng)庫函數(shù)修改的;對于來自于待 保護(hù)程序中的關(guān)鍵的gadgets指令片段,我們可W使用指令替換的方式,也可W采用粗粒度 控制流完整性的方式。
[0062] 運里隊nprotectO敏感系統(tǒng)函數(shù)為例簡要說明(mprotectO函數(shù)用于修改程序內(nèi) 存的屬性,如果攻擊者可W修改內(nèi)存屬性,就可W繞過DEP實現(xiàn)任意想要的功能),要實現(xiàn) mprotectO函數(shù)需要加載函數(shù)參數(shù),參數(shù)加載就需要用到內(nèi)存加載類型的gadgets。如果我 們對內(nèi)存加載類型的gadgets進(jìn)行保護(hù),運就使得攻擊者達(dá)不到自己想要的惡意功能。
[0063] 另外需要聲明一點,基于攻擊建模的R0P防御思想既可W單獨的用于保護(hù)程序,也 可W與其他的R0P防護(hù)技術(shù)相結(jié)合。如果能夠和粗粒度CFI結(jié)合保護(hù),保護(hù)效果會更好。
【主權(quán)項】
1. 一種基于攻擊樹的ROP防護(hù)方法,其特征在于,具體包括: 步驟1,選取待保護(hù)程序和系統(tǒng)庫文件; 步驟2,提取待保護(hù)程序和系統(tǒng)庫文件中的gadgets指令片段; 步驟3,確定提取出的每一個gadgets指令片段的類型; 步驟4,選取多個敏感系統(tǒng)函數(shù); 步驟5,利用步驟2提取出來的gadgets指令片段以構(gòu)造攻擊樹的方法進(jìn)行攻擊建模,即 以提取出來的gadgets指令片段為攻擊對象,以實現(xiàn)多個敏感系統(tǒng)函數(shù)的調(diào)用為攻擊目的, 以實現(xiàn)每個敏感系統(tǒng)函數(shù)的調(diào)用分別所采用的多種方法為攻擊方法進(jìn)行攻擊樹的構(gòu)造; 步驟6,針對每個敏感函數(shù),對實現(xiàn)該敏感函數(shù)調(diào)用的多種方法中使用到的gadge t s指 令片段進(jìn)行分析總結(jié),得到每個敏感函數(shù)對應(yīng)的關(guān)鍵的gadgets指令片段; 步驟7,對步驟6得到的所有關(guān)鍵的gadgets指令片段進(jìn)行保護(hù)。2. 如權(quán)利要求1所述的基于攻擊樹的R0P防護(hù)方法,其特征在于,所述步驟4中的敏感系 統(tǒng)函數(shù)為:mprotect函數(shù)簇,_ap函數(shù)簇,exec函數(shù)簇或I/O系統(tǒng)調(diào)用函數(shù)簇。3. 如權(quán)利要求1所述的基于攻擊樹的R0P防護(hù)方法,其特征在于,所述步驟6的具體實現(xiàn) 方法包括: 針對一個敏感函數(shù),實現(xiàn)該敏感函數(shù)調(diào)用的方法包含多種,分析每種方法所使用的 gadgets指令片段的類型,確定所有方法中使用次數(shù)最多的gadgets指令片段的類型,則該 類型的gadget指令片段為該敏感函數(shù)對應(yīng)的關(guān)鍵的gadget指令片段; 針對所有敏感函數(shù),均采用所述方法確定所有敏感函數(shù)對應(yīng)的關(guān)鍵的gadge t指令片 段。4. 如權(quán)利要求1所述的基于攻擊樹的R0P防護(hù)方法,其特征在于,所述步驟3中確定提取 出的每一個gadgets指令片段的類型,所采用的方法為基于語義的分析方法或者模式匹配 的方法。5. 如權(quán)利要求1所述的基于攻擊樹的R0P防護(hù)方法,其特征在于,所述步驟7中對步驟6 得到的所有關(guān)鍵的gadgets指令片段進(jìn)行保護(hù),對于來自于系統(tǒng)庫文件中的關(guān)鍵的gadgets 指令片段,采用黑名單機(jī)制;對于來自于待保護(hù)程序中的關(guān)鍵的gadgets指令片段,采用指 令替換的方式或者粗粒度控制流完整性的方式。
【文檔編號】G06F21/12GK105825086SQ201610149871
【公開日】2016年8月3日
【申請日】2016年3月16日
【發(fā)明人】湯戰(zhàn)勇, 呂留東, 張恒, 李政橋, 房鼎益, 陳曉江, 周祥, 龔曉慶, 劉方圓, 陳鋒
【申請人】西北大學(xué)