叢佩春 王治杰
摘 要 首先介紹了緩沖區(qū)溢出的基本概念,研究并總結(jié)了緩沖區(qū)溢出的原理和過程。還通過一些攻擊示例介紹了系統(tǒng)如何被溢出攻擊,描述了網(wǎng)絡(luò)攻擊者利用緩沖區(qū)溢出漏洞進行系統(tǒng)攻擊的一般過程,最后簡單討論了幾種緩沖區(qū)溢出的保護方法。
關(guān)鍵詞 緩沖區(qū)溢出漏洞 緩沖區(qū)溢出攻擊 緩沖區(qū)溢出保護
中圖分類號:TP3 文獻標(biāo)識碼:A
1緩沖區(qū)溢出的概述
安全漏洞與緩沖區(qū)溢出是分不開的,據(jù)微軟發(fā)布的安全報告可知,目前最常見的安全問題80%以上都是緩沖區(qū)溢出產(chǎn)生的問題。市場上幾乎每個應(yīng)用程序和操作系統(tǒng)都存在黑客可能利用的緩沖區(qū)溢出漏洞,對于微軟Windows系統(tǒng)來說是尤其嚴(yán)重,以至于微軟在產(chǎn)品的新版本中采用了一種完全不同的解決方法。
2緩沖區(qū)溢出國內(nèi)外研究現(xiàn)狀
緩沖區(qū)溢出攻擊作為一種主流的攻擊手法,早在20世紀(jì)80年代,國外就有人開始討論溢出攻擊,例如1988年的Morris蠕蟲,利用的攻擊方法之一就是Fingerd的緩沖區(qū)溢出,這次蠕蟲攻擊導(dǎo)致全球6000多臺機器被感染,損失巨大由此,緩沖區(qū)溢出問題逐漸得到人們的重視。1989年,Spafford提交了一份分析報告,描述了VAX機上的BSD版unix的Fingerd的緩沖區(qū)溢出程序的技術(shù)細節(jié),從而引起了一部分安全人士對這個研究領(lǐng)域的重視。
緩沖區(qū)溢出的防御有一個主要的方面,第一個方面是從操作系統(tǒng)本身的機制對溢出進行遏制,提出了堆棧不可執(zhí)行的技術(shù);第二個方面是開發(fā)一些工具來保護堆棧2003年,Richard Jones和Paul Kelly開發(fā)了一個gcc的補丁,用來實現(xiàn)C程序數(shù)組邊界檢查,防范溢出問題。第三個方面是在溢出發(fā)生后,使用防火墻,入侵檢測系統(tǒng)(IDS)等進行一些訪問控制。
3緩沖區(qū)溢出攻擊原理
當(dāng)正常的使用者操作程序的時候,所進行的操作一般不會超出程序的運行范圍,數(shù)據(jù)被添加到分配給該緩沖區(qū)的內(nèi)存塊之外,會發(fā)生緩沖區(qū)溢出,這時候就會出現(xiàn)數(shù)據(jù)泄漏或侵占了其它的數(shù)據(jù)空間。緩沖區(qū)溢出的攻擊原理就是越過緩沖區(qū)長度界限向程序中輸入超出其常規(guī)長度的內(nèi)容,造成緩沖區(qū)的溢出從而破壞程序的堆棧,使程序運行出現(xiàn)特殊的問題轉(zhuǎn)而執(zhí)行其它指令。
4緩沖區(qū)溢出漏洞攻擊方式
(1)在程序的地址空間里安排適當(dāng)?shù)拇a
在程序的地址空間里安排適當(dāng)?shù)拇a往往是相對簡單的。如果要攻擊的代碼在所攻擊程序中已經(jīng)存在了,那么就簡單地對代碼傳遞一些參數(shù),然后使程序跳轉(zhuǎn)到目標(biāo)中就可以完成了。攻擊代碼要求執(zhí)行“exec(‘/bin/sh)”,而在libc庫中的代碼執(zhí)行“exec(arg)”,其中的“arg”是個指向字符串的指針參數(shù),只要把傳入的參數(shù)指針修改指向“/bin/sh”,然后再跳轉(zhuǎn)到libc庫中的響應(yīng)指令序列就可以了。當(dāng)然,很多時候這個可能性是很小的,那么就得用一種叫“植入法”的方式來完成了。緩沖區(qū)可以設(shè)在:堆棧(自動變量)、堆(動態(tài)分配的)和靜態(tài)數(shù)據(jù)區(qū)(初始化或者未初始化的數(shù)據(jù))等的任何地方。也可以不必為達到這個目的而溢出任何緩沖區(qū),只要找到足夠的空間來放置這些攻擊代碼就夠了。
(2)控制程序轉(zhuǎn)移到攻擊代碼的形式
緩沖區(qū)溢出漏洞攻擊都是在尋求改變程序的執(zhí)行流程,使它跳轉(zhuǎn)到攻擊代碼,最為基本的就是溢出一個沒有檢查或者其他漏洞的緩沖區(qū),這樣做就會擾亂程序的正常執(zhí)行次序。通過溢出某緩沖區(qū),可以改寫相近程序的空間而直接跳轉(zhuǎn)過系統(tǒng)對身份的驗證。原則上來講攻擊時所針對的緩沖區(qū)溢出的程序空間可為任意空間。但因不同地方的定位相異,所以也就帶出了多種轉(zhuǎn)移方式。
(3)植入綜合代碼和流程控制
常見的溢出緩沖區(qū)攻擊類是在一個字符串里綜合了代碼植入和Activation Records。攻擊時定位在一個可供溢出的自動變量,然后向程序傳遞一個很大的字符串,在引發(fā)緩沖區(qū)溢出改變Activation Records的同時植入代碼(權(quán)因C在習(xí)慣上只為用戶和參數(shù)開辟很小的緩沖區(qū))。這樣的方法一般是用于可供溢出的緩沖區(qū)不能放入全部代碼時的。如果想使用已經(jīng)駐留的代碼不需要再外部植入的時候,通常必須先把代碼做為參數(shù)。在libc(熟悉C的朋友應(yīng)該知道,現(xiàn)在幾乎所有的C程序連接都是利用它來連接的)中的一部分代碼段會執(zhí)行“exec(something)”,當(dāng)中的something就是參數(shù),使用緩沖區(qū)溢出改變程序的參數(shù),然后利用另一個緩沖區(qū)溢出使程序指針指向libc中的特定的代碼段。
5緩沖區(qū)溢出的保護方法
(1)通過操作系統(tǒng)使得緩沖區(qū)不可執(zhí)行,從而阻止攻擊者殖入攻擊代碼。這種方法有效地阻止了很多緩沖區(qū)溢出的攻擊,但是攻擊者并不一定要殖入攻擊代碼來實現(xiàn)緩沖區(qū)溢出的攻擊,所以這種方法還是存在很多弱點的。
(2)在程序指針失效前進行完整性檢查。這樣雖然這種方法不能使得所有的緩沖區(qū)溢出失效,但它的確確阻止了絕大多數(shù)的緩沖區(qū)溢出攻擊,而能夠逃脫這種方法保護的緩沖區(qū)溢出也很難實現(xiàn)。
(3)強制寫正確的代碼的方法。編寫正確的代碼是一件非常有意義但耗時的工作,特別像編寫C語言那種具有容易出錯傾向的程序(如:字符串的零結(jié)尾),這種風(fēng)格是由于追求性能而忽視正確性的傳統(tǒng)引起的。盡管花了很長的時間使得人們知道了如何編寫安全的程序,具有安全漏洞的程序依舊出現(xiàn)。