概說
現(xiàn)代的編譯器和系統(tǒng)已經(jīng)實(shí)現(xiàn)了很多機(jī)制圆米,避免受到緩沖區(qū)溢出的攻擊,下面介紹Linux上比較新版本的GCC所提供的機(jī)制。
1. 棧的隨機(jī)化
我們?cè)谇懊嫖恼吕锾岬降囊粋€(gè)參數(shù)設(shè)置:
sysctl -w kernel.randomize_va_space=0
kernel.randomize_va_space 就是棧隨機(jī)化的設(shè)置,當(dāng)它的值為0時(shí)温数,禁止實(shí)現(xiàn)棧隨機(jī)化,這樣的情況下蜻势,程序在同一計(jì)算機(jī)系統(tǒng)內(nèi)每次啟動(dòng)的棾糯蹋基地址都是固定不變的。
當(dāng)它的值為1時(shí)握玛,將實(shí)現(xiàn)棧隨機(jī)化够傍,棧的位置在程序每次運(yùn)行時(shí)都有變化。 即使許多機(jī)器都運(yùn)行同樣的代碼挠铲,它們的棧地址都是不同的冕屯。
棧隨機(jī)化的實(shí)現(xiàn)方式是:
程序開始時(shí),在棧上分配一段0~n字節(jié)之間的隨機(jī)大小空間拂苹,程序不使用這段空間安聘,但它會(huì)導(dǎo)致程序每次執(zhí)行時(shí)的棧的位置發(fā)生變化。
分配的范圍n必須足夠大瓢棒,才能獲得足夠多樣的棧地址變化浴韭;同時(shí)又必須足夠小,不至于浪費(fèi)程序太多的空間脯宿。
在Linux中念颈,棧隨機(jī)化是標(biāo)準(zhǔn)行為,它是更大的一類技術(shù)中的一種连霉,這類技術(shù)稱為地址空間布局隨機(jī)化,采用這類技術(shù)榴芳,程序的不同部分(代碼段嗡靡、數(shù)據(jù)段、堆棧)都會(huì)被加載到存儲(chǔ)器的不同部分翠语。
- 頑固且有耐性的攻擊者可以通過枚舉的方法來蠻力克服隨機(jī)化叽躯,它反復(fù)用不同的地址進(jìn)行攻擊财边,來猜測棧的地址肌括。如果它建立一個(gè)256字節(jié)的nop sled(空操作),枚舉215=32768個(gè)起始地址就能破解223的隨機(jī)化酣难。
- 對(duì)于64位系統(tǒng)谍夭,需要嘗試2^24=16777216就有點(diǎn)令人生畏了。
2. 棧破壞檢測
前面的文章里憨募,我們用gcc編譯時(shí)都加上了下面的參數(shù)紧索。
"-fno-stack-protector" 這個(gè)參數(shù)用來阻止程序生成棧破壞檢測的代碼。
這是因?yàn)樵谛掳娴腉CC里加入了一種棧保護(hù)者機(jī)制菜谣,用來檢測緩沖區(qū)越界珠漂,如果我們不禁止這個(gè)功能,那么演示緩沖區(qū)溢出攻擊實(shí)例就無法成功尾膊。
那么媳危,GCC是怎樣實(shí)現(xiàn)這個(gè)保護(hù)機(jī)制的呢?
實(shí)現(xiàn)的方法是: 在棧幀中任何局部緩沖區(qū)和棧狀態(tài)之間存儲(chǔ)一個(gè)只有程序本身才知道的隨機(jī)值冈敛,俗稱為哨兵待笑,在恢復(fù)存儲(chǔ)器狀態(tài)和函數(shù)返回之前,程序檢測哨兵值是否被覆蓋抓谴,如果是暮蹂,那么程序就異常中止。
3.限制可執(zhí)行代碼區(qū)域
我們?cè)谇懊娴奈恼轮芯幾g程序也用到了下面的一個(gè)參數(shù)
execstack
使用這個(gè)參數(shù)的目的就是將限制可執(zhí)行代碼區(qū)域的限制取消癌压,使我們的演示能順利進(jìn)行仰泻。
這種方法的實(shí)現(xiàn)是和虛擬存儲(chǔ)器的頁表?xiàng)l目有關(guān)的,在每個(gè)頁表?xiàng)l目里有三個(gè)權(quán)限位用來控制對(duì)頁的訪問滩届,其中XD就是禁止CPU在這個(gè)頁表所對(duì)應(yīng)的空間里讀取指令集侯,亦即是在這個(gè)區(qū)域里限制可執(zhí)行代碼。
1.現(xiàn)代的處理器都使用虛擬尋址的尋址形式丐吓,CPU通過一個(gè)生成的虛擬地址來訪問內(nèi)存浅悉,這些虛擬地址就是通頁表?xiàng)l目來記錄管理的。
2.頁表?xiàng)l目是由幾個(gè)權(quán)限位(有效位)和一個(gè)n位地址字段組成券犁。
4. 總結(jié)
我們講到的這些技術(shù)——隨機(jī)化术健、棧保護(hù)和限制可執(zhí)行代碼,是用于最小化程序緩沖區(qū)溢出攻擊漏洞三種最常見機(jī)制粘衬,它們都有同樣的屬性荞估,就是不需要程序員任何特殊的努力咳促,帶來的性能代價(jià)都非常小,甚至沒有勘伺。這三種機(jī)制都很有效跪腹,三種結(jié)合起來大大提高了程序的安全性,不幸的是飞醉,仍然有辦法能夠攻擊到計(jì)算機(jī)冲茸。
什么辦法呢?
后面的章節(jié)見解缅帘!