999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

可控內存寫漏洞自動利用生成方法

2022-03-01 01:31:02黃樺烽蘇璞睿楊軼賈相堃
通信學報 2022年1期
關鍵詞:指令利用

黃樺烽,蘇璞睿,楊軼,賈相堃

(1.中國科學院軟件研究所可信計算與信息保障實驗室,北京 100190;2.中國科學院大學計算機科學與技術學院,北京 100190)

0 引言

隨著人工智能技術在安全漏洞領域的應用[1],漏洞研究的自動化技術迅速發展。漏洞自動利用是探尋漏洞可能的利用方法,進而評估漏洞危害、防御漏洞利用攻擊的重要手段。自2016 年美國DARPA CGC[2](cyber grand challenge)比賽以來,漏洞自動利用已成為網絡安全領域的研究熱點。早期的APEG[3]、AEG[4-5]、Mayhem[6]、PolyAEG[7]等在該領域進行了眾多嘗試,主要針對明確的控制流劫持類漏洞,并僅在簡單的程序上進行了驗證,缺乏針對大規模軟件、復雜漏洞類型的分析能力。

內存破壞漏洞是常見的漏洞類型。除了根據漏洞類型分類之外,從漏洞破壞能力刻畫漏洞更有利于漏洞利用。內存破壞漏洞除了可能造成直接的控制流劫持外,也會表現為內存訪問異常、段異常等,漏洞的終極破壞能力表現為任意代碼執行。其中,可控內存寫漏洞盡管起初可能只是造成程序崩潰,但具有很大的潛力轉化為控制流劫持,最終造成任意代碼執行。造成可控內存寫漏洞的原因存在多種可能,包括數組索引邊界檢查缺陷、緩沖區溢出覆蓋數據指針、UAF(use after free)造成指針誤用、格式化字符串漏洞等情況;可控內存寫漏洞的利用方式具有多樣性,包括覆蓋函數指針構造控制流劫持、覆蓋權限變量實現提權、覆蓋邏輯變量觸發邏輯錯誤、覆蓋讀內存指針實現信息泄露等。實際上,模糊測試產生的大量PoC(proof of concept)樣本并不能直接造成控制流劫持或任意代碼執行。在模糊測試發現的可控寫錯誤PoC 的基礎上,分析并構造控制流劫持路徑,對提高漏洞的自動利用能力,提升模糊測試漏洞挖掘結果的評估能力具有重要價值。

由于內存屬性、復雜輸入依賴關系及環境約束限制等因素,從可控內存寫漏洞到控制流劫持、再到任意代碼執行的漏洞利用仍是一個困難問題,當前仍沒有完整的自動化方法。為此,本文提出了一種可控內存寫漏洞自動利用生成方法,從可控內存寫漏洞的判定、利用要素的自動化搜索、攻擊鏈的自動構造方面展開研究,基于可控內存寫漏洞的利用模式,設計并實現了可控內存寫漏洞的利用自動生成原型系統,驗證了本文方法的有效性,主要貢獻和創新點如下。

1)從漏洞破壞能力的維度建立了內存破壞漏洞利用能力的層次等級分類,包括崩潰異常、可控內存寫、控制流劫持、任意代碼執行4 個層次的能力等級。

2)提出了面向內存地址控制力度的動態污點分析方法,通過對指令控制力度的規則和語義分析,設計了面向內存地址控制力度的污點傳播規則,提升了可控內存寫漏洞判定的準確度,形成了可控內存寫漏洞判定能力。

3)分析總結了可控內存寫漏洞的利用模式及利用要素,從代碼、數據、函數指針等多個維度,分析了可控內存寫漏洞利用的不同方式,實現了函數指針要素的自動搜索。

4)實現了可控內存寫漏洞自動生成控制流劫持利用的原型系統,針對測試集構造利用樣本達到控制流劫持能力的數量比模糊測試提升54%,顯著提升了模糊測試結果的可利用性評估能力。

1 知識背景與相關工作

漏洞利用攻擊是指攻擊者利用程序缺陷構造輸入,使程序在執行過程中執行了滿足攻擊者意圖的代碼。針對內存破壞漏洞,從漏洞破壞能力等級角度可將其分為崩潰異常、可控內存寫、控制流劫持、任意代碼執行4 個層次。崩潰異常是指非預期地覆蓋了其他變量導致內存非法訪問異常;可控內存寫是指程序寫內存的地址和內容可被輸入所控制,如指令mov [edi],eax 中的edi 和eax 都受到輸入控制;控制流劫持是指程序跳轉的位置可以被輸入修改和控制,如call 指令的參數被輸入所控制;任意代碼執行是指程序執行的指令可以被修改為攻擊者注入的攻擊代碼。這4 種類型的能力從破壞程序運行到獲得遠程控制權逐層遞進,通常能夠獲得的漏洞PoC 屬于崩潰異常,而漏洞利用以達到任意代碼執行為目標,來獲得最大攻擊收益。

根據內存破壞漏洞不同的初始利用能力,內存破壞漏洞利用步驟可以進行分解和復用,如圖1 所示。左側表示漏洞利用能力,中間是漏洞利用方法和步驟,右側是漏洞利用緩解機制,箭頭上的字母序號標注了該流程可能遭遇對應的漏洞利用緩解機制的對抗攔截。

