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

基于S2E的Use-After-Free漏洞檢測方案

2016-05-09 07:07:42王軼駿
計算機應用與軟件 2016年4期
關鍵詞:分配檢測

馮 震 聶 森 王軼駿 薛 質

基于S2E的Use-After-Free漏洞檢測方案

馮 震 聶 森 王軼駿 薛 質

(上海交通大學信息安全與工程學院 上海 200240)

Use-After-Free漏洞是由程序試圖操作懸垂指針引起的。該類型漏洞近年來在針對瀏覽器客戶端的攻擊中變得愈發流行。提出一種針對Use-After-Free漏洞的檢測算法,并據此實現檢測方案UAFChecker。UAFChecker基于開源的多路徑軟件分析平臺S2E,它通過掛鉤關鍵的堆內存操作函數監控指針的生成,使用反匯編引擎BeaEngine在匯編層上跟蹤指針的傳播,通過收集和分析指針信息來檢測漏洞。實驗結果表明,配合Fuzzing技術UAFChecker成功定位和分析出IE8瀏覽器中存在的多個未被公開的Use-After-Free漏洞。

Use-after-free漏洞 漏洞檢測 懸垂指針 污點傳播 符號執行

0 引 言

近幾年來,各種應用軟件和操作系統組件曝出UAF(Use-After-Free)漏洞的報道頻頻見諸報端。CVE(Common Vulnerabilities and Exposures)數據庫所記錄的UAF漏洞的條目,自2008年開始幾乎以每年翻一番的速度增長。而在各項黑客大賽中,各國安全團隊也經常利用UAF漏洞攻破包括IE、Chrome和Safari在內的主流瀏覽器客戶端。UAF漏洞已經引起眾多安全人員和黑客們的關注。本文以S2E[1]為基礎設計并實現針對二進制程序UAF漏洞的檢測方案,介紹該方案的檢測算法、基本架構和設計細節,并對其進行了測試和評估。

1 S2E平臺介紹

S2E是選擇性符號執行的英文縮寫,是面向二進制程序的多路徑符號執行的軟件安全測試平臺[2]。S2E基于QEMU、KLEE和LLVM。其中,QEMU作為虛擬機運行目標程序,KLEE用于符號執行,而LLVM進行動態二進制翻譯。S2E能夠只對用戶關心的目標代碼實施符號執行,而對系統內核代碼實施具體執行,從而有效解決了路徑爆炸問題[3]。

S2E提供了擴展性良好的插件系統,用戶可以按需編寫自己的插件。S2E自帶五類插件供用戶使用,分別是系統事件監控插件、執行跟蹤插件、選擇性插件、分析插件和混合插件。本文的檢測方案就是以S2E插件的形式實現的。

2 問題描述

UAF漏洞涉及兩個事件:生成懸垂指針和使用懸垂指針。兩個事件在時間點上一般是分開的。

2.1 漏洞解釋

當所指向的對象被釋放或者回收,但是對該指針沒有作任何修改,以至于該指針仍舊指向已經回收的內存地址,此情況下該指針便稱為懸垂指針(也叫迷途指針)。圖1展示了懸垂指針的生命周期。在t創建對象1被釋放,從而生成了懸垂指針。在t銷毀之前,如果程序又使用了懸垂指針,就會導致UAF漏洞[4]。此時,懸垂指針指向的內存,或者未被分配,或者已經另作他圖,并非程序原本期望的行為。攻擊者可以利用UAF漏洞讀取私密信息,重寫敏感信息,甚至執行任意代碼[5]。

圖1 懸垂指針生命周期

2.2 技術現狀

分析程序可以分為靜態和動態兩類。靜態分析程序能確保完備性但誤報較高。動態分析程序具體使用的方法則較為多樣,大致分為三類:影子內存,即將程序所使用的內存映射到可控內存;動態插樁,即在指令之間插入分析代碼;Debug Allocators,即通過HOOK分配函數,強制分配冗余數據。動態分析的局限在于代碼覆蓋率會比較低。

