亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

基于邏輯隔離的緩沖區(qū)溢出動(dòng)態(tài)度量方法

文檔序號(hào):6575484閱讀:205來(lái)源:國(guó)知局
專利名稱:基于邏輯隔離的緩沖區(qū)溢出動(dòng)態(tài)度量方法
技術(shù)領(lǐng)域
本發(fā)明涉及信息安全領(lǐng)域,尤其涉及一種基于邏輯隔離的緩沖區(qū)溢出動(dòng)態(tài)度量方法。
背景技術(shù)
緩沖區(qū)溢出指當(dāng)向一個(gè)已分配了確定存儲(chǔ)空間的緩沖區(qū)內(nèi)復(fù)制多于該緩沖區(qū)處 理能力的數(shù)據(jù)時(shí),將發(fā)生緩沖區(qū)溢出。溢出破壞了數(shù)據(jù)空間的完整性。溢出包括堆溢出和 棧溢出。 緩沖區(qū)溢出攻擊是,通過(guò)溢出覆蓋指向執(zhí)行代碼的指針,使該指針指向注入的惡 意代碼,從而改變程序的控制流程,運(yùn)行外界注入的程序。所以,攻擊的關(guān)鍵點(diǎn)在于破壞指 針數(shù)據(jù)空間的完整性。 目前存在兩種主要的緩沖區(qū)溢出攻擊模式。第一種,向緩沖區(qū)寫(xiě)入的數(shù)據(jù)包含 shellcode (可執(zhí)行的二進(jìn)制代碼),當(dāng)發(fā)生緩沖區(qū)溢出時(shí),溢出的數(shù)據(jù)覆蓋掉一個(gè)可執(zhí)行 程序的入口地址(如函數(shù)的返回地址,函數(shù)指針變量等等),使得該地址指向shellcode,從 而當(dāng)程序試圖通過(guò)該入口地址執(zhí)行代碼時(shí),就會(huì)執(zhí)行攻擊者的shellcode,這種方式稱為代 碼注入攻擊;第二種,攻擊者并不在寫(xiě)入緩沖區(qū)的數(shù)據(jù)中包含可執(zhí)行代碼,而只是包含一些 系統(tǒng)調(diào)用所需要的參數(shù),用一個(gè)系統(tǒng)函數(shù)的地址覆蓋可執(zhí)行代碼的入口地址,通過(guò)巧妙的 構(gòu)造可以使程序用預(yù)設(shè)的參數(shù)調(diào)用系統(tǒng)函數(shù),比如用'7bin/sh"調(diào)用system()函數(shù),這種 方式稱為return_into_libc攻擊。 早在1998年,Crispin Cowan等人在 一 篇發(fā)表于"7th USENIX SecurityConference,, 中的名為"Stack Guard-Automatic Adaptive Detection and Prevention ofBuffer-Overflow Attacks"的學(xué)術(shù)論文中介紹了他們所研究的用于gcc編 譯器上檢測(cè)棧溢出的技術(shù)。Stack Guard技術(shù)對(duì)編譯器進(jìn)行擴(kuò)展,調(diào)用函數(shù)時(shí)在堆棧的局部 變量和函數(shù)地址之間存放一個(gè)程序隨機(jī)產(chǎn)生的4個(gè)字節(jié)的"canary"字,在函數(shù)返回之前檢 查"canary "的完整性。如果"canary "被破壞,則表明有緩沖區(qū)溢出產(chǎn)生,程序被中止。
微軟在Visual C++. NET中使用的GS編譯技術(shù)就是在吸收了 Stack Guard技術(shù)思 想的基礎(chǔ)上開(kāi)發(fā)出來(lái)的。 GS編譯選項(xiàng)為每個(gè)函數(shù)調(diào)用增加了一些額外的數(shù)據(jù)和操作,用以檢測(cè)棧中的溢 出。 1、與Stack Guard技術(shù)類似,在所有函數(shù)調(diào)用發(fā)生之時(shí),向棧幀內(nèi)壓入一個(gè)額外的 隨機(jī)數(shù)"canary,,。被標(biāo)注為Security Cookie。 2、 Security Cookie位于EBP之前,系統(tǒng)還將在.data的內(nèi)存區(qū)域中存放一個(gè) Security Cookie的畐U本。 3、當(dāng)棧中發(fā)生溢出時(shí),Security Cookie將被首先淹沒(méi),之后才是EBP和返回地 址。 4、在函數(shù)返回前,系統(tǒng)將執(zhí)行一個(gè)安全驗(yàn)證操作,成為Security Check。
5、在Security Check的過(guò)程中,檢查Security Cookie的完整性,比較棧幀中原 來(lái)存放的Security Cookie和.data中副本的值,如果兩者不符,說(shuō)明棧幀中的Security Cookie已被破壞,即棧中發(fā)生了溢出。 6、當(dāng)檢測(cè)到棧中發(fā)生溢出時(shí),系統(tǒng)將進(jìn)入溢出錯(cuò)誤處理流程,函數(shù)不會(huì)被正常返 回,ret指令也不會(huì)被執(zhí)行。 通過(guò)GS安全編譯選項(xiàng),操作系統(tǒng)能夠在運(yùn)行中有效地檢測(cè)并阻止絕大多數(shù)基于 堆棧溢出的攻擊。 但是,通過(guò)具體實(shí)驗(yàn),發(fā)現(xiàn)上述緩沖區(qū)溢出檢測(cè)方法,并不能完全檢測(cè)出所有的溢 出和攻擊方法。以下將列舉4個(gè)具體的攻擊實(shí)例,從感性上認(rèn)識(shí)幾種特殊的攻擊方法,為本 發(fā)明后續(xù)提出的方法做個(gè)鋪墊。
攻擊實(shí)例1 : 如圖1所示,棧緩沖區(qū)中存儲(chǔ)若干棧幀,將其從棧底到棧頂依次標(biāo)記。其中棧幀 [i]位于棧頂。 如果棧幀[i]中的緩沖數(shù)據(jù)Buf [i]中某個(gè)字符串?dāng)?shù)據(jù)chari出現(xiàn)了緩沖區(qū)溢出 的情況;且該溢出最終影響了棧幀[i-1]中的指針數(shù)據(jù)Pter[i-l],如圖1中由Buf[i]引 出二維箭頭①所示。在該情況下,因?yàn)楦綦x標(biāo)志S印[i]邏輯隔離了相鄰棧幀中的緩沖數(shù)據(jù) 和指針數(shù)據(jù),所以可以在棧幀[i]退出時(shí),通過(guò)檢查S印[i]的完整性,來(lái)判斷Pter[i-l]是
否被覆蓋。 但是,如果棧幀[i]中的緩沖數(shù)據(jù)Buf[i]中某個(gè)字符串?dāng)?shù)據(jù)chari出現(xiàn)了緩沖區(qū) 溢出的情況;且該溢出最終影響了棧幀[i]中的指針數(shù)據(jù)Pter[i],如圖1中由Buf[i]引 出二維箭頭②所示。在該情況下,因?yàn)樵谕粋€(gè)棧幀內(nèi)的兩種數(shù)據(jù)類型之間沒(méi)有邏輯隔離 標(biāo)志,所以無(wú)法通過(guò)檢查S印[i],來(lái)判斷Pter[i]的完整性。如果在棧幀[i]中存儲(chǔ)了某個(gè) 代碼指針pi,直接指向某段執(zhí)行代碼,如圖1中由Pter[i]引出箭頭③所示。那么,上述溢 出可將pi改為指向另外一段執(zhí)行代碼,如圖1中由Pter[i]引出箭頭④所示。
如果在棧幀[j]退出前,調(diào)用pi指向的代碼,則最終執(zhí)行另外一段非預(yù)期的代碼 段,實(shí)現(xiàn)了攻擊的效果。所以,必須杜絕在兩個(gè)隔離標(biāo)志之間出現(xiàn)溢出覆蓋指針的情況。
攻擊實(shí)例2: 如圖2所示,棧緩沖區(qū)中存儲(chǔ)若干棧幀,將其從棧底到棧頂依次標(biāo)記。其中棧幀 [j]位于棧頂,在棧頂下方某位置存儲(chǔ)了棧幀[i]。在棧幀[j]中存儲(chǔ)了某個(gè)多重代碼指針 pj,在棧幀[i]中存儲(chǔ)了某個(gè)代碼指針pi。多重指針pj通過(guò)棧幀[j]和棧幀[i]之間的指 針數(shù)據(jù)實(shí)現(xiàn)地址傳遞,最終指向pi,如圖2中由Pter[j]引出箭頭①所示。棧幀[i]中的 代碼指針pi直接指向某段執(zhí)行代碼,如圖2中由Pter[i]引出箭頭②所示。所以,pj就通 過(guò)地址傳遞最終指向該執(zhí)行代碼。如果棧幀[j]中的緩沖數(shù)據(jù)Buf[j]中某個(gè)字符串?dāng)?shù)據(jù) charj出現(xiàn)了緩沖區(qū)溢出的情況;且該溢出最終影響了棧幀[i]中的代碼指針pi,如圖2中 由Buf[j]引出二維箭頭③所示。結(jié)果,pi改為指向另外一段執(zhí)行代碼,如圖2中由Pter[i] 引出箭頭④所示。如果在棧幀[j]退出前,調(diào)用pj指向的代碼,則因?yàn)閜j指向pi,而pi因 溢出而被修改,所以最終改為執(zhí)行另外一段非預(yù)期的代碼段,實(shí)現(xiàn)了攻擊的效果。所以,只 在棧幀退出時(shí)檢查該棧幀內(nèi)的隔離標(biāo)志無(wú)法抵御此類攻擊特例。
攻擊實(shí)例3 :
4
如圖3所示,棧緩沖區(qū)中存儲(chǔ)若干棧幀,將其從棧底到棧頂依次標(biāo)記。其中棧幀 [j]位于棧頂,在棧頂下方某位置存儲(chǔ)了棧幀[i]。在棧幀[j]中存儲(chǔ)了某個(gè)多重指針pj, 在棧幀[i]中存儲(chǔ)了某個(gè)指針pi。多重指針pj通過(guò)棧幀[j]和棧幀[i]之間的指針數(shù)據(jù) 實(shí)現(xiàn)地址傳遞,最終指向pi,如圖3中由Pter[j]引出箭頭①所示。如果棧幀[j]中的緩 沖數(shù)據(jù)Buf [j]中某個(gè)字符串?dāng)?shù)據(jù)charj出現(xiàn)了緩沖區(qū)溢出的情況;且該溢出最終影響了棧 幀[i]中的代碼指針pi,如圖3中由Buf[j]引出二維箭頭②所示。結(jié)果,pi改為指向棧幀 [j]中的代碼指針PJ',如圖3中由Pter[i]引出箭頭③所示。如果在溢出發(fā)生后,通過(guò)pj 向Pi指向的空間拷貝輸入字符,結(jié)果代碼指針pj'改為指向非預(yù)期的執(zhí)行點(diǎn),如圖3中由 Pter[j]引出箭頭④所示。如果在棧幀[j]退出前,調(diào)用pj'指向的代碼,則最終改變了程 序控制流程,實(shí)現(xiàn)了攻擊的效果。 此攻擊實(shí)例的比攻擊實(shí)例2的威脅更大,主要在于其通過(guò)中間的指針pi可以定位 內(nèi)存中的任意空間。與攻擊實(shí)例2類似,只在棧幀退出時(shí)檢查該棧幀內(nèi)的隔離標(biāo)志無(wú)法抵 御此類攻擊特例。
攻擊實(shí)例4 : 在上述的攻擊方式中,都是通過(guò)棧頂緩沖數(shù)據(jù)Buf[j]實(shí)現(xiàn)溢出攻擊。攻擊實(shí)例4 給出一種通過(guò)指針傳遞實(shí)現(xiàn)非棧頂棧幀緩沖區(qū)溢出的攻擊。此攻擊實(shí)例只給出溢出方法, 后續(xù)攻擊方法可借鑒攻擊實(shí)例1、攻擊實(shí)例2和攻擊實(shí)例3或其它攻擊手段。
如圖4所示,棧緩沖區(qū)中存儲(chǔ)若干棧幀,將其從棧底到棧頂依次標(biāo)記。其中棧幀 [j]位于棧頂,在棧頂下方某位置存儲(chǔ)了棧幀[i]。在棧幀[j]中存儲(chǔ)了某個(gè)字符串多重指 針pj,在棧幀[i]中存儲(chǔ)了某個(gè)字符串chari。多重指針pj通過(guò)棧幀[j]和棧幀[i]之間 的指針數(shù)據(jù)實(shí)現(xiàn)地址傳遞,最終指向chari,如圖4中由Pter[j]引出箭頭①所示。如果向 pj指向的字符串chari輸入數(shù)據(jù),并且chari出現(xiàn)了緩沖區(qū)溢出的情況;且該溢出最終影 響了棧幀[i-l]中的代碼指針pi-l,如圖4中由Buf[i]引出二維箭頭②所示。結(jié)果,pi-l 改變了指向的執(zhí)行代碼。該攻擊實(shí)例的特點(diǎn)就是通過(guò)指針傳遞造成非棧頂?shù)木彌_數(shù)據(jù)溢 出,結(jié)果通過(guò)度量棧頂?shù)揭绯鳇c(diǎn)之間的隔離標(biāo)志無(wú)法發(fā)現(xiàn)溢出事件。 分析現(xiàn)有檢測(cè)技術(shù)針對(duì)上述4種溢出和攻擊方法存在的不足,可以歸納為以下兩 點(diǎn) 1、度量粒度 返回地址前設(shè)置隨機(jī)數(shù)的度量方法,只能檢查返回地址是否被改變,但是修改返 回地址并不是唯一的攻擊方式。如攻擊實(shí)例l所述。因此只針對(duì)返回地址的安全檢查,并 不能檢查出通過(guò)改變指針類型變量導(dǎo)致的攻擊。
2、度量時(shí)刻和度量范圍 基于Stack Guard技術(shù)的緩沖區(qū)檢查方法,是在函數(shù)返回的時(shí)刻執(zhí)行安全檢查操 作,此時(shí)函數(shù)已經(jīng)執(zhí)行完畢,只是針對(duì)該函數(shù)返回時(shí)的返回地址進(jìn)行了檢查,但是在函數(shù)執(zhí) 行過(guò)程中,如果在棧中的某個(gè)指針類型變量指向了處于當(dāng)前棧幀之前的變量,那么在使用 這些變量之前如果不對(duì)其進(jìn)行檢查,也會(huì)導(dǎo)致程序流程的改變。如攻擊實(shí)例2和攻擊實(shí)例3 所示。此外,在棧幀彈出時(shí)只針對(duì)該棧幀內(nèi)的緩沖區(qū)進(jìn)行檢查無(wú)法抵抗攻擊實(shí)例4的溢出 攻擊。因此只在函數(shù)返回的時(shí)刻進(jìn)行當(dāng)前棧幀的安全檢查,并不能發(fā)現(xiàn)針對(duì)函數(shù)執(zhí)行過(guò)程 中所依賴的其他數(shù)據(jù)發(fā)生的溢出攻擊。