漏洞利用生成需要對觸發程序崩潰的PoC 進行分析,動態監控程序解析PoC 的過程,分析內存破壞漏洞初始的漏洞能力,結果如圖1 所示。進一步,根據不同漏洞能力的特點,選擇不同的利用方法實施利用。內存破壞漏洞利用步驟總結如下。

圖1 內存破壞漏洞利用步驟

1)具備初始內存破壞能力條件下,嘗試構造破壞內存中的數據指針變量,破壞的數據指針變量作為漏洞利用生成后續步驟的前提條件。

2)修改被破壞內存中指針包括2 種情況,第一種情況是該指針是函數指針,或者函數的返回地址,通過修改指針的內容,可以實現控制流劫持。針對此類指針的修改,操作系統的 RELRO(relocation read-only)等寫保護機制會對該過程形成對抗。第二種情況是該指針是數據指針,通過修改指針內容,可嘗試構造可控地址內存寫。操作系統部署了Meta Data、Canary、Safe Unlink、Heap Cookie 等防御機制,導致利用邏輯復雜、難度更高,本文研究針對數據指針的情況展開。

3)在能夠構造可控地址內存寫的條件下,嘗試定位并修改函數地址指針或者返回地址,如果該函數指針或返回地址在后續執行中被使用,則可構造控制流劫持。此部分需要從內存屬性篩選出未受寫保護的函數指針,避開RELRO 寫保護安全機制的影響。

4)函數指針被覆蓋到被引用觸發控制流劫持過程中,中間可能受到CFI(control-flow integrity)、Stack Cookie 等安全機制的影響,需要搜索控制流完整性和數據流完整性檢驗的缺陷和繞過空間。

5)為了形成可用的控制流劫持,需要在內存中放置并定位ShellCode,以確定控制流劫持方向。該過程可能受到PIE(position independent executable)和ASLR(address space layout randomization)等內存地址隨機化影響,通過寄存器指針、棧空間數據指針搜索可嘗試找出指向污點數據的指針,作為定位ShellCode 位置的變量元素,此外,還可通過堆噴、信息泄露等方式提高ShellCode 代碼定位的成功率。

6)ShellCode 定位完成之后,結合控制流劫持可實現最終目標,即任意代碼執行。但該過程可能受到DEP(data execution prevention)和NX(no execute)數據執行保護的影響,目前存在ROP(return-oriented programming)、JOP(jump-oriented programming)、Ret2Lib(return-to-library)等代碼重用的方式繞過數據執行保護,而代碼重用過程中需要先定位出模塊代碼位置,這一過程采用的策略包括使用未隨機化的代碼模塊、信息泄露模塊地址,從這些模塊搜索ROP Gadgets 的代碼片段,串接ROP 功能實現利用,或者通過代碼功能修改內存屬性為可執行實現任意代碼執行的效果。

以上闡述了內存破壞漏洞根據不同利用能力的漏洞利用生成方法和步驟,同時也闡述了相應過程可能遇到的安全機制限制,漏洞自動利用嘗試將這些生成方法和步驟自動化實現。當前的研究工作僅實現了其中一部分環節的自動化,APEG[3]是基于補丁自動生成 Crash 的 PoC;AEG[4-5]、Mayhem[6]、PolyAEG[7]、CRAX[8]針對的是控制流劫持條件下的構造任意代碼執行的漏洞自動利用;HCSIFTER[9]、Revery[10]、FUZE[11]針對的是堆類型漏洞,且只針對漏洞利用中的特定環節實現自動化;R2dlAEG[12]、FlowStitch[13]、DOP[14]、BOP[15]、Q[16]則是針對漏洞利用過程中的特定安全機制繞過環節實現了自動化。相關工作對應的漏洞自動利用生成環節如表1 所示,序號含義為:①構造崩潰異常;②基于崩潰構造可控內存寫;③基于崩潰構造控制流劫持;④基于可控內存寫構造控制流劫持;⑤基于控制流劫持構造任意代碼執行;⑥DEP 安全機制繞過;⑦CFI安全機制繞過;⑧可利用性評估。

表1 相關工作對應的漏洞自動利用生成環節

數據顯示,現有研究還缺少可控內存寫到控制流劫持利用階段的自動化生成,同時該過程主要存在三方面的難點與挑戰。

1)在可控內存寫漏洞的判定方面,依賴于動態污點分析對逐條指令的內存寫操作進行分析,檢測指令尋址寄存器是否受到輸入控制,并且需要考慮控制的力度能否達到任意地址寫的程度,寫范圍的限度是判斷漏洞是否真實存在的難點。

2)在可控內存寫漏洞利用要素搜索方面,需要同時考慮函數指針或返回地址的定位,內存屬性是否可寫,以及函數指針是否能被引用的情況,即需要搜索出同時滿足地址可定位、內存可寫、會被調用這3 個條件的函數指針。

3)在控制流劫持觸發方面,CFI、SHE(safe exception handler table)等安全機制的引入,可能導致被修改后的函數指針或者返回地址無法被調用執行,對虛函數表、SEH 表的完整性檢查,以及Stack Cookie 對棧溢出的檢測都有可能攔截被破壞的函數指針及返回地址被引用,從而阻止控制流劫持,這些因素給可控內存寫漏洞自動利用生成控制流劫持帶來了諸多的挑戰。

2 內存地址控制力度的動態污點分析方法