動態插樁是目前最為流行的動態分析技術。在應用該技術檢測UAF漏洞時,具體的檢測算法可分為空間算法和時間算法。空間算法指的是處理懸垂指針指向的堆內存(例如將其設置為無訪問權限或添加隔離區),從而確保目標程序在試圖訪問該內存時出錯。這種算法有兩個局限:一是只能在直接訪問堆內存即發生UAF漏洞時觸發;二是無法檢測堆內存被重分配的情況。時間算法基于一個直覺,即長期存在的懸垂指針是不安全的。時間算法首先設置生命閾值,然后記錄和跟蹤所有懸垂指針的生命周期,并在該周期超過閾值時發出預警。時間算法能在早期檢測出懸垂指針,其代價是較大的開銷和一定的誤報率。

2.3 檢測原理

我們的檢測方法同樣采用了動態分析的插樁技術。為了提高代碼覆蓋率,首先我們選擇S2E作為開發平臺,發揮其強大的多路徑符號執行能力;而在輸入復雜的情況下,通過和Fuzzing技術配合縮小需要符號化的數據。

然后,我們重新設計了UAF檢測算法,基本流程是:HOOK堆管理API,以監控堆內存的分配和釋放;跟蹤指針的傳播,維護指針和堆內存的映射關系;在堆內存被釋放時把與其對應的所有指針清零置空。下面用一段示例代碼予以說明:

0A*a=newA();moveax,dwordptr[b]1B*b=newB();movecx,dwordptr[eax+4]2b->pa=a;moveax,dwordptr[ecx]3deletea;movedx,dwordptr[eax+4]4a=NULL;calledx5b->pa->f1();

首先要說明的是右側的匯編語句和左側的C++語句并非一一對應,而且語句之間可能省略了部分代碼。如果a所使用的堆內存被再分配,而且恰好也是一個包含虛函數的類對象,那么空間算法可能無法檢測出該UAF漏洞,結果是代碼調用了非預期對象的方法。如果再分配的目標只是普通的對象,那么空間算法可能在匯編語句2、3、4報錯,這取決于再分配后堆內存的內容。如果堆內存沒有再分配,那么空間算法可能在匯編語句3和4報錯。

而在任何情況下,我們的檢測算法都能確保程序在匯編語句2報錯。這是因為指針清零后,無論是讀寫成員屬性,還是執行成員方法,任何試圖對該指針的訪問都會被拒絕。

檢測算法的關鍵在于清零置空和釋放堆塊對應的所有指針,因此需要可靠的污點跟蹤功能,以獲取指向釋放堆塊的所有指針。該算法在一定程度上提前了UAF漏洞的發現時機,提高了漏洞的發現概率,同時完全解決了堆內存再分配帶來的問題。而在具體實現檢測方案時,我們還結合了空間算法,以克服可能存在的指針遺漏問題。

3 檢測方案

以S2E平臺為基礎我們設計和實現了針對目標二進制程序中UAF漏洞的檢測方案,我們將其命名為UAFChecker。

3.1 架構概述

UAFChecker在功能邏輯上可以分為反匯編模塊、堆內存監控模塊、指針傳播跟蹤模塊和信息分析模塊四部分,基本架構如圖2所示。

圖2 UAFChecker架構圖

反匯編模塊負責獲取指令寄存器EIP對應指令的匯編代碼;堆內存監控模塊通過掛鉤堆內存操作函數監控堆的分配和釋放,也就是正常指針(堆分配)和懸垂指針(堆釋放)的生成;指針傳播跟蹤模塊是基于反匯編模塊得到的匯編代碼,在匯編層上實現的一套污點跟蹤系統[6],指針是污點源;信息分析模塊收集和分析與指針相關的信息,并把分析結果寫入到日志文件中。

3.2 模塊分析

3.2.1 反匯編模塊

我們把開源的反匯編引擎BeaEngine[7]編譯到S2E中。利用EIP地址獲得對應匯編指令。這引入了非??捎^的開銷,幾乎導致QEMU一直處于假死狀態。為此,我們設置數目為4K的反匯編指令Cache,用于緩存至多4K條匯編指令,顯著提高了反匯編效率。反匯編模塊會分析匯編指令的操作符和操作數,是其他三個功能模塊的基礎。

3.2.2 堆內存監控模塊