發(fā)明內(nèi)容
有鑒于此,本發(fā)明實(shí)施例的目的在于提供一種基于邏輯隔離的緩沖區(qū)溢出動(dòng)態(tài)度
量方法,以實(shí)現(xiàn)對(duì)進(jìn)程狀態(tài)空間的動(dòng)態(tài)度量,以建立完整的計(jì)算環(huán)境。 本發(fā)明是采用以下技術(shù)方案實(shí)現(xiàn)的 所述緩沖區(qū)中的存儲(chǔ)數(shù)據(jù)分為指針數(shù)據(jù)和緩沖數(shù)據(jù) 其中指針數(shù)據(jù)特指在程序中定義的指針類型的數(shù)據(jù),以及用于維護(hù)緩沖區(qū)工作的 指針數(shù)據(jù);例如,程序中的字符串指針,函數(shù)(虛函數(shù))指針,多重指針,棧中的擴(kuò)展指令指 針EIP (Extended Instruction Pointer)、擴(kuò)展基址指針EBP (Extended Base Pointer),維 護(hù)堆塊的鏈表指針等; 其中緩沖數(shù)據(jù)包括所有非指針類型的數(shù)據(jù),針對(duì)緩沖區(qū)溢出,本緩沖數(shù)據(jù)特指在 程序中定義的字符串類型的數(shù)據(jù); 所述緩沖區(qū)數(shù)據(jù)存儲(chǔ),不修改當(dāng)前計(jì)算機(jī)體系結(jié)構(gòu),仍然將不同數(shù)據(jù)類型存儲(chǔ)在 連續(xù)的線性物理空間中,但是通過(guò)對(duì)不同數(shù)據(jù)類型的存儲(chǔ)管理和加入隔離標(biāo)志,提供一種 細(xì)粒度的邏輯隔離機(jī)制。 如圖5所示,首先,通過(guò)隔離標(biāo)志(S印erator,簡(jiǎn)寫(xiě)S印)從邏輯上將指針數(shù)據(jù) (Pointer,簡(jiǎn)寫(xiě)Pter)和緩沖數(shù)據(jù)(Buffering,簡(jiǎn)寫(xiě)B(tài)uf)分開(kāi); 其次,將緩沖數(shù)據(jù)存放在隔離標(biāo)志的低地址方向,將指針數(shù)據(jù)存放在隔離標(biāo)志的 高地址方向; 最后,從內(nèi)存的低地址到高地址存放的緩沖數(shù)據(jù)、隔離標(biāo)志、指針數(shù)據(jù)形成一個(gè)狀 態(tài)空間子集,內(nèi)存緩沖區(qū)空間中可存放若干個(gè),連續(xù)的,符合上述結(jié)構(gòu)的狀態(tài)空間子集。
因?yàn)榫彌_區(qū)溢出是緩沖數(shù)據(jù)超出界限,覆蓋了其它數(shù)據(jù)類型,特別是指針數(shù)據(jù)類 型,所以將緩沖數(shù)據(jù)存儲(chǔ)在低地址空間,并在其邊界上存放一個(gè)隔離標(biāo)志,實(shí)現(xiàn)緩沖數(shù)據(jù)與 指針數(shù)據(jù)的邏輯隔離。 一方面,當(dāng)緩沖數(shù)據(jù)向高地址空間溢出時(shí)必然修改隔離標(biāo)志,才能覆 蓋指針數(shù)據(jù),所以通過(guò)度量隔離標(biāo)志的完整性就可以判斷溢出是否發(fā)生;另一方面,在兩個(gè) 隔離標(biāo)志之間,因?yàn)橹羔様?shù)據(jù)被置于相對(duì)緩沖數(shù)據(jù)的低地址空間,所以緩沖數(shù)據(jù)不會(huì)對(duì)指 針數(shù)據(jù)造成影響。 所述緩沖區(qū)數(shù)據(jù)存儲(chǔ),包括針對(duì)棧緩沖區(qū)數(shù)據(jù)的邏輯隔離、堆緩沖區(qū)數(shù)據(jù)的邏輯 隔離和棧緩沖區(qū)的優(yōu)化; 較佳地,所述緩沖區(qū)數(shù)據(jù)存儲(chǔ),針對(duì)棧緩沖區(qū)數(shù)據(jù)的邏輯隔離如圖5所示;一個(gè)棧 幀,從內(nèi)存低地址到高地址,包括指針數(shù)據(jù)、緩沖數(shù)據(jù)和隔離標(biāo)志;不僅通過(guò)隔離標(biāo)志隔離 了不同棧幀之間的干擾,而且通過(guò)在一個(gè)棧幀內(nèi)將指針數(shù)據(jù)放在緩沖數(shù)據(jù)之前(指針數(shù)據(jù) 位于棧頂),消除了該棧幀內(nèi)緩沖數(shù)據(jù)對(duì)指針數(shù)據(jù)的影響,從而實(shí)現(xiàn)了細(xì)粒度的隔離。
較佳地,所述緩沖區(qū)數(shù)據(jù)存儲(chǔ),針對(duì)堆緩沖區(qū)數(shù)據(jù)的邏輯隔離如圖5所示;一個(gè)堆 塊,從內(nèi)存低地址到高地址,包括隔離標(biāo)志、指針數(shù)據(jù)和緩沖數(shù)據(jù);通過(guò)隔離標(biāo)志隔離了相 鄰存儲(chǔ)的兩個(gè)堆塊之間的干擾;隔離了前一個(gè)堆塊的緩沖數(shù)據(jù)和后一個(gè)堆塊指針數(shù)據(jù)。
較佳地,所述棧緩沖區(qū)數(shù)據(jù)的邏輯隔離,針對(duì)棧緩沖區(qū)的優(yōu)化進(jìn)一步可以將緩沖 數(shù)據(jù)中的字符串?dāng)?shù)組存放在高地址空間,而將整型和浮點(diǎn)型等數(shù)據(jù)存儲(chǔ)在指針數(shù)據(jù)和字符 串?dāng)?shù)組之間。針對(duì)堆塊存儲(chǔ)管理沒(méi)有此類問(wèn)題。 基于上述緩沖區(qū)數(shù)據(jù)的邏輯隔離,所述緩沖區(qū)溢出的動(dòng)態(tài)度量方法是,當(dāng)對(duì)某個(gè)指針數(shù)據(jù)進(jìn)行操作前,度量和該指針數(shù)據(jù)在一個(gè)狀態(tài)空間子集中的隔離標(biāo)志,若該隔離標(biāo) 志被修改,則表明出現(xiàn)了緩沖區(qū)溢出。該方法為一個(gè)通用方法,可針對(duì)不同應(yīng)用的緩沖區(qū)進(jìn) 行動(dòng)態(tài)度量。根據(jù)不同的緩沖區(qū)的特點(diǎn),可以對(duì)該方法進(jìn)行優(yōu)化,下面將針對(duì)棧的緩沖區(qū)進(jìn) 行優(yōu)化。 針對(duì)棧緩沖區(qū)溢出的動(dòng)態(tài)度量方法在于,度量操作的時(shí)刻為在調(diào)用指向與執(zhí)行代 碼相關(guān)的指針數(shù)據(jù)前進(jìn)行,在彈棧操作前進(jìn)行,在壓棧操作前進(jìn)行; 所述指向執(zhí)行代碼的指針數(shù)據(jù)是,用于指向進(jìn)程可執(zhí)行代碼的指針數(shù)據(jù),或者指 向該類型指針數(shù)據(jù)的指針數(shù)據(jù),也就是多重指針;具體包括程序的函數(shù)指針類型,虛函數(shù)指 針類型,多重函數(shù)指針,維護(hù)棧空間的指針EIP和EBP等;重點(diǎn)關(guān)注指向執(zhí)行代碼的指針數(shù) 據(jù)的主要原因是,緩沖區(qū)溢出攻擊必須通過(guò)溢出改變此類指針的值,使其指向惡意代碼或 者某個(gè)調(diào)用,從而當(dāng)程序調(diào)用指針指向的代碼時(shí),就會(huì)轉(zhuǎn)而執(zhí)行攻擊者設(shè)計(jì)的程序。所以, 該類指針是實(shí)現(xiàn)緩沖區(qū)攻擊效果的關(guān)鍵點(diǎn)。 較佳地,所述棧緩沖區(qū)溢出的動(dòng)態(tài)度量方法的優(yōu)化在于,如存在相鄰的若干個(gè)代 碼指針的調(diào)用,且這些調(diào)用之間沒(méi)有針對(duì)緩沖數(shù)據(jù)的操作,則只在第一個(gè)基于指針的代碼 調(diào)用之前進(jìn)行度量,而對(duì)后面的不進(jìn)行檢查。按照程序流程,直到又一次出現(xiàn)對(duì)緩沖區(qū)數(shù)據(jù) 的操作后,再在其后面的基于指針的代碼調(diào)用之前進(jìn)行檢查。 棧緩沖區(qū)溢出的動(dòng)態(tài)度量方法,其度量范圍在于,度量棧頂棧幀的隔離標(biāo)志,以及 棧頂棧幀中指向緩沖數(shù)據(jù)類型指針集合通過(guò)指針傳遞指向的緩沖數(shù)據(jù)所在狀態(tài)空間子集 中的隔離標(biāo)志。 本發(fā)明與現(xiàn)有技術(shù)相比,具有以下明顯的優(yōu)勢(shì)和有益效果 本發(fā)明將緩沖區(qū)中的存儲(chǔ)數(shù)據(jù)分為指針數(shù)據(jù)和緩沖數(shù)據(jù)在不修改當(dāng)前計(jì)算機(jī)體 系結(jié)構(gòu)的基礎(chǔ)上,仍然將不同數(shù)據(jù)類型存儲(chǔ)在連續(xù)的線性物理空間中,但是通過(guò)對(duì)不同數(shù) 據(jù)類型的存儲(chǔ)管理和加入隔離標(biāo)志,提供一種細(xì)粒度的數(shù)據(jù)邏輯隔離,形成若干連續(xù)的符 合邏輯隔離的狀態(tài)空間子集。通過(guò)在指針調(diào)用前度量指針?biāo)诳臻g的隔離標(biāo)志的完整性, 可以判斷緩沖區(qū)溢出是否發(fā)生。針對(duì)棧結(jié)構(gòu)的特點(diǎn),在度量時(shí)刻和度量范圍上進(jìn)行了優(yōu)化, 從而更好的解決了現(xiàn)有檢測(cè)機(jī)制的不足。本發(fā)明提出的動(dòng)態(tài)度量方法不僅可以解決提出的 4個(gè)攻擊實(shí)例,而且還可以應(yīng)對(duì)其它類型的緩沖區(qū)溢出攻擊。