針對可控內存寫漏洞自動判定的難點問題,動態污點分析是檢測可控內存寫漏洞的基本思路。其原理是標記用戶可控的輸入為污點,動態跟蹤污點數據在程序運行過程中的傳播過程,檢測內存寫入的指令參數是否受到輸入控制進行該類型漏洞的判定。設計使用中涉及污點傳播規則、檢測規則和約束條件三方面。

在污點傳播規則方面,基于傳統污點分析的初步檢測,本文發現其存在大量誤報,通過對傳播過程進行回溯分析得到傳播路徑,發現誤報主要包括以下情況。

1)污點數據作為堆分配大小,影響了下一個堆分配的位置,下一個堆的數據訪問指針因受到污點數據影響導致誤報。

2)污點數據影響到內存訪問地址,但只是部分的地址位,多次移位運算之后指針的多個比特位不受污點控制,并且污染的位置只是影響,達不到目標內存值任意控制的能力。

3)數組訪問的偏移索引雖然受到污點數據影響,但是其有前置約束條件,雖然實際情況是被污染,但達不到任意地址寫破壞的效果。

總體而言是由于傳統污點傳播規則未區分控制計算和影響計算的程度,而地址計算依賴于嚴格的控制計算。雖然符號執行理論上可用于地址寫控制范圍的求解,但消耗大量的計算資源。針對這些問題,本文提出了面向內存地址控制力度的動態污點分析方法,通過對不同力度的計算指令污點傳播規則進行改進,以適用于可控內存寫漏洞的檢測。

計算指令通常分為算術運算、邏輯運算、位運算等類型,地址計算涉及更多的是加減法運算,數組地址偏移量需要乘法運算支持多字節一組的單元尋址,但有時通過左移實現冪次倍的乘法運算,另外地址對齊也會進行移位或者與運算將低比特位抹零處理。針對這些特性,本文對相關指令的污點傳播規則進行了策略修改,傳播規則修改策略如表2 所示。

表2 傳播規則修改策略

在檢測規則方面,可控地址寫的檢測需要指針4 byte 受到控制才具備任意地址寫的能力,考慮到偏移地址受控情況可能低2 byte 被控制即可實現破壞,本文檢測低2 byte 受污染對可控內存寫進行判定。比如mov [edx],eax 指令,需要edx 的低2 byte受到污點控制,發現誤報的案例中地址指針的低字節并不受污點控制,其中大量使用了shl 左移指令計算內存頁地址,地址訪問只是影響了所在內存頁,低地址不受污染,并不具備控制地址寫能力。

在約束條件方面,本文針對cmp 比較指令進行了記錄,如果指針引用前做了邊界檢測將進行記錄,根據上下文可以判定出警告的可控地址寫指針是否有安全邊界檢測,如果邊界檢測的點與可控地址寫的告警點位于同一個函數上下文,且相關變量污點源相同,可初步判斷告警是誤報情況。

3 系統設計與實現

針對當前可控內存寫漏洞構造控制流劫持利用的難點與挑戰,本文設計實現了可控內存寫漏洞自動利用生成方法,其流程如圖2 所示。

圖2 可控內存寫漏洞自動利用生成方法流程

首先,基于可控力度污點分析,判定其是否達到可控內存寫漏洞的利用能力;然后,基于靜態分析和動態分析,提取出程序中的函數表,包括導入表、虛函數表、回調函數表等,篩選出其中具備寫權限的部分,并以動態運行的方式篩選出可控內存寫觸發點之后潛在調用執行的點;最后,提取備選覆蓋的內存寫入地址,及覆蓋內存的約束條件和內容,由輸入求解引擎進行約束條件求解,生成漏洞利用樣本。

本文實現了可控內存寫漏洞的自動利用原型系統,原型系統框架如圖3 所示,包含基于QEMU實現動態插樁提取指令記錄和污點源,基于Udis86反匯編和可控內存力度污點傳播規則實現可控內存寫漏洞的自動檢測,基于指令記錄分析和靜態分析提取代碼、數據、函數指針、數據指針、內存屬性的利用要素,基于利用模式提取利用約束并采用Z3 求解引擎對輸入進行求解。

圖3 原型系統框架

本節從可控內存寫漏洞的判定、可控內存寫漏洞利用模式及要素自動搜索、可控內存寫漏洞利用自動生成三方面對本文系統設計與實現進行詳細介紹。

3.1 可控內存寫漏洞的判定

可控內存寫漏洞的判定使用了文獻[17]提出的Weak-Tainted 程序動態運行時漏洞檢測模型,基于該模型對脆弱點和污點屬性進行定義,可控內存寫漏洞檢測模型如圖4 所示,脆弱點集合包含2 種類型:Weak-INS 和Weak-PC。Weak-INS 是指可能引起可控內存寫能力的指令模式,例如mov [edi]、eax、rep movsd 等;Weak-PC 是指潛在可控內存寫能力的函數地址集合,通過靜態分析提取敏感脆弱函數地址,例如提取memcpy、strcpy、scanf、sprintf、read 等具備寫內存能力的函數,通過靜態解析libc庫的導出函數表獲得函數偏移地址,結合模塊基地址計算得到運行過程的函數地址。污點屬性需要給脆弱點集合的每個脆弱點定義污點檢測規則,檢測相應寄存器等變量是否受輸入污染。不同脆弱點都有對應的存儲單元檢測規則,當脆弱點定義的檢測變量受到輸入污染,則可篩選出具備可控地址寫能力的脆弱點。