UAFChecker使用FunctionMonitor(S2E自帶插件)掛鉤了RtlAllocateHeap和RtlFreeHeap兩個Windows API。幾乎所有的堆分配函數最終都會使用這對API,例如malloc/free和new/delete,因此掛鉤RtlAllocateHeap/RtlFreeHeap后也能監控到這些函數的調用。另外,IE瀏覽器在處理BSTR字符串時使用和維護了一個空閑堆塊的緩存,這和Windows操作系統的快表結構很相似[8]。與此相關的API是AllocCachedMem和FreeCachedMem,具體細節會在第4節分析說明。

3.2.3 信息分析模塊

信息分析模塊共維護了三個隊列:分配隊列、指針隊列和反向隊列。其中,分配隊列記錄了所有分配的堆內存塊;指針隊列記錄了所有指針;而反向隊列記錄了指向某一堆內存的所有指針,用于查詢和清零懸垂指針。

在堆塊被釋放時執行下述操作:將反向隊列中的指向該堆內存的所有指針清零置空,并將堆內存數據區填充0xcc(中斷int 3的機器碼)。一方面,如果程序試圖訪問某懸垂指針,因為其指向的地址是0,所以會發生非法訪問;另一方面,如果程序執行了call some_address而some_address位于釋放堆塊中,因為其數據一定是0xcccccccc,故程序會崩潰。

3.2.4 指針傳播模塊

該模塊是UAFChecker的核心部分,檢測算法高度依賴該模塊的準確性和完備性。指針傳播模塊在反匯編模塊提供的匯編層上跟蹤指針的傳播,并向信息分析模塊提供輸入。

我們首先定義了污點(指針)結構體,包括start、offset和ext等成員。出于性能的考慮,幾乎所有的字節級的污點跟蹤程序都只能判斷某個字節是否是污點,即把所有的污點數據等同處理[9]。而我們使用start和offset,能夠提供污點源的精確位置:start表示堆內存的起始地址,offset表示相對偏移。

然后定義指針傳播的若干規則:MOVE、ADD、XCHG、LEA、CLS和NOP。X86指令集中的所有指令都會應用某種規則或組合,并以模擬執行的方式傳播污點[10]。表1列出了部分指令和規則的對應關系。

表1 x86指令、抽象和規則

和污點傳播一樣,指針傳播也要解決線程切換和CPU狀態切換導致通用寄存器的內容不一致的問題[11]。而與之不同,且更為關鍵的問題是如何識別堆管理結構。

測試的目標軟件是Windows XP上的IE 8瀏覽器,因此我們要關注FreeList、LookasideList以及IE自身使用的堆管理結構。這些數據結構會記錄空閑堆塊信息,相關指針無須跟蹤,更不能清零,否則會引發異常。

FreeList是雙向鏈表,所以能夠根據釋放堆塊得到前趨結點和后繼結點,進而計算出記錄指針的位置。LookasideList是單向鏈表,因此無法直接得到前驅結點,但是可以利用快表中至多存在一個結點指向釋放堆塊這一事實確保排除相應指針。而在處理IE瀏覽器內部的緩存數據結構時,我們采用了攻擊者編寫EXP時才會使用的技巧,即通過預分配清空所有緩存。最終我們設計了如下算法:

算法1 堆管理結構處理算法。

輸入:釋放堆塊

輸出:記錄釋放堆塊的指針被刪除

1) 調用flushCache方法,強制使用RtlAllocateHeap和RtlFreeHeap;

2) 獲取釋放堆塊對應的反向隊列中的末尾結點;

3) 將末尾結點從指針隊列和反向隊列中刪除;

4) 讀取釋放堆塊的前兩個DWORD,記為dw1和dw2;

5) 分別比較dw1+4和dw2的內容與釋放堆塊的地址,如果相等就從指針隊列和反向隊列中刪除。

步驟1)中的flushCache方法通過分配一系列的堆塊,確保IE分配和釋放堆內存時使用HOOK的API。步驟3)刪除的結點可能存在于FreeList或LookasideList中,該步驟能夠確保快表中的記錄指針不被指針傳播模塊跟蹤。而步驟4)和5)用來檢測釋放堆塊被添加至FreeList的情況,能夠刪除可能記錄在空表中的指針。

4 方案評估