圖1為緩沖區(qū)攻擊實(shí)例1的示意圖; 圖2為緩沖區(qū)攻擊實(shí)例2的示意圖; 圖3為緩沖區(qū)攻擊實(shí)例3的示意圖; 圖4為緩沖區(qū)攻擊實(shí)例4的示意圖; 圖5為本發(fā)明實(shí)施例提供的緩沖區(qū)數(shù)據(jù)的邏輯隔離示意圖; 圖6為本發(fā)明針對(duì)棧的實(shí)施例提供的數(shù)據(jù)邏輯隔離; 圖7為本發(fā)明針對(duì)堆的實(shí)施例提供的數(shù)據(jù)邏輯隔離; 圖8為本發(fā)明提出的一種緩沖區(qū)溢出的通用動(dòng)態(tài)度量方法; 圖9為本發(fā)明提出的針對(duì)棧緩沖區(qū)溢出的度量方法。
具體實(shí)施例方式
本發(fā)明實(shí)施例提供的一種基于邏輯隔離的緩沖區(qū)溢出動(dòng)態(tài)度量方法,實(shí)現(xiàn)了狀態(tài) 空間中不同類型數(shù)據(jù)的細(xì)粒度的邏輯隔離,并且在所述邏輯隔離的基礎(chǔ)上,提出了一種緩 沖區(qū)溢出的動(dòng)態(tài)度量方法,對(duì)該方法在棧上的實(shí)施進(jìn)行了細(xì)化,從而建立進(jìn)程運(yùn)行狀態(tài)空 間的完整性度量機(jī)制。 為使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下參照附圖并舉實(shí)施例,對(duì) 本發(fā)明進(jìn)一步詳細(xì)說(shuō)明。 結(jié)合圖詳細(xì)說(shuō)明棧堆空間數(shù)據(jù)存儲(chǔ)的管理。 圖6是本發(fā)明在圖5的基礎(chǔ)上,針對(duì)棧的實(shí)施例提供的數(shù)據(jù)邏輯隔離。 如圖6所示棧頂兩個(gè)棧幀的存儲(chǔ)狀況,其它棧幀的結(jié)構(gòu)同棧幀[i-l]。如圖6所
示,一個(gè)棧幀包括隨機(jī)數(shù)、臨時(shí)非指針變量、臨時(shí)指針數(shù)據(jù)變量、傳遞參數(shù)變量、擴(kuò)展指令指
針、擴(kuò)展基址指針。其中隨機(jī)數(shù)作為隔離標(biāo)志,邏輯隔離相鄰棧幀中的緩沖數(shù)據(jù)和指針數(shù)
據(jù)。隨機(jī)數(shù)的低地址空間的兩個(gè)連續(xù)的臨時(shí)變量存儲(chǔ)空間,存儲(chǔ)了該棧幀所對(duì)應(yīng)函數(shù)的局
部變量。臨時(shí)非指針變量主要包括可以造成緩沖區(qū)溢出數(shù)據(jù)類型實(shí)例,例如字符串等,并且
將非字符串、非指針類型的整型、浮點(diǎn)型數(shù)據(jù)存儲(chǔ)在字符串?dāng)?shù)據(jù)的相鄰的低地址空間。臨時(shí)
指針數(shù)據(jù)變量存儲(chǔ)了所有指針類型的局部變量,針對(duì)棧空間來(lái)說(shuō),主要關(guān)注的是指向執(zhí)行
代碼的指針數(shù)據(jù)。傳遞參數(shù)變量是棧幀[i-l]傳遞給棧幀[i]的數(shù)據(jù)集合,該集合中數(shù)據(jù)
分為實(shí)參和形參,其中實(shí)參通過(guò)指針實(shí)現(xiàn)傳遞,形參包括非字符串類型數(shù)據(jù),所以該集合不
會(huì)出現(xiàn)溢出問(wèn)題;且考慮該集合中的指針可以實(shí)現(xiàn)不同棧幀之間的指針傳遞,所以將傳遞
參數(shù)變量集合歸類到指針數(shù)據(jù)中。擴(kuò)展指令指針(EIP)和擴(kuò)展基址指針(EBP)都是非常重
要的用于維護(hù)棧運(yùn)行的指針,其中早期緩沖區(qū)溢出主要攻擊EIP,后來(lái)又出現(xiàn)了對(duì)EBP的攻
擊,總之此處的兩個(gè)指針?lè)浅V匾?,并歸入指針數(shù)據(jù)中。 在該結(jié)構(gòu)中隨機(jī)數(shù)實(shí)現(xiàn)了不同棧幀之間緩沖數(shù)據(jù)和指針數(shù)據(jù)的邏輯隔離;但是該
隔離還無(wú)法杜絕隨機(jī)數(shù)之間,一個(gè)棧幀內(nèi)部的溢出覆蓋指針的情況,如上述的攻擊實(shí)例1
所示。所以,在組織棧幀內(nèi)部數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)的時(shí)候,將指針數(shù)據(jù)放置于低地址空間,緩沖
數(shù)據(jù)放置于高地址空間;因?yàn)閿?shù)據(jù)溢出的方向是從低地址向高地址,所以上述存儲(chǔ)結(jié)構(gòu)將
避免一個(gè)棧幀內(nèi)部的緩沖數(shù)據(jù)對(duì)指針數(shù)據(jù)的影響,從而實(shí)現(xiàn)更細(xì)粒度的隔離機(jī)制。 隔離標(biāo)志隨機(jī)數(shù)可以在每次壓棧前產(chǎn)生,并在數(shù)據(jù)段保存一個(gè)副本,以便于緩沖
區(qū)溢出度量。 圖7是本發(fā)明在圖5的基礎(chǔ)上,針對(duì)堆的實(shí)施例提供的數(shù)據(jù)邏輯隔離。
如圖7所示堆中兩個(gè)連續(xù)的堆塊的存儲(chǔ)狀況。如圖7所示, 一個(gè)堆塊包括隨機(jī)數(shù)、 堆塊指針數(shù)據(jù)和堆塊臨時(shí)數(shù)據(jù)。在該結(jié)構(gòu)中隨機(jī)數(shù)實(shí)現(xiàn)了不同堆塊之間緩沖數(shù)據(jù)和指針數(shù) 據(jù)的邏輯隔離;但是該隔離還無(wú)法杜絕隨機(jī)數(shù)之間, 一個(gè)堆塊內(nèi)部的溢出覆蓋指針的情況, 類似上述的攻擊實(shí)例1。所以,在組織堆塊內(nèi)部數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)的時(shí)候,將指針數(shù)據(jù)放置于 低地址空間,緩沖數(shù)據(jù)放置于高地址空間;因?yàn)閿?shù)據(jù)溢出的方向是從低地址向高地址,所以 上述存儲(chǔ)結(jié)構(gòu)將避免一個(gè)堆塊內(nèi)部的緩沖數(shù)據(jù)對(duì)指針數(shù)據(jù)的影響,從而實(shí)現(xiàn)更細(xì)粒度的隔 離,避免了攻擊實(shí)例1的發(fā)生。 隔離標(biāo)志隨機(jī)數(shù)可以在堆塊初始化前生成,并在數(shù)據(jù)段保存一個(gè)副本,以便于緩 沖區(qū)溢出度量。
綜上所述,通過(guò)給出并分析進(jìn)程空間中棧和堆的緩沖區(qū)數(shù)據(jù)存儲(chǔ)的實(shí)施例,兩種 不同功能的緩沖區(qū)數(shù)據(jù)的邏輯隔離都可以統(tǒng)一到圖5所示的結(jié)構(gòu)下,從而實(shí)現(xiàn)細(xì)粒度的數(shù) 據(jù)隔離。 基于上述的緩沖區(qū)數(shù)據(jù)的存儲(chǔ),本發(fā)明提出了一種緩沖區(qū)溢出的動(dòng)態(tài)度量方法。 該方法在棧和堆等不同實(shí)施例中應(yīng)用的通用流程如圖8所示。 所述通用緩沖區(qū)溢出的度量方法是,步驟801判斷當(dāng)前操作的輸入是否涉及指針 數(shù)據(jù);如果涉及,步驟802度量和該指針數(shù)據(jù)在一個(gè)狀態(tài)空間子集中的隔離標(biāo)志,若該隔離 標(biāo)志被修改,則表明出現(xiàn)了緩沖區(qū)溢出。 因?yàn)橥ㄓ昧鞒淘谒猩婕爸羔様?shù)據(jù)的操作前都對(duì)隔離標(biāo)志進(jìn)行度量,所以其效率
比較低。在棧緩沖區(qū)的特殊結(jié)構(gòu)下實(shí)現(xiàn)溢出攻擊的關(guān)鍵點(diǎn)是,通過(guò)溢出覆蓋指向執(zhí)行代碼
的指針數(shù)據(jù),從而改變進(jìn)程控制流程。所以,根據(jù)上述特征,本發(fā)明提出了針對(duì)棧緩沖區(qū)溢
出的度量方法,如圖9所示,該流程在棧結(jié)構(gòu)的特點(diǎn)下對(duì)通用流程進(jìn)行了特殊化處理。 通過(guò)統(tǒng)計(jì)發(fā)現(xiàn),在棧頂棧幀中針對(duì)指針的操作可能非常頻繁,而且多是針對(duì)字符
串指針進(jìn)行操作,如果在每次涉及指針操作前對(duì)隔離標(biāo)志進(jìn)行度量,則效率較低。因?yàn)榫彌_
區(qū)溢出攻擊的關(guān)鍵點(diǎn)是覆蓋指向執(zhí)行代碼的指針,并且調(diào)用代碼指針的次數(shù)在棧幀內(nèi)相對(duì)
較少,所以只在該調(diào)用前度量隔離標(biāo)志可以提高檢測(cè)效率。 因?yàn)闂V兄挥袟m敆瑸榛顒?dòng)狀態(tài),所以當(dāng)前棧幀即為棧頂棧幀。 步驟901,判斷棧頂棧幀內(nèi)的操作是否調(diào)用指向執(zhí)行代碼的指針數(shù)據(jù),如果涉及代
碼指針,則進(jìn)入步驟904,度量隔離標(biāo)志。代碼指針數(shù)據(jù)是直接或者間接(通過(guò)指針傳遞)
指向執(zhí)行代碼的數(shù)據(jù)變量,最終可通過(guò)匯編指令Call調(diào)用一段代碼,在源代碼中主要包括
函數(shù)指針、多重函數(shù)指針、虛函數(shù)指針。 步驟902,判斷棧頂棧幀內(nèi)的操作是否是壓入新棧幀,如果是壓入新棧幀,則進(jìn)入 步驟904,度量隔離標(biāo)志。如果當(dāng)前棧幀出現(xiàn)了類似攻擊實(shí)例3的情況,如果在當(dāng)前棧幀內(nèi) 沒(méi)有步驟901,或者步驟901后實(shí)施了攻擊實(shí)例3,那么攻擊實(shí)例3不能被檢查到。如果當(dāng) 前棧幀內(nèi)的代碼指針被攻擊實(shí)例3所攻擊,并且新棧幀中某多重代碼指針調(diào)用了當(dāng)前棧幀 內(nèi)的該代碼指針,那么在新棧幀中通過(guò)步驟904也無(wú)法檢測(cè)到攻擊實(shí)例3。其主要原因是攻 擊實(shí)例3可通過(guò)中間指針實(shí)現(xiàn)重定向,從而破壞棧內(nèi)數(shù)據(jù)從頂?shù)降讉鬟f的結(jié)構(gòu)。所以,在壓 入新棧幀前,需要檢查當(dāng)前棧幀是否出現(xiàn)了緩沖區(qū)溢出的情況。 步驟903,判斷棧頂棧幀內(nèi)的操作是否是彈出棧幀,如果是彈出當(dāng)前棧幀,則進(jìn)入 步驟904,度量隔離標(biāo)志。彈出棧頂棧幀后會(huì)馬上執(zhí)行下一個(gè)棧幀中EIP所指向的代碼,所 以步驟904可以檢測(cè)EIP是否被覆蓋。此外,步驟903和步驟902在面臨攻擊實(shí)例3時(shí)存 在相同的問(wèn)題,所以必須對(duì)當(dāng)前棧幀是否出現(xiàn)緩沖區(qū)溢出進(jìn)行檢測(cè)。 步驟904,度量棧頂棧幀的隔離標(biāo)志,以及棧頂棧幀中緩沖數(shù)據(jù)類型指針集合通過(guò) 指針傳遞指向的緩沖數(shù)據(jù)所在狀態(tài)空間子集中的隔離標(biāo)志。該步驟的目的是檢測(cè)當(dāng)前棧幀 執(zhí)行過(guò)程中是否出現(xiàn)了溢出事件。度量的范圍是當(dāng)前棧幀所能控制的所有緩沖數(shù)據(jù),度量 的方法是檢驗(yàn)該緩沖數(shù)據(jù)所在狀態(tài)空間子集的隔離標(biāo)志的完整性是否被破壞。該方法可以 有效地檢測(cè)出上述的所有攻擊實(shí)例。 步驟905,如果步驟904中針對(duì)隔離標(biāo)志的度量沒(méi)有報(bào)告溢出事件的發(fā)生,則執(zhí)行 步驟9Q1、步驟902和步驟903所述的相關(guān)操作。
本發(fā)明可進(jìn)一步進(jìn)行優(yōu)化。如果在執(zhí)行步驟904后,并且沒(méi)有針對(duì)緩沖數(shù)據(jù)的操 作,則針對(duì)當(dāng)前操作可不再進(jìn)行檢測(cè)。 較佳地,本發(fā)明提出的度量方法可嵌入編譯程序中,在源程序的基礎(chǔ)上,加入對(duì)緩 沖區(qū)數(shù)據(jù)存儲(chǔ)的管理機(jī)制,加入對(duì)緩沖區(qū)溢出的檢測(cè)方法,并生成應(yīng)用本發(fā)明方法的匯編 程序,最終生成目標(biāo)代碼。 以上所述,僅為本發(fā)明的較佳實(shí)施例而已,并非用于限定本發(fā)明的保護(hù)范圍,凡在 本發(fā)明的精神和原則之內(nèi)所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范 圍之內(nèi)。
權(quán)利要求
一種基于邏輯隔離的緩沖區(qū)溢出動(dòng)態(tài)度量方法;所述緩沖區(qū)中的存儲(chǔ)數(shù)據(jù)分為指針數(shù)據(jù)和緩沖數(shù)據(jù)其特征在于所述的指針數(shù)據(jù)為在程序中定義的指針類型的數(shù)據(jù),以及用于維護(hù)緩沖區(qū)工作的指針數(shù)據(jù);所述的緩沖數(shù)據(jù)包括所有非指針類型的數(shù)據(jù),以及在程序中定義的字符串類型的數(shù)據(jù);在不修改當(dāng)前計(jì)算機(jī)體系的基礎(chǔ)上,將不同數(shù)據(jù)類型存儲(chǔ)在連續(xù)的線性物理空間,包括以下步驟通過(guò)隔離標(biāo)志從邏輯上將指針數(shù)據(jù)和緩沖數(shù)據(jù)分開(kāi);將緩沖數(shù)據(jù)存放在隔離標(biāo)志的低地址方向,將指針數(shù)據(jù)存放在隔離標(biāo)志的高地址方向;從內(nèi)存的低地址到高地址存放的緩沖數(shù)據(jù)、隔離標(biāo)志、指針數(shù)據(jù)形成一個(gè)狀態(tài)空間子集,內(nèi)存緩沖區(qū)空間中可存放若干個(gè),連續(xù)的,符合上述結(jié)構(gòu)的狀態(tài)空間子集;所述緩沖區(qū)數(shù)據(jù)的存儲(chǔ),包括針對(duì)棧緩沖區(qū)數(shù)據(jù)的邏輯隔離、堆緩沖區(qū)數(shù)據(jù)的邏輯隔離和棧緩沖區(qū)的優(yōu)化;基于此邏輯隔離,對(duì)某個(gè)指針數(shù)據(jù)進(jìn)行操作前,度量和該指針數(shù)據(jù)在一個(gè)狀態(tài)空間子集中的隔離標(biāo)志,若該隔離標(biāo)志被修改,則表明出現(xiàn)了緩沖區(qū)溢出。
2. 根據(jù)權(quán)利要求1所述的基于邏輯隔離的緩沖區(qū)溢出動(dòng)態(tài)度量方法,其特征在于所 述棧緩沖區(qū)的優(yōu)化包括a、 度量時(shí)刻1) 在壓入新的棧幀前進(jìn)行度量;2) 在棧頂棧幀執(zhí)行過(guò)程中,在連續(xù)的緩沖數(shù)據(jù)操作和指針調(diào)用之間進(jìn)行度量;3) 在當(dāng)前棧幀被彈出前進(jìn)行度量;b、 度量范圍度量當(dāng)前棧頂棧幀的隔離標(biāo)志,以及棧頂棧幀中緩沖數(shù)據(jù)類型指針通過(guò)指針傳遞指向 的緩沖數(shù)據(jù)所在狀態(tài)空間子集中的隔離標(biāo)志。
全文摘要
本發(fā)明公開(kāi)了一種基于邏輯隔離的緩沖區(qū)溢出動(dòng)態(tài)度量方法,包括緩沖區(qū)數(shù)據(jù)的邏輯隔離,進(jìn)程運(yùn)行中基于此邏輯隔離的緩沖區(qū)動(dòng)態(tài)度量,以實(shí)現(xiàn)針對(duì)緩沖區(qū)溢出的檢測(cè)。不修改當(dāng)前計(jì)算機(jī)體系結(jié)構(gòu),將不同數(shù)據(jù)類型存儲(chǔ)在連續(xù)的線性物理空間;包括通過(guò)插入隔離標(biāo)志,將緩沖數(shù)據(jù)存放在隔離標(biāo)志的低地址方向,將指針數(shù)據(jù)存放在隔離標(biāo)志的高地址方向,形成一個(gè)從內(nèi)存低地址到高地址的狀態(tài)空間子集,緩沖區(qū)由若干個(gè)、連續(xù)的狀態(tài)空間子集組成;基于此邏輯隔離,通過(guò)動(dòng)態(tài)度量方法檢查隔離標(biāo)志的完整性以判斷緩沖區(qū)溢出是否發(fā)生;該基于邏輯隔離的動(dòng)態(tài)度量方法可適用于針對(duì)不同應(yīng)用的緩沖區(qū);特別針對(duì)棧的動(dòng)態(tài)度量方法,在度量時(shí)刻和度量范圍上進(jìn)行了優(yōu)化,以解決現(xiàn)有機(jī)制的不足。
文檔編號(hào)G06F21/00GK101694686SQ200910092060
公開(kāi)日2010年4月14日 申請(qǐng)日期2009年9月21日 優(yōu)先權(quán)日2009年9月21日
發(fā)明者公備, 莊琭, 張興, 李晨, 李瑞華, 沈昌祥 申請(qǐng)人:北京工業(yè)大學(xué);
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1