圖4 可控內存寫漏洞檢測模型

與控制流劫持檢測相比,可控內存寫的檢測資源消耗會更高。從指令的層面分析,控制流劫持檢測只需要檢測轉移跳轉指令,而可控內存寫的檢測需要檢測所有內存寫操作的指令,這類指令所占比例更高,所需消耗的計算資源更多。但在動態污點分析過程中,本身就需要對指令進行反匯編,提取操作數類型,計算操作數地址,這些過程的結果可以直接復用在可控內存寫檢測當中,從而減輕額外的計算資源開銷。

本文基于內存地址控制力度的動態污點分析方法,將文件、網絡、鍵盤等輸入標記為污點源,并賦予每個輸入字節不同的標簽,動態跟蹤解析執行的每條指令,分析指令對“污點數據”的“傳播”和“清除”過程,動態更新寄存器和內存的污點狀態及其對應的污點標簽。

可控內存寫漏洞檢測流程如圖5 所示。1)將二進制程序和PoC 輸入置入QEMU 中動態加載運行,通過QEMU 對進程實現動態插樁,根據指令及API參數判定是否引入新的污點源,如果引入新的污點源,則更新記錄污點狀態的結構Taint Map;2)對指令進行反匯編解析,根據指令語義解析進行動態污點傳播分析,檢索源操作數的污點狀態,更新目標操作數的污點狀態及計算新的污點標簽;3)在動態污點分析計算指令操作地址過程中,分析操作數類型,當目的操作數的類型為內存時,進入可控內存寫檢測流程,否則進入下一步;4)當指令寫操作數的地址為內存時,如果是立即數尋址則可直接跳過,如果是寄存器尋址則檢測直接尋址和間接尋址的寄存器是否為污點,如果為污點再檢測數據源是否為污點,兩者同時為污點的情況下則具備了可控內存寫可控內容的能力;5)針對具備可控內存寫能力的潛在點,記錄輸出報告信息,內容包括指令地址、指令內容、尋址寄存器(地址指針)、尋址寄存器的污點源、源數據、源數據對應污點源;6)循環分析下一條指令。

圖5 可控內存寫漏洞檢測流程

3.2 可控內存寫漏洞利用模式及要素自動搜索

可控內存寫漏洞具有較強的破壞能力,單指令層面的可控內存寫具備篡改單字節、雙字節、四字節或八字節的能力,例如mov [edi]、al、ax、eax、rax;函數層面的可控內存寫具備篡改更多長度字節的能力,例如read(dst,fd,size)、memcpy(dst,src,size)等。攻擊者在獲得可控內存寫漏洞能力的前提下,可以肆意破壞內存,篡改包括指令、數據、指針、函數等類型的變量。與控制流劫持漏洞相比,可控內存寫漏洞利用模式更加豐富,如圖6 所示。

圖6 可控內存寫漏洞利用模式

篡改指令可以直接誘發任意代碼執行,但正常情況下指令所在內存處于不可寫狀態,不排除SMC等動態代碼的情況;篡改數據需要根據數據類型而定,例如篡改權限標記變量可達到提升權限能力,篡改邏輯變量可觸發邏輯錯誤執行本不具備權限的代碼,篡改system 等敏感函數參數可觸發命令注入執行;篡改數據指針可誘發二次的可控內存讀寫,構造更多的數據破壞;篡改函數指針可觸發控制流劫持,構造任意代碼執行的漏洞利用。

基于可控內存寫漏洞利用模式,本文設計實現了其中通過劫持函數表和函數指針實現控制流劫持的利用生成方式,具體包括內存讀寫屬性的提取、函數表地址的動態提取與靜態提取、潛在利用可能函數表的篩選。

內存的讀寫執行權限屬性是極關鍵的前提要素,可控內存寫需要寫入的內存地址具備寫權限。由于現代操作系統增強了內存的安全管理,在進程初始化完成之后對進程空間的代碼區域、動態庫導入表等敏感內存位置,設置了只讀屬性,這些內存區域在可控內存寫利用生成過程中無法作為被寫入的內存區域。因此在漏洞利用生成過程中,需要通過內存讀寫屬性的分析,篩選其中具備寫權限的內存,再篩選滿足其他條件的利用要素。

內存權限屬性的提取可以通過內存頁屬性查詢進行解析,Windows 系統提供了VirtualQueryEx內存屬性查詢接口,輸入參數包括句柄HANDLE、查詢的內存地址、接收返回值的結構地址和大小,輸出為MEMORY_BASIC_INFORMATION 結構體信息,其中BaseAddress 為查詢地址所在內存塊的基地址,RegionSize 為內存區塊大小,Protect 為權限屬性,通過循環解析可以獲取整個進程空間的內存屬性,進程空間內存可寫權限屬性提取偽代碼如算法1 所示。

函數指針及函數表的覆蓋是構造控制流劫持的關鍵步驟,傳統漏洞是基于緩沖區溢出覆蓋函數表或者函數返回地址,溢出覆蓋函數表依賴于緩沖區與函數表位于同一結構體或者臨近的結構體。可控內存寫漏洞則可以選擇性地覆蓋備選的函數指針或者函數返回地址,但由于函數返回地址所處棧空間基本隨機,難以直接定位。函數表或者函數指針的地址可定位能力相對較強,除了函數導入導出表可供選擇之外,虛函數表、回調函數指針、跳轉表也都是備選的覆蓋項。