在正式測試IE瀏覽器之前,我們首先進行了基準測試,用來檢測UAFChecker的基礎性能。

4.1 基準測試

基準測試程序集中的樣本由SAVG(Systems Analysis and Verification Group)和LAV(一款開源的靜態程序錯誤檢測工具)提供[12]。在輸入比較簡單的情況下,UAFChecker能夠充分發揮S2E多路徑符號執行的優勢,將輸入符號化并約束求解關鍵路徑,檢測出可能存在的UAF漏洞。測試結果如表2所示。

表2 基準測試結果匯總

表中DF和ML分別表示Double Free和Memory Leak。上述測試結果和基準測試集的說明完全一致,無誤報和漏報情況,說明UAFChecker在輸入較簡單的情況下表現良好。更重要的是,這說明指針傳播模塊功能正常,確實能夠準確地跟蹤和監控指針的生成和傳播。

4.2 測試IE瀏覽器

實驗環境為Windows XP SP3全補丁,IE8.0.6001.18702,VMWare Workstation 8.0.2 build-591240虛擬機環境。

瀏覽器的輸入是HTML文件,文本結構復雜,不宜將其完全符號化直接測試。因此我們首先使用Fuzzing工具生成HTML樣本,然后再使用UAFChecker進行測試。使用這種方案我們得到了大量Crash文件,目前已經分析和確認了3處UAF漏洞,如表3所示。

表3 UAF漏洞信息匯總

Crash文件名是Fuzzing工具自動生成的。上述漏洞還沒有被公開,都是IE8的0-day。有趣的是,這三個漏洞都和節點操作有關,有相同的“漏洞框架”:Javascript代碼塊首先修改DOM樹結構,如appendChild和applyElement。這些語句執行時修改了DOM樹結構,但是新創建的DOM元素或被修改的元素并未馬上得到渲染。接著,后續代碼把這些元素的屬性修改為已渲染,但瀏覽器不知道元素的釋放情況,也不會更新節點關系,從而導致Use-After-Free。我們已經分別為上述漏洞編寫了EXP,成功地彈出計算器,即能夠實現任意代碼執行。

值得一提的是,微軟6月發布的補丁引入了Isolated Heap,7月發布的補丁又引入了Deferred Free,這兩個補丁瞬間提高了UAF漏洞的利用門檻。Net Market Share今年5月的調查顯示,雖然微軟早已放棄了對XP系統的支持,但XP的市占率仍高達29.23%。絕大部分XP用戶不會下載和安裝這兩個補丁,所以上述三個漏洞仍然具有很大的威脅。而且,三個漏洞自身沒有被補掉,只是目前比較流行的漏洞利用技術難以克服新的安全機制而已[13]。

4.3 相關工作

SEA[14]是Symbolic Exploit Assistant的縮寫,采用Python編寫,目標是輔助發現二進制程序中的各種內存錯誤。SEA為面向二進制程序的分析工具提供了設計出色的架構模型。目前SEA只支持分析目標程序的REIL碼,而且要求輸入文件記錄了目標程序所有的堆內存操作。VSA[15]是一款針對UAF漏洞的靜態分析工具,因此具有靜態分析的優勢和缺陷。Undangle提出和實現了時間算法,并成功地發現了Firefox 3中的6處危險指針,其分析效率和分析效果與參數設置密切相關。UAFChecker的優勢一是利用S2E的多路徑符號執行能力提高了代碼覆蓋率,二是檢測算法解決了堆內存再分配的問題,并提高了UAF漏洞的發現概率。不過,UAFChecker對指針傳播模塊的依賴度較高,而后者的準確性和完備性難以保證,由于采用了S2E,UAFChecker的開銷也比較大。

5 結 語

本文基于S2E平臺設計和實現了針對UAF漏洞的檢測方案UAFChecker。UAFChecker采用Cache和Hash算法極大地減少了使用BeaEngine反匯編帶來的開銷,然后在匯編指令層上實現了真正的字節級的指針傳播系統。漏洞檢測算法在一定程度上提前了UAF漏洞的發現時機,提高了漏洞的發現概率,并完全解決了堆內存再分配的問題。配合Fuzzing工具,UAFChecker成功地在IE8中發現了多個未被公開的UAF漏洞。盡管UAFChecker已經能夠基本滿足我們的需求,但是它在效率和完備性方面還存在諸多不足。在未來,我們將主要在如下三個方面開展研究工作:

