孫文豪
大連市委黨校信息中心 遼寧 116013
很久以來,惡意的黑客和病毒開發(fā)者廣泛使用漏洞和緩沖區(qū)溢出技術(shù)。Codered(紅色代碼)病毒就是最典型的例子,其傳播所使用的技術(shù)可以充分體現(xiàn)網(wǎng)絡(luò)時(shí)代網(wǎng)絡(luò)安全與病毒的巧妙結(jié)合,將網(wǎng)絡(luò)蠕蟲、計(jì)算機(jī)病毒、木馬程序合為一體,開創(chuàng)了網(wǎng)絡(luò)病毒傳播的新路,可稱之為劃時(shí)代的病毒。它可以完全取得所攻破計(jì)算機(jī)的所有權(quán)限為所欲為,可以盜走機(jī)密數(shù)據(jù),嚴(yán)重威脅網(wǎng)絡(luò)安全。Codered病毒采用了“緩存區(qū)溢出”的黑客技術(shù),是通過微軟公司IIS系統(tǒng)漏洞進(jìn)行感染,它使IIS服務(wù)程序處理請求數(shù)據(jù)包時(shí)溢出,導(dǎo)致把此“數(shù)據(jù)包”當(dāng)作代碼運(yùn)行,病毒駐留后再次通過此漏洞感染其它服務(wù)器。Codered不同于以往的文件型病毒和引導(dǎo)型病毒,并不將病毒信息寫入被攻擊服務(wù)器的硬盤。它只存在于內(nèi)存,傳染時(shí)不通過文件這一常規(guī)載體,而是借助這個(gè)服務(wù)器的網(wǎng)絡(luò)連接攻擊其它的服務(wù)器,直接從一臺(tái)電腦內(nèi)存?zhèn)鞯搅硪慌_(tái)電腦內(nèi)存。當(dāng)本地 IIS服務(wù)程序收到某個(gè)來自“紅色代碼”發(fā)送的請求數(shù)據(jù)包時(shí),由于存在漏洞,導(dǎo)致處理函數(shù)的堆棧溢出。當(dāng)函數(shù)返回時(shí),原返回地址已被病毒數(shù)據(jù)包覆蓋,程序運(yùn)行線跑到病毒數(shù)據(jù)包中,此時(shí)病毒被激活,并運(yùn)行在 IIS服務(wù)程序的堆棧中。所以很多專門的反病毒公司對 Codered束手無策。之后又出現(xiàn)了Nimda(尼母達(dá))和Badtrans(壞透了)病毒,破壞也非常大。
本文就是針對緩沖區(qū)溢出的安全隱患進(jìn)行分析。
緩沖區(qū)通常是用來存儲(chǔ)數(shù)量事先確定的、有限數(shù)據(jù)的存儲(chǔ)區(qū)域。當(dāng)一個(gè)程序試圖將比緩沖區(qū)容量大的數(shù)據(jù)存儲(chǔ)進(jìn)緩沖區(qū)的時(shí)候,就會(huì)發(fā)生緩沖區(qū)溢出。
為了便于理解,打個(gè)比方。緩沖區(qū)溢出好比是將十磅的糖放進(jìn)一個(gè)只能裝五磅的容器里。一旦該容器放滿了,余下的部分就溢出在柜臺(tái)和地板上,弄得一團(tuán)糟。由于計(jì)算機(jī)程序的編寫者寫了一些編碼,但是這些編碼沒有對目的區(qū)域或緩沖區(qū)——五磅的容器——做適當(dāng)?shù)臋z查,看它們是否夠大,能否完全裝入新的內(nèi)容——十磅的糖,結(jié)果可能造成緩沖區(qū)溢出的產(chǎn)生。如果打算被放進(jìn)新地方的數(shù)據(jù)不適合,溢得到處都是,該數(shù)據(jù)也會(huì)制造很多麻煩。但是,如果緩沖區(qū)僅僅溢出,這只是一個(gè)問題。到此時(shí)為止,它還沒有破壞性。當(dāng)糖溢出時(shí),柜臺(tái)被蓋住。可以把糖擦掉或用吸塵器吸走,還柜臺(tái)本來面貌。與之相對的是,當(dāng)緩沖區(qū)溢出時(shí),過剩的信息覆蓋的是計(jì)算機(jī)內(nèi)存中以前的內(nèi)容。除非這些被覆蓋的內(nèi)容被保存或能夠恢復(fù),否則就會(huì)永遠(yuǎn)丟失。也就是說數(shù)據(jù)超出緩沖區(qū)的大小,多余的數(shù)據(jù)就會(huì)溢出到相鄰的內(nèi)存地址,破壞該位置原有的有效數(shù)據(jù),并且有可能改變執(zhí)行路徑和指令??梢詫⑷我獾臄?shù)據(jù)注入到執(zhí)行路徑中,允許遠(yuǎn)程計(jì)算機(jī)的系統(tǒng)級訪問,不僅使惡意的黑客,也會(huì)使自我復(fù)制的惡意代碼獲得未經(jīng)授權(quán)的訪問。
一個(gè)有漏洞的函數(shù)
一個(gè)大小為256字節(jié)的緩沖區(qū),程序試圖用512字節(jié)的字符A填滿這個(gè)緩沖區(qū)。由于程序溢出了這個(gè)小的256字節(jié)的緩沖區(qū),EIP(指令指針)是如何改變的。
當(dāng)數(shù)據(jù)超出緩沖區(qū)大小的時(shí)候,剩下的數(shù)據(jù)就會(huì)覆蓋堆棧的鄰近區(qū)域原有的數(shù)據(jù),包括一些重要的值,比如用來定義執(zhí)行路徑的指令指針(EIP)。通過覆蓋返回的EIP地址,攻擊者可以任意修改程序下一步將要執(zhí)行的內(nèi)容。
攻擊者使用自己的惡意代碼填充緩沖區(qū),而不是A,使用填滿了惡意代碼的緩沖區(qū)地址來覆蓋EIP(指向程序下一步將要執(zhí)行的代碼),而不是隨機(jī)的數(shù)據(jù)來重寫它。這改變了程序的執(zhí)行路徑,轉(zhuǎn)而執(zhí)行被注入的惡意代碼。
堆棧緩沖區(qū)溢出的原因是在復(fù)制數(shù)據(jù)到緩沖區(qū)時(shí)沒有檢測數(shù)據(jù)大小。這經(jīng)常是由于使用了不限制從一個(gè)位置復(fù)制到另一個(gè)位置的數(shù)據(jù)的大小的函數(shù)造成。如,strcpy是C語言中用來將一個(gè)緩沖區(qū)中的字符串復(fù)制到另一個(gè)緩沖區(qū)的函數(shù),這個(gè)函數(shù)不檢測接收字符串的緩沖區(qū)是否夠大,所以可能溢出。
程序員經(jīng)常犯計(jì)數(shù)錯(cuò)誤,會(huì)出現(xiàn)因?yàn)槎喑鲆粋€(gè)字節(jié)而溢出的現(xiàn)象,即單字節(jié)越界溢出。程序員希望使用相對安全的函數(shù),例如strncat函數(shù),但這并不一定使他們的程序更加安全。其實(shí)strncat函數(shù)經(jīng)常導(dǎo)致溢出,它的行為相對太直觀,在檢查緩沖區(qū)大小的時(shí)候發(fā)生錯(cuò)誤,經(jīng)常會(huì)導(dǎo)致單字節(jié)越界溢出,因?yàn)槌绦騿T沒有注意到數(shù)組的下標(biāo)是從“0”開始。這種溢出只溢出一個(gè)字節(jié),程序不能夠重寫 EIP。系統(tǒng)字節(jié)序是little-endian,程序可以覆蓋EBP中的低位字節(jié)。根據(jù)代碼的不同,可以用多種方式利用偽造的EBP。緊接著下一條指令是mov esp, ebp, 這使堆棧指針指向緩沖區(qū)的位置。偽造堆棧中的本地變量部分是經(jīng)過處理的,程序返回后繼續(xù)執(zhí)行偽造的EIP處的指令,實(shí)際上執(zhí)行的是堆棧中被注入的代碼。程序員有一個(gè)普遍的誤解,通過動(dòng)態(tài)分配內(nèi)存,避免使用堆棧,減少緩沖區(qū)溢出的可能。堆是動(dòng)態(tài)分配的內(nèi)存,這部分內(nèi)存與分配給堆棧的是分離的,堆的建立和刪除是動(dòng)態(tài)的。事先不知道程序所需的內(nèi)存大小時(shí),或所需內(nèi)存比堆棧大時(shí),經(jīng)常使用堆。堆溢出并不影響 EIP,溢出的堆覆蓋數(shù)據(jù)或者修改指向數(shù)據(jù)和函數(shù)指針,也可導(dǎo)致拒絕服務(wù)攻擊,使應(yīng)用程序崩潰。函數(shù)指針(function pointer)溢出發(fā)生在使用回調(diào)函數(shù)(callback function)時(shí),緩沖區(qū)后面是函數(shù)指針,不檢查緩沖邊界,就有可能覆蓋函數(shù)指針。
格式化字符串漏洞是因?yàn)槌绦騿T粗心大意的編碼造成的,C語言的函數(shù)可以將字符串打印到文件、緩沖區(qū)、屏幕上。程序員利用函數(shù)的格式化控制輸出格式。百分號(%)是轉(zhuǎn)義符,后面字符表示輸出的格式,如%d表示用十進(jìn)制格式顯示數(shù)值,%X表示用十六進(jìn)制格式顯示,并用大寫字母。這就是格式說明符。一個(gè)使用錯(cuò)誤格式化語法的偽程序:
這段程序想把“hello Beijing”顯示在屏幕上,但函數(shù)的調(diào)用格式不正確,正確的應(yīng)該是 Printf(“%s”,buffer);這種編程方式容易被攻擊者利用,控制堆棧并注入任意的可執(zhí)行代碼。
安全研究人員檢測到大多數(shù)的應(yīng)用程序都含有這種漏洞,開發(fā)者依然不重視,還繼續(xù)錯(cuò)誤使用格式輸出函數(shù),造成現(xiàn)在很多應(yīng)用程序存在漏洞,易受攻擊。
緩沖區(qū)溢出的安全隱患經(jīng)常被忽視,它只是黑客和病毒攻擊的一種手段,破壞力可大可小,隨著現(xiàn)代技術(shù)的不斷更新,網(wǎng)絡(luò)攻擊和防御也平衡發(fā)展。保護(hù)計(jì)算機(jī)的最好辦法就是經(jīng)常安裝安全補(bǔ)丁修補(bǔ)系統(tǒng),基于主機(jī)以及基于網(wǎng)絡(luò)的漏洞分析工具能夠幫助找到內(nèi)部網(wǎng)絡(luò)中過期的有漏洞的系統(tǒng),及時(shí)安裝補(bǔ)丁。另外,漏洞分析工具還可以識別出該卸載的不需要不安全的服務(wù)。企業(yè)版及個(gè)人版的防火墻軟件也有利于防范外來的和內(nèi)部的攻擊,需要在工作站、服務(wù)器、網(wǎng)關(guān)上安裝防范機(jī)制,網(wǎng)絡(luò)安全最重要。
[1]Halvar Flake,personal communication.2004.
[2]Peter szor and Frederic perriot.2003.