1988年,世界上第一個(gè)緩沖區(qū)溢出攻擊——Morris蠕蟲(chóng)在互聯(lián)網(wǎng)上泛濫,短短一夜的時(shí)間全世界6000多臺(tái)網(wǎng)絡(luò)服務(wù)器癱瘓或半癱瘓,不計(jì)其數(shù)的數(shù)據(jù)和資料被毀。造成一場(chǎng)損失近億美元的空前大劫難!
緩沖區(qū)
計(jì)算機(jī)程序一般都會(huì)使用到一些內(nèi)存,這些內(nèi)存或是程序內(nèi)部使用,或是存放用戶的輸入數(shù)據(jù),這樣的內(nèi)存一般稱作緩沖區(qū)。
溢出
溢出是指盛放的東西超出容器容量而溢出來(lái)了,在計(jì)算機(jī)程序中,就是數(shù)據(jù)使用到了被分配內(nèi)存空間之外的內(nèi)存空間。
緩沖區(qū)溢出
緩沖區(qū)溢出簡(jiǎn)單的說(shuō)就是計(jì)算機(jī)對(duì)接收的輸入數(shù)據(jù)沒(méi)有進(jìn)行有效的檢測(cè)(理想的情況是程序檢查數(shù)據(jù)長(zhǎng)度并不允許輸入超過(guò)緩沖區(qū)長(zhǎng)度的字符),向緩沖區(qū)內(nèi)填充數(shù)據(jù)時(shí)超過(guò)了緩沖區(qū)本身的容量,而導(dǎo)致數(shù)據(jù)溢出到被分配空間之外的內(nèi)存空間,使得溢出的數(shù)據(jù)覆蓋了其他內(nèi)存空間的數(shù)據(jù)。
緩沖區(qū)溢出是一種非常危險(xiǎn)的漏洞,在各種操作系統(tǒng)、應(yīng)用軟件中廣泛存在。利用緩沖區(qū)溢出攻擊,可以導(dǎo)致程序運(yùn)行失敗、系統(tǒng)宕機(jī)、重新啟動(dòng)等后果。更為嚴(yán)重的是,可以利用它執(zhí)行非授權(quán)指令,甚至可以取得系統(tǒng)特權(quán),進(jìn)而進(jìn)行各種非法操作。
緩沖區(qū)溢出就好比一個(gè)杯子倒太多的水,灑出來(lái),這叫溢出。它是一種非常普遍、非常危險(xiǎn)的漏洞,最常出現(xiàn)在C/C++編寫(xiě)的程序中。
早期,人們還不那么重視數(shù)據(jù)安全的時(shí)候,往往會(huì)使用像strcpy這類不安全函數(shù),這種函數(shù)對(duì)用戶的輸入不作任何檢查,總之,來(lái)自不拒,那么,分配的內(nèi)存空間是有限的,如果輸入超長(zhǎng)的字符串,必然會(huì)導(dǎo)致溢出。
講了這么多,小伙伴會(huì)不會(huì)有點(diǎn)暈嗎?其實(shí),緩沖區(qū)溢出很容易理解的。下面我們看一個(gè)具體的例子:
這段代碼存在一個(gè)經(jīng)典的緩沖區(qū)溢出漏洞strcpy,為str變量分配了8個(gè)字節(jié)的空間,輸入小于等于8個(gè)字符,那沒(méi)問(wèn)題:
但是當(dāng)我們輸入超長(zhǎng)的數(shù)據(jù)時(shí),問(wèn)題出現(xiàn)了
緩沖區(qū)溢出帶來(lái)的危害
在計(jì)算機(jī)安全領(lǐng)域,緩沖區(qū)溢出就好比給自己的程序開(kāi)了個(gè)后門(mén),這種安全隱患是致命的。緩沖區(qū)溢出在各種操作系統(tǒng)、應(yīng)用軟件中廣泛存在。而利用緩沖區(qū)溢出漏洞實(shí)施的攻擊就是緩沖區(qū)溢出攻擊。
緩沖區(qū)溢出攻擊,可以導(dǎo)致程序運(yùn)行失敗、系統(tǒng)關(guān)機(jī)、重新啟動(dòng),或者執(zhí)行攻擊者的指令,比如非法提升權(quán)限。假如問(wèn)題出現(xiàn)在常用的一些軟件,比如操作系統(tǒng)、瀏覽器、通訊軟件等,那后果不堪想象。
緩沖區(qū)溢出中,最為危險(xiǎn)的是堆棧溢出,因?yàn)槿肭终呖梢岳枚褩R绯?,在函?shù)返回時(shí)改變返回程序的地址,讓其跳轉(zhuǎn)到任意地址,帶來(lái)的危害一種是程序崩潰導(dǎo)致拒絕服務(wù),另外一種就是跳轉(zhuǎn)并且執(zhí)行一段惡意代碼,比如得到系統(tǒng)權(quán)限,然后為所欲為。
有可能小伙伴你會(huì)對(duì)病毒/蠕蟲(chóng)沒(méi)有概念,那我們來(lái)舉一個(gè)簡(jiǎn)單的例子吧。平時(shí)玩電腦的時(shí)候,你正在聽(tīng)歌,突然間收到未知的“朋友”發(fā)給你的一個(gè)m3u音頻文件,并引導(dǎo)你進(jìn)行電擊——“這首歌很好聽(tīng)呢,你也聽(tīng)聽(tīng)”。
湊巧的是,你電腦剛好了就裝了VUPlayer.exe 這個(gè)播放器,不多想,就打開(kāi)這個(gè)音樂(lè)想聽(tīng)聽(tīng)看,奇怪的是,軟件閃了一下就退出了,你以為是文件損壞了了吧。其實(shí),這個(gè)時(shí)候,你已經(jīng)被黑了,沒(méi)錯(cuò)!這就是那個(gè)播放器。
很普通的播放器,但是它存在致命緩沖區(qū)溢出漏洞。我們構(gòu)造10000個(gè)A的m3u文件,然后用調(diào)試器附加VUPlayer.exe,打開(kāi)文件:
我們看到下面的內(nèi)存全部被字符A覆蓋了,其實(shí)就是使用了不安全的lstrcpyA函數(shù)導(dǎo)致溢出,這個(gè)是棧溢出,還有一種是堆溢出,但本質(zhì)是一樣的。
證明有溢出漏洞之后,往往需要進(jìn)一步分析,不同的人目的不竟相同,但需要注意的是,也有很多“黑市”的不法分子會(huì)攻擊政府機(jī)構(gòu)或企業(yè)的系統(tǒng),盜取機(jī)密文件等,這是非常危險(xiǎn)的。
如何預(yù)防
緩沖區(qū)溢出是代碼中固有的漏洞,除了在開(kāi)發(fā)階段要注意編寫(xiě)正確的代碼之外,對(duì)于用戶而言,一般的防范措施為
1、關(guān)閉端口或服務(wù),管理員應(yīng)該知道自己的系統(tǒng)上安裝了什么,并且哪些服務(wù)正在運(yùn)行。
2、安裝軟件廠商的補(bǔ)丁,需要及時(shí)安裝漏洞補(bǔ)丁。
3、在防火墻上過(guò)濾特殊的流量,無(wú)法阻止內(nèi)部人員的溢出攻擊。
4、檢查關(guān)鍵的服務(wù)程序,看看是否有可怕的漏洞。
5、以所需要的最小權(quán)限運(yùn)行軟件。
6、可借助安防軟件提升操作系統(tǒng)安全級(jí)別,比如優(yōu)炫操作系統(tǒng)安全增強(qiáng)系統(tǒng)。
評(píng)論
查看更多