備選覆蓋函數指針的篩選依據包括函數表所在內存可寫、函數指針在觸發可控寫內存漏洞之后會被調用、函數表地址可定位。為了統計出滿足條件的函數或者跳轉表,本文基于動態指令分析收集備選的函數表利用要素。

首先基于動態插樁獲取執行的指令記錄,反匯編篩選其中的函數調用指令call 和跳轉指令jmp 進行分析。call/jmp 指令的跳轉方式包括間接跳轉和直接跳轉,直接跳轉是通過指令地址的相對偏移實施跳轉,由于不存在可變參數,不會出現劫持情況。間接跳轉是通過尋址方式計算獲得跳轉地址,其潛在跳轉地址被劫持可能,同時也包括寄存器跳轉call/jmp eax 和內存地址跳轉call/jmp [eax+0x20]2 種情況。調用寄存器的情況需要分析目標寄存器源自的內存地址,調用寄存器代碼示例如圖7 所示,0x000187A6 處的 call ecx 往上分析追溯到0x00018794 處的mov ecx,[eax+0xc],如果可控內存寫漏洞對內存[eax+0xc]進行了覆蓋,會導致call ecx 位置出現控制流劫持。

圖7 調用寄存器代碼示例

因此,針對調用寄存器的情況,需要逆向分析出寄存器來源的內存地址作為可控內存寫的利用備選地址,而類似call [0x6583138c]、call[eax+0x20]這類的指令可直接獲取內存地址作為備選地址。

為了解決寄存器作為調用參數的內存源地址追溯問題,傳統思路是針對寄存器做逆向切片分析,本文采用了短距離的動態污點分析,在基于污點分析檢測可控內存地址寫的過程當中,針對內存數據到寄存器的拷貝過程,記錄了寄存器來源的內存地址,并作為污點標簽在短距離內進行計算傳播,短距離污點傳播偽代碼如算法2 所示。之所以稱為短距離是因為寄存器的更新頻率非常高,當采用新的內存數據對寄存器進行覆蓋時,立即更新寄存器的污點標簽為新的內存地址標簽,同時忽略寄存器到內存、內存到內存直接的傳播,只是為了滿足寄存器溯源內存而提出的微縮版的動態污點分析方案。

另外,存在一類函數調用的函數指針無法通過指令記錄分析獲得,但是這類函數卻具有被調用的可能。該類型普遍用于自定義hook 庫函數接口的結構指針變量,初始值為0,如果被賦值為非0 則會被調用,包括lib_hook_malloc、lib_hook_free 等,遺漏函數模式代碼示意如圖8 所示。指令記錄中,由于函數指針變量未被覆蓋,不會觸發調用該函數指針的代碼,上述代碼中的lib_hook_func 函數不會被調用,相應的匯編指令call eax 也不會被執行。

圖8 遺漏函數模式代碼示意

針對這種情況,本文采用靜態模式匹配的方式,基于libc 庫中存在該模式的函數提取特征,在二進制程序中搜索匹配相應的函數,識別函數之后提取函數表的全局變量地址。

潛在調用點函數通過其在指令記錄中的出現頻度和出現順序進行排序篩選,通過構造一個不觸發崩潰的樣本,在檢測出的可控內存寫之后的點分析被引用的函數表或函數指針,以及選擇調用頻度高的函數指針作為備選的劫持點。

3.3 可控內存寫漏洞利用自動生成

可控內存寫漏洞利用的自動生成依據漏洞判定給出的漏洞點和輸入依賴字節,結合漏洞利用模式及利用要素的自動提取篩選出備選的內存寫入點,構造出覆蓋函數指針的約束求解條件。約束條件主要包括2 個:1)漏洞點寫入的內存地址約束其等于備選利用方式需要寫入的內存地址;2)漏洞點寫入的內容約束其等于備選利用方式預期的內存值。

針對指令檢測出的可控內存寫,其利用生成的約束條件是清晰且明確的。針對函數層面的檢測出的可控內存寫,其利用生成的約束條件依據函數的復雜程度而定,類似memcpy、strcpy、strncpy 這類寫入內存地址和內容參數變量明確的情況,其約束條件也是清晰明確的。但是,類似sprintf、fprintf、printf 這類格式化字符串函數,當格式化參數format受到控制時,通過控制棧上的指針和格式化參數同樣可以構造可控內存寫,但是其約束條件的構造則比較復雜。

格式化字符串漏洞在可控內存寫利用能力構造的約束條件生成利用了格式字符%n 的功能,該功能是向棧指針指向的內存地址寫入前序輸出的字符數量。以32 bit 程序為例,%n 是寫入4 byte 內存,%hn是寫入2 byte 內存,%hhn 是寫入1 byte 內存。此外,格式化字符串的單次輸出字符串數量上限是65 535,因此如果要寫入4 byte 的地址空間,需要拆成2 次的2 byte 寫入,即使用%hn 的格式字符進行寫入。同時,寫入的內存地址是通過棧上的變量指針進行尋址,因此需要在棧上搜索出2 個4 byte 被污點輸入控制的變量,約束這2 個變量為寫入目標內存的地址addr_for_write 和addr_for_write+2。如圖9 所示,格式化字符串函數printf的format參數被輸入控制,利用目標是向addr_for_write 寫入4 byte 的value,利用過程如下。