1) 在S2E的中間語言層上重新實現指針傳播模塊,從而能夠完全規避反匯編引入的開銷。

2) 擴展和優化檢測算法,一種可能的途徑是結合時間算法進一步提高UAF漏洞的發現概率。

3) 優化和改進堆管理結構處理算法。

[1] Vitaly Chipounov,Volodymyr Kuznetsov,George Candea. S2E: A Platform for In-Vivo Muti-Path Analysis of Software System[C]//New York: Newsletter ACM SIGPLAN Notices - ASPLOS ’12,2012,47(4):265-278.

[2] Edward J Schwartz,Thanassis Avgerinos,David Brumley. All You Ever Wanted to Know about Dynamic Taint Analysis and Forward Symbolic Execution (but Might Have Been Afraid to Ask)[C]//Washington DC: Proceedings of the 2010 IEEE Symposium on Security and Pricacy,2010:317-331.

[3] 王學,李學新,周智鵬,等.S2E測試平臺及并行性性能分析[J].信息網絡安全,2012(7):16-19.

[4] Victor van der Veen,Nitish dutt-Sharma,Lorenzo Cavallaro,et al. Memory errors: the past,the present and the future[C]//Berlin,Heidelberg: Proceddings of the 15th international conference on Research in Attacks,Intrusions,and Defenses,2012:86-106.

[5] Juan Caballero,Gustavo Grieco,Mark Marron,et al. Undangling: Early Detection of Dangling Pointers in Use-After-Free and Double-Free Vulnerabilities[C]//New York: Proceedings of the 2012 International Symposium on Software Testing and Analysis,2012:133-143.

[6] Eric Bosman,Asia Slowinska,Herbert Bos. Minemu: the world’s fastest taint tracker[C]//Berlin,Heidelberg: Proceedings of the 14th international conference on Recent Advances in Intrusion Detection,2011:1-20.

[7] BeatriX,Igor Gutnik,JCie. BeaEngine: disassembler library x86 x86-x64[EB/OL]. (2010-1-6)[2014-1-3]http://beaengine.org.

[8] Alexander Sotirov. Heap Feng Shui in JavaScript[C]//Las Vegas: BlackHat USA,2007.

[9] Vasileios P Kemerlis,Georigios Portokalidis,Kangkook Jee,et al. libdft: Pratical Dydnamic Data Flow Tracking for Commodity Systems[C]//London: Preceedings of the 8th ACM SIGPLAN/SIGOPS International Conference on Virtual Execution Environment,2012:121-132.

[10] James Clause,Wanchun Li,Alessandro Orso. Dytan: a generic dynamic taint analysis framework[C]//New York: Proceedings of the 2007 international symposium on Software testing and analysis,2007:196-206.

[11] David (Yu) Zhu,Jaeyeon Jung,Dawn Song,et al. TaintEraser: protecting sensitice data leaks using application-level taint tracking[C]//New York: Newsletter ACM SIGOPS Operating Systems Review,2011:142-154.

[12] Milena,Vujosevic Janicic,Victor Kuncak. Development and evaluation of LAV: an SMT-based error finding platform[C]//Berlin,Heidelberg: Proceedings of the 4th intenational conference on Verified Software: theories,tools,experiments,2012:98-113.

[13] 豬兒蟲小次郎(新浪微博網名).微軟最近干了些啥[EB/OL].[2014-7-16]http://t.cn/RP7Wimy.

[14] Neuromancer. SEA: Symbolic Execution Assistant[EB/OL]. (2013-6-20)[2013-9-27]https://github.com/neuromancer/SEA.

[15] Feist J,Mounier L,Potet M L. Statically Detecting Use After Free on Binary Code[J].Journal of Computer Virology and Hacking Techniques,2014,10(3):1-7.

USE-AFTER-FREE VULNERABILITIES DETECTION SCHEME BASED ON S2E

Feng Zhen Nie Sen Wang Yijun Xue Zhi

(SchoolofInformationSecurityEngineering,ShanghaiJiaoTongUniversity,Shanghai200240,China)

