姜燕,劉娜
(湖北醫(yī)藥學(xué)院 公共管理學(xué)院,湖北 十堰 442000)
緩沖區(qū)溢出是指向緩沖區(qū)中傳輸?shù)臄?shù)據(jù)超出了緩沖區(qū)所能容納的最大長度,從而使提交的數(shù)據(jù)超過相應(yīng)的邊界而進(jìn)入了其他區(qū)域[1]。緩沖區(qū)溢出攻擊則是人為將大于緩沖區(qū)長度的數(shù)據(jù)傳輸?shù)骄彌_區(qū),從而覆蓋其他區(qū)域的數(shù)據(jù),達(dá)到破壞性目的的操作。緩沖區(qū)溢出已成為一種十分普遍和危險(xiǎn)的安全漏洞,存在于各種操作系統(tǒng)和應(yīng)用軟件中。利用緩沖區(qū)溢出攻擊,可以導(dǎo)致程序運(yùn)行失敗、系統(tǒng)死機(jī)、計(jì)算機(jī)重新啟動(dòng)等后果,更為嚴(yán)重的是可以利用它執(zhí)行非授權(quán)指令,甚至可以取得系統(tǒng)特權(quán),進(jìn)而進(jìn)行各種非法操作。
程序執(zhí)行時(shí)的內(nèi)存從邏輯上可以分為代碼區(qū)和數(shù)據(jù)區(qū)兩大部分,而數(shù)據(jù)區(qū)又可以分為靜態(tài)數(shù)據(jù)區(qū)、堆棧和堆3個(gè)部分。代碼區(qū)存放可執(zhí)行代碼,只能讀不能寫,因此相對比較安全;數(shù)據(jù)區(qū)的數(shù)據(jù)經(jīng)常隨著程序的運(yùn)行變化,是攻擊發(fā)生的主要地方。本文以在堆棧中的溢出說明緩沖區(qū)溢出攻擊的原理。
堆棧是在程序運(yùn)行過程中由操作系統(tǒng)分配的內(nèi)存區(qū)域,當(dāng)程序中發(fā)生函數(shù)調(diào)用時(shí),主要完成如下操作:首先把函數(shù)參數(shù)壓入堆棧;然后向堆棧壓入指令寄存器(IP)中的內(nèi)容,作為返回地址 (RET);接下來放入堆棧的是基址寄存器(EBP),把當(dāng)前的棧指針(ESP)拷貝到 EBP,做為新的基地址;最后把ESP減去適當(dāng)?shù)臄?shù)值,為本地變量留出一定空間[2]。堆棧的情形如圖1所示。

圖1 堆棧的情形Fig.1 Stack situation
通過以下程序的執(zhí)行過程可以說明對堆棧的操作和溢出的產(chǎn)生過程。