圖9 格式化字符串的可控內存寫生成

1)先將value 分解成低高2 個word 字段n=value&0xffff 和m=(value>>16)&0xffff,需分別往addr_for_write 和addr_for_write+2 寫入n和m,由于輸出字符數量是遞增,因此2 次寫入的字節只能先寫入小值,再寫入大值。

2)在棧上搜索出2 個4 byte 被污點輸入控制的變量,計算與format 指針參數的位置距離,距離單位是參數個數,因此N=[taint_addr-point_addr]/4,圖9 中2 個變量是連續的,因此分別為N和N+1。

3)構造格式化參數,m>n則構造格式化字符串“%[n]x%[N]$hn%[m-n]x%[N+1]$hn”(方括號內的值需要寫入實際計算得到的10 進制數值),m<n則構造“%[m]x%[N+1]$hn%[n-m]x%[N]$hn”。

4)根據實際情況整合約束條件,如m>n的情況下得到約束條件,最后根據約束求解方法對約束條件函數進行求解,函數公式中format 簡寫為fmt。

對約束條件的求解,除了約束條件還需要有約束表達式,本文通過動態污點分析已經能夠提取漏洞點約束條件中的輸入相關變量,在此基礎上,將約束條件相關的變量符號化,重新解析動態插樁過程提取的指令記錄,根據初始的符號化變量,采用Z3 的語法規則生成計算表達式,并自動提取python格式的表達式計算過程,自動生成對約束條件的求解腳本,最后執行Z3 求解腳本生成利用的exp 樣本。

4 實驗驗證與結果分析

本文選取了2018 年Defcon China CTF 比賽中的50 道Linux 題目和Windows 系統下的PLC WinNT、Media Player Classic、DirectShow Player GUI、WINWORD、VUPlayer、Float Ftp 作為測試集。選取的真實程序包括了工控程序、辦公軟件、多媒體軟件和網絡傳輸工具等,并根據PoC 要求選擇了軟件版本,其中PLC WinNT 是SCADA 工業控制軟件代表CODESYS 中的重要組件。考慮到不同版本軟件在功能和復雜度上處于相同量級,且相關版本軟件仍在廣泛使用,本文選取的程序具有一定的代表性。

4.1 可控內存寫檢測分析

本文實現的可控內存寫檢測基于動態污點分析實現,針對CTF 測試用例,將標準輸入stdin 標記為污點,采用qemu 的用戶態模式進行指令插樁,基于UDIS86 反匯編引擎解析指令實現動態污點傳播規則,針對寫內存的指令檢測內存寫入地址的尋址寄存器是否為污點判定是否潛在可控內存寫。

CTF 賽題測試集的PoC 輸入是通過AFL++模糊測試引擎獲得的,選擇能夠觸發可控內存寫或控制流劫持的PoC 作為測試本模塊的數據用例。測試結果如表3 所示,50 個用例中有22 個樣本的利用能力達到控制流劫持,16 個達到可控內存寫;另外pwn12 的數據傳播方式通過控制字段編碼,污點分析傳播會斷層判定失敗,pwn32 是命令注入類型漏洞,不屬于內存破壞漏洞,另外幾個用例Fuzz 得到的PoC 未能觸發這2 種狀態。

表3 測試結果

此外還有7 個樣例是格式化字符串漏洞,無法通過指令層面進行判定,即使格式化字符串漏洞的PoC 注入了%n 的可控地址寫功能,也無法通過mov[taint],taint 污點模式進行判定,這是由于其寫入的值是前序輸出的字符數量,該參數不具備taint 屬性,而只能是mov [taint],value 模式。針對該問題,本文通過檢測函數的格式化參數污點屬性及棧指針污點屬性,實現了基于函數層面的可控內存寫漏洞利用能力判定。函數級格式字符串漏洞識別情況如表4 所示,均能準確識別出格式化字符串漏洞。

表4 函數級格式字符串漏洞識別情況

同時,函數層面的可控內存寫判定還考慮read函數,該函數直接調用系統調用將數據讀入指定的內存緩沖區,如果指定內存的指針受到輸入控制同樣會觸發可控內存寫。

另外,針對現實場景的應用程序,本文選取的PLC WinNT、Media Player Classic、DirectShow Player GUI 是存在可控內存寫漏洞的實例程序,給予其觸發可控地址寫的PoC 作為測試輸入,測試本文方法能否檢測出崩潰點存在可控地址寫的能力;WinWord、VUPlayer、Float Ftp 程序是測試控制流劫持漏洞的樣本,評估在具備檢測控制流劫持條件下是否有可控內存寫的誤報情況。

基于內存地址控制力度的動態污點分析方法,實驗測試了6 款軟件,實例程序可控內存寫檢測情況如表5 所示。從表5 可知,能夠有效檢測出6 款軟件的漏洞PoC 其中3 款具備可控內存寫,3 款具備控制流劫持的情況,同只出現了PLC WinNT 的一處誤報,該誤報符合文中所述的指針索引雖被污染但受約束情況,能夠被有效發現是誤報,同時未出現漏報情況。

表5 實例程序可控內存寫檢測情況

