【摘 要】堆噴射技術(shù)因為其良好的可移植性和易用性,被廣泛應(yīng)用于針對瀏覽器的攻擊中。堆噴射的實質(zhì)是申請大量的連續(xù)的內(nèi)存,使得溢出攻擊后的地址可預(yù)測。針對堆噴射的檢測和防御,國內(nèi)外都有很多成熟的技術(shù),本文介紹了其中最經(jīng)典模型以及其特點。
【關(guān)鍵詞】堆噴射 檢測 可預(yù)測
1 堆噴射原理介紹
堆噴射在學術(shù)界并無嚴格的定義,一般來講堆噴射技術(shù)是通過向內(nèi)存申請分配大量的對象,使攻擊載荷(通常是NOPSLED + Shellcode[1])分布在連續(xù)且可預(yù)測的內(nèi)存區(qū)域的一種技術(shù)。堆噴射技術(shù)不是一種攻擊技術(shù)而是一種攻擊載荷傳遞技術(shù),是黑客攻擊的催化劑而不是發(fā)起源。堆噴射技術(shù)由于在堆中申請了大量的對象,使得溢出后可選地址變多,從而使得攻擊的成功率更高,適用范圍更廣。
2 堆噴射技術(shù)詳細介紹
首先簡單介紹一下什么是堆,以及在系統(tǒng)中如何申請堆內(nèi)存。從定義上來講,堆是一種數(shù)據(jù)結(jié)構(gòu),當應(yīng)用程序需要使用大量的動態(tài)內(nèi)存空間時,只能在堆內(nèi)申請空間。在Windows系統(tǒng)中,可以調(diào)用VirtualAlloc函數(shù)來申請堆內(nèi)存(當然也可以采用其它的函數(shù)如HeapCreate等申請大塊的堆內(nèi)存。)。
堆噴射中的每一個對象都是一串滑板和攻擊載荷(shellcode)組成,圖中所用滑板指令為 or al, 0ch。 這些指令并沒有實際的執(zhí)行功能,只是為了確保程序能順序執(zhí)行到核心的攻擊載荷(shellcode)。
3 堆噴射的檢測和保護手段
3.1 檢測shellcode
由Manuel Egele等人[2]在2009年提出了關(guān)于堆噴射的檢測手段,具體方法是通過跟蹤所有堆內(nèi)分配內(nèi)存的字符串并對其進行檢測,通過修改瀏覽器的Javascript引擎,在當堆內(nèi)字符串被創(chuàng)建時,就使用開源shellcode檢測引擎libemu[3]檢測其是否為shellcode,如果是則存在堆噴射攻擊,如果沒有則程序繼續(xù)向下執(zhí)行。
3.2 計算指令表面積
由康奈爾大學和微軟研究院研究學者Paruj以及Benjamin等人提出的堆噴射檢測系統(tǒng)——Nozzle[4]對后續(xù)的研究影響力最大。Nozzle提出了一新的術(shù)語表面積(Surface area),來表述程序控制流(Control Flow[5])中程序最可能流向的指令塊。因為在堆噴射中,每一個堆對象都是由滑板指令和shellcode構(gòu)成,而滑板指令的功能就是使shellcode得以正常執(zhí)行,所以每個堆塊的shellcode會具備較大的表面積。由此也可以得到推論,當某一內(nèi)存塊的表面積大于特定閥值的時候,則可以判定其內(nèi)包含攻擊載荷,用戶可能遭受堆噴射攻擊。相比之前的檢測手段,Nozzle的檢測準確率更高。
3.3 插入隨機值
荷蘭魯汶大學研究學者Francesco提出的模型Bubble是一個防止用戶遭到堆噴射攻擊的模型。它主要是在Javascript字符串對象在堆中的時候,以25字節(jié)為間隔,向其插入隨機的字節(jié)碼,當字符串被調(diào)用時,則將隨機字節(jié)碼去掉。因為已知最小的shellcode的長度是大于25字節(jié)的,所以Bubble可以保證堆噴射生成的字符串中的惡意指令都不會正確執(zhí)行。因為Bubble模型采用的方法簡單,所以比之前的檢測效率都高。
4 總結(jié)
本文主要介紹了堆噴射攻擊概念和它的危害性,同時分析了堆噴射攻擊產(chǎn)生的歷史和詳細的攻擊步驟,最后介紹了國際上比較流行的防御方法,和它們防御和保護的具體機理。各種防御手段互有優(yōu)劣,讀者可以根據(jù)實際需要選擇相應(yīng)的防御檢測手段。
參考文獻
[1]A.One, “Smashing the stack for fun and profit,”Phrack magazine, vol. 7, p. 365, 1996
[2]M. Egele,P.Wurzinger, C.Kruegel,and E.Kirda, “Defending browsers against drive-by downloads: Mitigating heap-spraying code injection attacks,”in Detection of Intrusions and Malware, and Vulnerability Assessment, ed: Springer, 2009, pp. 88-106
[3]P. Baecher and M.Koetter, “l(fā)ibemu-x86 shellcode detection and emulation, 2007,” ed
[4]P. Ratanaworabhan,V.B.Livshits, and B.G.Zorn, “NOZZLE: A Defense Against Heap-spraying Code Injection Attacks,”in USENIX Security Symposium, 2009, pp. 169-186
[5]F.E.Allen,“Control flow analysis,”in ACM Sigplan Notices, 1970, pp. 1-19