編譯運(yùn)行以上代碼,輸入“network”結(jié)果會(huì)輸出network,其中對堆棧的操作是先在棧底壓入返回地址,接著將棧指針EBP入棧,此時(shí)EBP等于現(xiàn)在的ESP,之后ESP減10,即向上增長10個(gè)字節(jié),用來存放strbuffer數(shù)組。最后,從main返回,彈出RET里的返回地址并賦值給IP,CPU繼續(xù)執(zhí)行IP所指向的命令。如果我們輸入的字符串長度超過10個(gè)字節(jié),則由于輸入的字符串太長,strbuffer數(shù)組容納不下,只好向堆棧的底部方向繼續(xù)寫入。這些超出10字節(jié)部分的數(shù)據(jù)覆蓋了堆棧的基地址寄存器、RET或函數(shù)參數(shù)部分的數(shù)據(jù)。從main返回時(shí),就必然會(huì)把新的數(shù)據(jù)視作返回地址,CPU會(huì)試圖執(zhí)行新數(shù)據(jù)所指向的指令,結(jié)果出現(xiàn)難以預(yù)料的后果,這樣就產(chǎn)生了一次堆棧溢出。
除了上述攻擊外,還有針對堆的溢出攻擊和基于lib庫的緩沖區(qū)溢出攻擊及格式化串[3]的攻擊,無論是何種攻擊,最根本的原因是由于C語言的char*這種數(shù)據(jù)結(jié)構(gòu)的存在。在進(jìn)行字符串處理時(shí)不能自動(dòng)進(jìn)行長度的檢查,留下了很多的安全隱患。
緩沖區(qū)溢出攻擊通常分為 3步[4]:1)在目標(biāo)程序中植入攻擊代碼(shellcode);2)拷貝數(shù)據(jù)到需要溢出的緩沖區(qū)并破壞鄰近區(qū)域的數(shù)據(jù)結(jié)構(gòu);3)獲得shell執(zhí)行攻擊代碼(shellcode)。其中第二步是進(jìn)行攻擊的主要環(huán)節(jié)。
面對緩沖區(qū)溢出攻擊的挑戰(zhàn),根據(jù)各種攻擊的機(jī)制,提出了不同的防范措施,這些措施包括技術(shù)層面的和非技術(shù)層面的,在技術(shù)層面有軟件技術(shù)手段和硬件技術(shù)手段。常見的防范措施主要有如下幾種。
根據(jù)緩沖區(qū)溢出的特點(diǎn),只要對輸入字符串或傳遞給函數(shù)的字符串參數(shù)的長度做邊界檢查,就可以有效地防止緩沖區(qū)溢出的發(fā)生,從而也就不可能發(fā)生任何緩沖區(qū)溢出攻擊。因此,防范緩沖區(qū)溢出攻擊的首要方法是使用帶邊界檢查機(jī)制的安全計(jì)算機(jī)語言編寫程序,如Java、Pascal、Perl和Python等。若使用的是C語言等不帶邊界檢查機(jī)制的語言,則需要在編寫程序時(shí)由程序員負(fù)責(zé)考慮各種可能發(fā)生緩沖區(qū)溢出的情況并加以避免或使用一些輔助技術(shù)進(jìn)行檢查。
2.1.1 人工檢查
C語言中很多的字符串處理函數(shù)如strcpy()、strcat()、sprintf()、vsprintf()、gets()、scanf()等都不能進(jìn)行數(shù)組邊界的判定,因此需要在使用這些函數(shù)之前加上一些邊界檢查語句判斷源字符串的長度,再進(jìn)行拷貝操作。或使用C語言之后改進(jìn)的帶有邊界檢查功能的標(biāo)準(zhǔn)函數(shù)如strncpy()、strncat()、snprintf()、fgets()等替換上述函數(shù)。
此方法的優(yōu)點(diǎn)是直接簡單,缺點(diǎn)是對人的依賴性太高,而現(xiàn)實(shí)中程序員要受各個(gè)方面因素的影響,難以取得較好的效果。
2.1.2 靜態(tài)發(fā)現(xiàn)技術(shù)
靜態(tài)發(fā)現(xiàn)技術(shù)是在程序設(shè)計(jì)過程中,根據(jù)一定的規(guī)則發(fā)現(xiàn)源代碼中潛在的漏洞,以便程序員進(jìn)行改進(jìn)。現(xiàn)在已經(jīng)發(fā)展了很多成熟的靜態(tài)發(fā)現(xiàn)技術(shù),主要有 ITS4、Flawfinder、RATS和 BOON 等[5-6]。
ITS4(It’s the Software Stupid Source Scanner)是一種命令模式的交互式程序漏洞掃描工具,它能對C/C++程序的每一個(gè)函數(shù)進(jìn)行代碼分析,根據(jù)所建立的模式庫匹配,然后依據(jù)危險(xiǎn)級別給用戶一個(gè)修改提示報(bào)告。
Flawfinder是基于Python語言開發(fā)的用來輔助進(jìn)行C/C++程序安全審查的工具,運(yùn)行于類UNIX平臺。它內(nèi)嵌了一些類似于ITS4的程序漏洞數(shù)據(jù)庫,如緩沖區(qū)溢出、格式化串漏洞等,掃描速度較快。
RATS(Rough Auditing Tool for Security)作為程序安全性的審計(jì)工具,比Flawfinder支持更多的語言,提供了對C、C++、Perl、PHP以及 Python語言的漏洞掃描。
BOON (Buffer Overrun detectiON)是加州伯克利 David Wagner博士論文的實(shí)現(xiàn)原型,是專門針對C程序緩沖區(qū)溢出漏洞的檢測工具。BOON借鑒面向?qū)ο笏枷耄瑢γ總€(gè)字符串變量設(shè)置了兩個(gè)屬性,一個(gè)描述該字符串被分配的大小,另一個(gè)描述字符串實(shí)際被使用的大小。所有的字符串處理函數(shù)都將參考這兩個(gè)屬性對字符串進(jìn)行操作。BOON通過掃描計(jì)算后得出源程序中的安全漏洞級別,程序員根據(jù)BOON的報(bào)告然后手動(dòng)改正源程序的缺陷。BOON不檢查有關(guān)格式化串漏洞的掃描。
完全找出程序中所有的錯(cuò)誤是不可能的,所以靜態(tài)發(fā)現(xiàn)技術(shù)是不完整的解決方案,它只是降低了程序被攻擊的可能性,而且靜態(tài)發(fā)現(xiàn)工具還需要維護(hù)一個(gè)與漏洞有關(guān)的不斷變化的規(guī)則庫。
2.1.3 動(dòng)態(tài)防御技術(shù)
動(dòng)態(tài)防御技術(shù)是從操作系統(tǒng)和編譯系統(tǒng)角度,通過編譯器自動(dòng)地在程序中添加額外的代碼以及讓操作系統(tǒng)提供一些輔助的手段,來動(dòng)態(tài)地發(fā)現(xiàn)運(yùn)行的程序是否有緩沖區(qū)溢出 。 主要方法如下[5,7-8]:
Austin等人提出的安全指針方法將指針的表現(xiàn)形式擴(kuò)展為安全指針,包含原指針的基地址及可訪問范圍信息。安全指針可以十分方便地實(shí)現(xiàn)邊界檢查。但由于改變了原有指針的表現(xiàn)形式,會(huì)與現(xiàn)有程序的代碼形式不兼容,需要重新編寫源代碼。
Richard Jones和Paul Kelly針對安全指針的兼容性問題提出了另一種保留原指針形態(tài)的實(shí)時(shí)緩沖區(qū)邊界檢查方法。該方法將程序運(yùn)行時(shí)創(chuàng)建的每個(gè)緩沖區(qū)視為一個(gè)對象,并動(dòng)態(tài)地維護(hù)一張含有所有對象的列表。當(dāng)需要進(jìn)行緩沖區(qū)的指針操作時(shí),通過將該指針映射到相應(yīng)的對象來獲得緩沖區(qū)的長度信息,從而實(shí)現(xiàn)邊界檢查。
Purify是C程序調(diào)試時(shí)查看存儲器使用的工具,Purify檢查所有的存儲器存取,通過用Purify鏈接工具鏈接,可執(zhí)行代碼在執(zhí)行的時(shí)候檢查對數(shù)組的所有引用來保證其合法性。
LibSafe針對C庫中的潛在有緩沖區(qū)溢出漏洞的函數(shù)重新包裝,在函數(shù)調(diào)用前先計(jì)算目標(biāo)地址有否被緩沖區(qū)溢出的可能,即要先進(jìn)行邊界檢查,然后才調(diào)用以完成該函數(shù)正常的功能。LibSafe在實(shí)現(xiàn)時(shí),其邊界檢查只是計(jì)算目標(biāo)緩沖區(qū)是否會(huì)溢出到函數(shù)返回地址,對函數(shù)內(nèi)部用到的局部變量(如函數(shù)指針)就檢查不到,所以該方法不是萬能的。LibSafe的優(yōu)點(diǎn)是不需要重新編譯源程序,只需更改系統(tǒng)的庫函數(shù)即可。
此外,在編譯器方面,當(dāng)編譯含有字符串?dāng)?shù)組的程序時(shí)編譯器在程序開頭預(yù)留出足夠的空間后,接著就將這些空間進(jìn)行初始化。編譯器為函數(shù)中的字符串?dāng)?shù)組分配了空間,但并沒有標(biāo)志數(shù)組的末尾位置,所以根本無法正確測量字符串?dāng)?shù)組的確切大小。應(yīng)該修改現(xiàn)有編譯器的初始化操作,使它在字符串?dāng)?shù)組的末尾加上結(jié)束標(biāo)志“ 主站蜘蛛池模板: 久久影院一区二区h| 亚洲一区二区三区麻豆| 国产18页| 成色7777精品在线| 在线观看国产小视频| 久爱午夜精品免费视频| 午夜精品区| 欧美在线国产| 99久久精品国产麻豆婷婷| 国产一级视频久久| 久久99国产综合精品1| 亚洲精品色AV无码看| 8090成人午夜精品| 亚洲第一页在线观看| 97se亚洲综合在线韩国专区福利| 精品综合久久久久久97| 玖玖精品在线| 久草青青在线视频| A级毛片高清免费视频就| 国产又色又刺激高潮免费看| 中日无码在线观看| 最新日本中文字幕| 亚洲自拍另类| 欧美一道本| 国产日韩精品欧美一区灰| 欧美a级完整在线观看| 97一区二区在线播放| 亚洲欧美另类久久久精品播放的| 色综合久久88| 天天综合网色| 亚洲综合一区国产精品| 色窝窝免费一区二区三区 | 精品国产Av电影无码久久久| 亚洲第一成年免费网站| 国产精品对白刺激| 福利国产微拍广场一区视频在线| 国产资源免费观看| 丰满的少妇人妻无码区| 色爽网免费视频| 精品亚洲欧美中文字幕在线看 | 国产在线精彩视频二区| 欧美高清三区| a在线亚洲男人的天堂试看| 欧美亚洲日韩不卡在线在线观看| 国产性生大片免费观看性欧美| 精品欧美一区二区三区在线| 热99精品视频| 久久99精品国产麻豆宅宅| 露脸真实国语乱在线观看| 成人午夜免费观看| 激情综合激情| 成年人久久黄色网站| 日韩在线影院| 欧美精品不卡| 国产97视频在线| 成人小视频网| 久久中文无码精品| 爆乳熟妇一区二区三区| 日韩AV手机在线观看蜜芽| 国产经典在线观看一区| 亚洲综合色在线| 久久国产黑丝袜视频| 久久久久无码精品| 国产农村妇女精品一二区| 亚洲 日韩 激情 无码 中出| 亚洲无码精品在线播放| 午夜精品久久久久久久无码软件| 亚洲欧洲自拍拍偷午夜色| 国产精品亚欧美一区二区| 色哟哟国产成人精品| 国禁国产you女视频网站| 成年A级毛片| 亚洲国产看片基地久久1024| 国产精品大白天新婚身材| 亚洲女人在线| 国产爽妇精品| 日韩一二三区视频精品| 亚洲中文字幕在线精品一区| 国产精品网址在线观看你懂的| 黄色网站在线观看无码| 高清码无在线看| 国产成人综合久久精品尤物|