本節實驗驗證了基于污點分析進行可控內存寫漏洞檢測的有效性,針對CTF 類型的小程序只需采用傳統的污點傳播規則,針對真實的復雜程序傳統的污點傳播規則會出現誤報,本文提出的內存地址控制力度動態污點分析方法能夠有效消除誤報,同時結合上下文約束條件能夠有效發現誤報情況。

4.2 漏洞利用要素自動提取分析

本文實現了可控內存寫漏洞函數指針及函數表利用要素的字段搜索和篩選。基于動態內存頁分析提取內存頁讀寫執行權限屬性,基于動態指令分析監測函數指針及跳轉表的引用情況,統計出其中潛在引用可能的函數表屬性情況,包括函數表不可寫數量、函數表可寫數量、函數表地址未隨機且可寫的數量。

結合靜態分析提取malloc 和free 函數中潛在的hook 函數指針作為注入點,搜索統計了50 個測試用例的函數表要素情況。CTF 測試集函數指針利用要素統計情況如圖10 所示,48 個用例都存在函數指針利用要素,僅pwn34 和pwn45 這2 個測試用例未發現函數指針利用要素。

圖10 CTF 測試集函數指針利用要素統計情況

本文搜索統計了6 款實例程序漏洞利用函數表要素提取情況,如表6 所示。其中,UW 表示不可寫函數表數量,AW 表示可寫函數表數量,UAW 表示地址未隨機且可寫的函數表數量。通過統計可以發現,大型程序中函數表的使用很普遍,其中可改寫的函數表也占用了一定比例,這是由于C++程序使用虛函數指針,是不可避免的,地址隨機化一定程度上緩解了函數指針被定位的問題,但是通過本文的搜索發現仍然有很多程序和模塊未使用地址隨機化對程序進行保護,因此本文仍能在測試用例中搜索出未隨機化的可改寫的函數表。

表6 實例程序漏洞利用函數表要素提取情況

此外,通過實驗統計的原始數據,本文還發現同一位置指令存在多次執行的情況,多次執行引用的內存表地址可能相同也可能不同,例如call [ebp+0x8]指令,多次執行到該位置時,由于ebp 值的差異使引用的函數表位置不一致。針對引用相同位置的情況,統計進行了去重;針對引用不同位置的情況,統計進行了累加計算。另外,如果是不同位置引用了同一位置的函數表,統計也按照去重的方式進行處理,這是因為本文以收集函數表利用要素為導向,相同位置的函數表只能作為利用要素的一個原子。

4.3 可控內存寫漏洞利用自動生成

針對50 個測試用例中通過指令或函數判定為存在可控內存寫能力漏洞的20 個測試用例,本文基于函數利用要素的搜索獲得需要寫入的地址,通過可控內存寫判定時的污點數據關系自動生成約束求解條件,并進行約束求解。可控內碼寫漏洞利用生成情況如表7 所示。

表7 可控內存寫漏洞利用生成情況

利用點標記了生成過程中選取的寫入內存地址,構造情況記錄了利用生成達到的效果。表7 中的利用生成存在1 個ret 劫持,這是通過控制地址的棧偏移指針,構造覆蓋函數返回地址實現ret 控制流劫持;11 個call 劫持有9 個是通過絕對地址進行定位覆蓋free 函數的hook 點構造控制流劫持,剩下的2 個(pwn39,pwn46)是覆蓋了程序自定義的函數指針實現劫持。構造失敗的用例情況包括:1)可控內存寫指令每次只覆蓋1 byte,需要多次構造可控內存寫,自動化構造失敗;2)需要輸入負整數經atoi 變換后溢出,自動求解失敗;3)程序是多進程,分析框架支持能力受限。

另外,針對PLC WinNT 實例程序中的81 個可寫函數表,本文搜索篩選出了觸發可控內存寫后潛在的42 個引用點,其中38 個是通過call 內存模式,包括call [IMM]類型和call [eax+IMM]類型,4 個是通過jmp 內存模式,均為jmp [IMM]模式(IMM 指立即數常量);同時,本文檢測出這些函數表和跳轉表是具備內存寫權限的,能夠基于可控內存寫的方式對其進行篡改,從而構造控制流劫持。通過利用生成,針對其中的35 個利用點,成功觸發了控制流劫持,另外7 個未能觸發控制流劫持是由于地址是隨機的,無法在實際運行過程定位絕對地址。

實驗表明,本文提出的可控內存寫漏洞自動利用方法能夠有效基于可控地址寫構造控制流劫持漏洞利用能力,50 個測試用例中,基于AFL 模糊測試挖掘的漏洞僅有22 個達到控制流劫持狀態,通過本文方法增加了12 個達到控制流劫持狀態,提升了54%。同時,針對PLC WinNT 的可控地址寫漏洞,構造了35 個不同位置的控制流劫持,驗證了本文方法在實際漏洞程序中的有效性。

5 討論

本文提出的可控內存寫漏洞自動利用生成方法針對觸發可控內存寫漏洞樣本,構造能夠觸發控制流劫持的PoC,進一步提升驗證了漏洞的破壞能力。而Mayhem 與PolyAEG 的相關工作僅支持控制流劫持類型的漏洞,在PoC 未達到控制流劫持狀態情況下是失效的。本文方法利用通過可控內存寫漏洞的自動判定、漏洞利用要素的自動搜索和約束條件的自動提取與求解實現利用樣本自動生成,補充了現有AEG 方案的不足。