Use-After-Free vulnerabilities are caused by the attempt of a program to operate on a dangling pointer. This type of vulnerability is growing rapidly in popularity,especially for exploiting web browsers. In this paper we propose a new algorithm to detect Use-After-Free vulnerabilities and implement the detection scheme UAFChecker accordingly. UAFChecker is based on S2E,an open source platform for in-vivo multi-path analysis of software systems. It monitors the creation of pointers by hooking key heap-operating functions and tracks the propagation of all pointers by using BeaEngine on assembly code level. Then it detects vulnerabilities by collection and analysis of information of pointers. Experimental result indicates that by collaborating with Fuzzing technology,UAFChecker succeeds in locating and analysing multiple 0-day Use-After-Free vulnerabilities in IE8 browser.

Use-after-free vulnerability Vulnerability detection Dangling pointer Taint propagation Symbolic execution

2014-08-26。國家自然科學基金項目(61332010);高級XXX技術研究(秘密級)(CNITSEC-KY-2013-009/2)。馮震,碩士生,主研領域:信息安全。聶森,博士生。王軼駿,講師。薛質,教授。

TP3

A

10.3969/j.issn.1000-386x.2016.04.064

猜你喜歡
分配檢測
基于可行方向法的水下機器人推力分配
“不等式”檢測題
“一元一次不等式”檢測題
“一元一次不等式組”檢測題
“幾何圖形”檢測題
“角”檢測題
應答器THR和TFFR分配及SIL等級探討
遺產的分配
一種分配十分不均的財富
績效考核分配的實踐與思考
主站蜘蛛池模板: www.91在线播放| 伊人AV天堂| 日本黄色a视频| 91成人在线观看| 亚洲国产日韩视频观看| 欧美日韩国产成人在线观看| 毛片手机在线看| 亚洲第一成年免费网站| 精品国产Ⅴ无码大片在线观看81| 亚洲欧美另类视频| 中文字幕2区| 国产人免费人成免费视频| 免费高清a毛片| 色综合中文字幕| 狠狠五月天中文字幕| 天堂网国产| 国产一区二区人大臿蕉香蕉| 毛片免费在线| 久久99国产乱子伦精品免| 免费一级毛片不卡在线播放| 亚洲高清中文字幕| 一级毛片在线免费看| 国产精品自拍合集| 青青网在线国产| 日本www在线视频| 最新亚洲av女人的天堂| 最新精品国偷自产在线| 久久久久人妻一区精品色奶水 | 久久久久国产精品嫩草影院| 动漫精品啪啪一区二区三区| 免费观看国产小粉嫩喷水| 色妞www精品视频一级下载| 国产精品免费电影| 亚洲午夜综合网| 欧美日韩在线亚洲国产人| 456亚洲人成高清在线| 欧美在线导航| 欧美97色| 国产日韩丝袜一二三区| 超薄丝袜足j国产在线视频| 亚洲高清在线播放| 精品视频福利| 国产69精品久久久久孕妇大杂乱 | 亚洲最大福利网站| 成人国产精品一级毛片天堂| 国产小视频网站| 国产午夜无码片在线观看网站| 国产精品亚洲一区二区三区z| 久久99国产综合精品1| 国产精品制服| 麻豆精选在线| 日韩一区二区在线电影| 国产a在视频线精品视频下载| 久久久精品无码一二三区| 婷婷综合色| 天堂在线亚洲| 亚洲国产无码有码| 91福利在线看| 中文字幕亚洲精品2页| 国产在线啪| 日韩黄色大片免费看| 毛片在线看网站| 久久国产乱子| 成人韩免费网站| 无码高潮喷水在线观看| 亚洲男人在线| 国产嫩草在线观看| 97在线国产视频| 久久99热这里只有精品免费看| 乱人伦中文视频在线观看免费| 免费黄色国产视频| 日韩a在线观看免费观看| 国产草草影院18成年视频| 波多野结衣在线一区二区| 中文字幕亚洲乱码熟女1区2区| 丁香婷婷激情网| 自拍亚洲欧美精品| 久久综合伊人77777| 亚洲视频免| 欧美激情首页| 精品国产免费观看| 国产农村1级毛片|