楊國(guó)旗
【摘要】 計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)現(xiàn)在已經(jīng)得到了廣泛的應(yīng)用,對(duì)工作和生活均有著重要影響。但是因?yàn)榫W(wǎng)絡(luò)環(huán)境的特殊性,很容易受到外部攻擊影響,安全性較低,尤其是利用網(wǎng)絡(luò)漏洞進(jìn)行攻擊為最為常見(jiàn)的威脅。緩沖區(qū)溢出漏洞攻擊作為主要威脅形式,必須要確定其特點(diǎn),有針對(duì)性的采取措施進(jìn)行處理優(yōu)化,降低攻擊帶來(lái)的影響,本文對(duì)此進(jìn)行了簡(jiǎn)要分析。
【關(guān)鍵詞】 緩沖區(qū) 漏洞攻擊 安全性
安全問(wèn)題一直都是計(jì)算機(jī)網(wǎng)絡(luò)運(yùn)行分析要點(diǎn),隨著計(jì)算機(jī)技術(shù)水平的提高,黑客攻擊方式也在不斷更新,通過(guò)層出不窮的手段和控制方法對(duì)網(wǎng)絡(luò)運(yùn)行帶來(lái)巨大的威脅。利用緩沖區(qū)溢出漏洞來(lái)對(duì)計(jì)算機(jī)系統(tǒng)進(jìn)行攻擊,在日常操作中比較常見(jiàn),想要有效解決此類問(wèn)題,必須要確定攻擊原理,有的放矢的應(yīng)用有效手段進(jìn)行優(yōu)化。
一、緩沖區(qū)溢出漏洞分析
緩沖區(qū)即計(jì)算機(jī)內(nèi)存塊在內(nèi)存地址的連續(xù)分配地址,而緩沖區(qū)溢出漏洞則是因?yàn)閮?nèi)存邊界檢查機(jī)制在C語(yǔ)言或者C++語(yǔ)言設(shè)計(jì)時(shí),未設(shè)置邊界造成。就象現(xiàn)在計(jì)算機(jī)操作系統(tǒng),大部分均是選擇用C語(yǔ)言或者C++語(yǔ)言編寫,如果計(jì)算機(jī)程度想要將寫入地址超出內(nèi)存邊界,便會(huì)產(chǎn)生非法操作[1]。如將寫入數(shù)據(jù)保存到臨近內(nèi)存地址內(nèi),出現(xiàn)錯(cuò)誤運(yùn)行命令,情況嚴(yán)重甚至?xí)斐上到y(tǒng)崩潰?;蛘呤腔诼┒磮?zhí)行操作命令,得到系統(tǒng)最高執(zhí)行權(quán),并操作干擾機(jī)器攻擊軟件系統(tǒng)。
二、緩沖區(qū)溢出漏洞攻擊分析
2.1確定溢出點(diǎn)
要對(duì)漏洞發(fā)現(xiàn)人或者組織原始資料進(jìn)行全面收集,其根據(jù)漏洞描述重現(xiàn)漏洞。其中,漏洞重現(xiàn)時(shí)要重點(diǎn)做好操作系統(tǒng)類型、軟件環(huán)境和補(bǔ)丁版本等選擇。同時(shí)還要注意對(duì)相關(guān)出錯(cuò)信息的收集,例如程序出錯(cuò)原因以及出錯(cuò)時(shí)EIP值。另外,可以利用Ollydbg、SoftICE等調(diào)試工具對(duì)溢出情況進(jìn)行分析,對(duì)存在問(wèn)題的執(zhí)行流程進(jìn)行跟蹤,最終確定溢出點(diǎn)。
2.2 JMP ESP覆蓋
確定溢出點(diǎn)以后,便可以構(gòu)造攻擊語(yǔ)句。JMP ESP覆蓋方法,主要是利用strcpy、ssprintf等函數(shù)覆蓋堆棧,待達(dá)到堆棧保存的函數(shù)返回地址時(shí),利用Windows系統(tǒng)核心內(nèi)的JMP DSP指令地址進(jìn)行覆蓋,并在后面緊跟shellcode[2]。此種覆蓋方法可以直接進(jìn)入shellcode,在函數(shù)返回時(shí),ESP指向JMP ESP地址,使得JMP ESP地址出棧,使得EIP指針指向該地址。而ESP則會(huì)繼續(xù)下移,只想構(gòu)造好的shellcode。然后計(jì)算機(jī)繼續(xù)向下執(zhí)行EIP指向的指令JMP ESP,并且ESP此時(shí)指向shellcode,最終便會(huì)順利跳轉(zhuǎn)到shellcode位置。
2.3 SEH覆蓋
SEH覆蓋是一種水平更高的攻擊手段,其主要是利用覆蓋Windows系統(tǒng)內(nèi)異常處理鏈SEH來(lái)實(shí)現(xiàn)攻擊。對(duì)于 Windows系統(tǒng),如果運(yùn)行過(guò)程中出現(xiàn)異常情況,系統(tǒng)會(huì)查找異常處理鏈SEH,并確定可以應(yīng)對(duì)此種異常情況的處理程序,然后將保存的處理程序地址賦給EIP,最終系統(tǒng)會(huì)對(duì)此處理程序進(jìn)行執(zhí)行,以免造成系統(tǒng)的崩潰。對(duì)于Windows系統(tǒng),SEH鏈會(huì)被保存在堆棧中,應(yīng)用此種覆蓋方法進(jìn)行攻擊,即將頂層SEH中指向下一節(jié)點(diǎn)值覆蓋成JMP 04,且處理程序地址被覆蓋成CALL EBX或POP POP RET的地址,后面跟上shellcode[3]。一旦系統(tǒng)運(yùn)行出現(xiàn)錯(cuò)誤,Windows便會(huì)跳轉(zhuǎn)到處理程序,執(zhí)行CALL EBX或者POP POP RET,進(jìn)入前面的JMP 04并執(zhí)行,這樣便跳過(guò)覆蓋地址,達(dá)到shellcode位置。
三、緩沖區(qū)溢出漏洞攻擊解決對(duì)策
1.檢查數(shù)組邊界。緩沖區(qū)溢出漏洞攻擊大部分是因?yàn)槟承┱Z(yǔ)言未設(shè)置邊界檢查機(jī)制造成的,為減少此類攻擊問(wèn)題,可以通過(guò)檢查數(shù)組邊界的方法進(jìn)行避免。但是要注意此種方法,邊界檢查后C語(yǔ)言編譯器性能會(huì)降低大概15%。或者是應(yīng)用其他安全性比較高的語(yǔ)言,如JAVA程序,其自身就具有邊界檢查機(jī)制,與其他語(yǔ)言比,其可以有效避免此類攻擊。
2.阻止棧執(zhí)行。基于緩沖區(qū)溢出漏洞攻擊原理,在研究解決對(duì)策時(shí),要避免控制權(quán)被轉(zhuǎn)移到執(zhí)行非法移入到棧中程序,如果棧中程序無(wú)法有效運(yùn)行,無(wú)論是通過(guò)任何方式均不能執(zhí)行棧中程序,以此來(lái)避免利用漏洞產(chǎn)生的攻擊。如果選擇應(yīng)用此種方法,必須要對(duì)操作系統(tǒng)內(nèi)核進(jìn)行升級(jí)或者打補(bǔ)丁,整個(gè)過(guò)程復(fù)雜性較高,實(shí)際應(yīng)用效率較低。因此,在對(duì)操作平臺(tái)進(jìn)行開發(fā)時(shí),需要重視操作系統(tǒng)架構(gòu)的設(shè)計(jì),爭(zhēng)取從源頭上消除此漏洞。
3.指針完整性檢查。此種方法主要是對(duì)編譯器進(jìn)行擴(kuò)展,將1個(gè)數(shù)據(jù)結(jié)構(gòu)“canary”放入局部變量和棧返回地址中間?!癱anary”是1個(gè)占用4個(gè)字節(jié)空間的數(shù)據(jù),由程序運(yùn)行過(guò)程中隨機(jī)產(chǎn)生。1個(gè)函數(shù)調(diào)用結(jié)束后,執(zhí)行棧中函數(shù)返回地址代碼前會(huì)對(duì)“canary”進(jìn)行檢查,確定“canary”內(nèi)部數(shù)據(jù)是否發(fā)生變化。對(duì)于數(shù)據(jù)發(fā)生變化的,便可確定已經(jīng)發(fā)生緩沖區(qū)溢出漏洞攻擊,需要立即中止執(zhí)行棧中返回地址的代碼。
結(jié)束語(yǔ):緩沖區(qū)溢出漏洞攻擊對(duì)計(jì)算機(jī)網(wǎng)絡(luò)系統(tǒng)運(yùn)行安全具有很大的威脅,想要有效解決此類問(wèn)題,必須要根據(jù)其攻擊原理,選擇合適的優(yōu)化對(duì)策,避免緩沖區(qū)溢出漏洞的攻擊,提高系統(tǒng)運(yùn)行可靠性。
參 考 文 獻(xiàn)
[1] 徐欣民.一種緩沖區(qū)溢出漏洞自動(dòng)挖掘及漏洞定位技術(shù)[D].華中科技大學(xué),2008.
[2] 劉征.緩沖區(qū)溢出漏洞攻擊及其對(duì)策[J].河南科技,2012,13:57.
[3] 陸開奎.基于動(dòng)態(tài)污點(diǎn)分析的漏洞攻擊檢測(cè)技術(shù)研究與實(shí)現(xiàn)[D].電子科技大學(xué),2013.