本文提出了內存地址控制力度的動態污點分析方法,與libdft、Triton、Decaf 等污點分析方法相比,對污點傳播規則進行了適配性的優化改進,消除了可控內存寫漏洞判定的大量誤報情況,而傳統的污點傳播規則帶來的大量誤報會導致指令級的檢測無法正常使用。同時,本文方法也具備多標簽污點標記能力,能夠直接定位出輸入關聯的字節位置,服務于控制流劫持樣本的自動構造。

另外,本文總結了可控內存寫漏洞利用的多種模式及相關要素,針對構造控制流劫持的模式實現了漏洞利用函數表要素的自動化搜索,通過指令記錄結合短距離污點分析的方式提取潛在可利用的函數表,同時基于內存讀寫屬性篩選出其中可被改寫的函數表,又結合模塊地址隨機化屬性提取出其中的地址固定的部分,有效篩選出真正可被利用的函數表。針對指令記錄無法獲取的函數表,本文針對已知動態庫中的代碼特征模式進行特征搜索,提取了其中的一部分。但是,這類函數表的搜索提取并不完整,結合模糊測試挖掘更多的潛在路徑、提取更完整的利用要素將是后續的研究點。

本文提出的可控內存寫漏洞自動利用生成方法僅針對Linux 和Windows 用戶態程序實現了原型系統,研究表明可控內存寫漏洞在內核漏洞中頻繁出現,且具有很強的破壞能力,本文方法在內核漏洞的應用和推廣也將作為后續的研究點。

6 結束語

本文提出了一種可控內存寫漏洞的自動利用生成方法,基于內存地址控制力度的動態污點分析方法從指令和函數層面識別判定可控內存寫漏洞,結合動態插樁分析提取構造控制流劫持漏洞利用的要素,通過污點分析關聯的漏洞點自動提取漏洞利用生成的約束條件,最后自動進行約束求解生成利用樣本。通過對50 個測試用例和PLC等實例程序進行測試評估,驗證了本文方法的有效性,生成利用樣本達到控制流劫持能力的數量比模糊測試提升了54%,提升了漏洞的可利用性評估能力。

猜你喜歡
指令利用
聽我指令:大催眠術
利用min{a,b}的積分表示解決一類絕對值不等式
中等數學(2022年2期)2022-06-05 07:10:50
利用倒推破難點
利用一半進行移多補少
ARINC661顯控指令快速驗證方法
測控技術(2018年5期)2018-12-09 09:04:26
LED照明產品歐盟ErP指令要求解讀
電子測試(2018年18期)2018-11-14 02:30:34
利用數的分解來思考
Roommate is necessary when far away from home
利用
殺毒軟件中指令虛擬機的脆弱性分析
電信科學(2016年10期)2016-11-23 05:11:56
主站蜘蛛池模板: 爱色欧美亚洲综合图区| 精品伊人久久久久7777人| 亚洲人精品亚洲人成在线| 国产精品久久久久婷婷五月| 青草视频网站在线观看| 热99精品视频| 色综合五月婷婷| 国产成人精品一区二区| 日韩一二三区视频精品| 久久鸭综合久久国产| 欧洲日本亚洲中文字幕| 国产精品嫩草影院av| 亚洲va欧美ⅴa国产va影院| 怡红院美国分院一区二区| 亚洲日本中文字幕乱码中文| 国产尹人香蕉综合在线电影| 国产屁屁影院| 精品欧美日韩国产日漫一区不卡| 久久久久久久久久国产精品| 精品无码国产自产野外拍在线| 91精品国产91欠久久久久| 亚洲国产成人超福利久久精品| 国产男人天堂| 一本无码在线观看| 亚洲国产成熟视频在线多多| 国产黑丝一区| AV片亚洲国产男人的天堂| 亚洲黄网在线| 99热最新网址| 久久男人视频| 久青草国产高清在线视频| 亚洲欧洲日本在线| 国产91av在线| 不卡的在线视频免费观看| 欧美一级夜夜爽| 国产女人18毛片水真多1| 91视频99| 欧美第一页在线| 亚洲女人在线| 四虎国产在线观看| 国产精品视频免费网站| 成人一区在线| 一级全黄毛片| 特级精品毛片免费观看| 69av在线| 国产一区三区二区中文在线| 国产精品太粉嫩高中在线观看| 精品1区2区3区| 亚洲精品片911| 青草午夜精品视频在线观看| 乱人伦中文视频在线观看免费| 欧美国产日韩在线播放| 久久久久免费看成人影片 | 国产免费精彩视频| 2020国产精品视频| 亚洲第一色网站| 国产哺乳奶水91在线播放| 亚洲综合第一区| 伊人91在线| 人妻91无码色偷偷色噜噜噜| 日韩成人高清无码| 亚洲Av激情网五月天| 日韩在线视频网| 一本一道波多野结衣av黑人在线| 亚洲国产欧美国产综合久久| 伊人久久大香线蕉影院| 伊人福利视频| 国产精品久久自在自2021| 九色视频最新网址| 久久精品一卡日本电影| 亚洲熟妇AV日韩熟妇在线| 成人国产精品网站在线看| 亚洲性视频网站| 国产美女精品一区二区| 亚洲人在线| 亚洲人成网站在线播放2019| 国产无码高清视频不卡| 欧美亚洲国产一区| 久久www视频| 欧美啪啪精品| 亚洲福利视频一区二区| 日本久久网站|