專利名稱:一種緩沖區(qū)溢出的保護(hù)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)信息的讀入讀出保護(hù)方法,特別是一種緩沖區(qū)溢出 的保護(hù)方法。
背景技術(shù):
緩沖區(qū)是內(nèi)存中存放數(shù)據(jù)的地方。在程序試圖將數(shù)據(jù)放到計(jì)算機(jī)內(nèi)存 中的某一位置,但沒有足夠空間時(shí)會(huì)發(fā)生緩沖區(qū)溢出。
緩沖區(qū)是程序運(yùn)行時(shí)計(jì)算機(jī)內(nèi)存中的一個(gè)連續(xù)的塊,它保存了給定類 型的數(shù)據(jù)。問題隨著動(dòng)態(tài)分配變量而出現(xiàn)。為了不用太多的內(nèi)存, 一個(gè)有 動(dòng)態(tài)分配變量的程序在程序運(yùn)行時(shí)才決定給他們分配多少內(nèi)存。如果程序 在動(dòng)態(tài)分配緩沖區(qū)放入太多的數(shù)據(jù)會(huì)有什么現(xiàn)象?它溢出了,漏到了別的 地方。 一個(gè)緩沖區(qū)溢出應(yīng)用程序使用這個(gè)溢出的數(shù)據(jù)將匯編語言代碼放到
計(jì)算機(jī)的內(nèi)存中,通常是產(chǎn)生root權(quán)限的地方。單單的緩沖區(qū)溢出,并 不會(huì)產(chǎn)生安全問題。只有將溢出送到能夠以root權(quán)限運(yùn)行命令的區(qū)域才 行。這樣, 一個(gè)緩沖區(qū)利用程序?qū)⒛苓\(yùn)行的指令放在了有root權(quán)限的內(nèi) 存中,從而一旦運(yùn)行這些指令,就是以root權(quán)限控制了計(jì)算機(jī)。總結(jié)一 下上面的描述。緩沖區(qū)溢出指的是一種系統(tǒng)攻擊的手段,通過往程序的 緩沖區(qū)寫超出其長(zhǎng)度的內(nèi)容,造成緩沖區(qū)的溢出,從而破壞程序的堆棧,
使程序轉(zhuǎn)而執(zhí)行其它指令,以達(dá)到攻擊的目的。據(jù)統(tǒng)計(jì),通過緩沖區(qū)溢
出進(jìn)行的攻擊占所有系統(tǒng)攻擊總數(shù)的80%以上。造成緩沖區(qū)溢出的原因 是程序中沒有仔細(xì)檢査用戶輸入的參數(shù)。
對(duì)于上述問題,現(xiàn)有的主要解決方法是通過編寫正確的代碼來實(shí)現(xiàn) 編寫正確的代碼是一件非常有意義但耗時(shí)的工作,特別像編寫C語言 那種具有容易出錯(cuò)傾向的程序(如字符串的零結(jié)尾),這種風(fēng)格是由于
追求性能而忽視正確性的傳統(tǒng)弓l起的。盡管花了很長(zhǎng)的時(shí)間使得人們知道 了如何編寫安全的程序組具有安全漏洞的程序依舊出現(xiàn)。因此人們開發(fā)了 一些工具和技術(shù)來幫助經(jīng)驗(yàn)不足的程序員編寫安全正確的程序。
最簡(jiǎn)單的方法就是用gr印來搜索源代碼中容易產(chǎn)生漏洞的庫的調(diào)用, 比如對(duì)strcpy和sprintf的調(diào)用,這兩個(gè)函數(shù)都沒有檢査輸入?yún)?shù)的長(zhǎng) 度。事實(shí)上,各個(gè)版本C的標(biāo)準(zhǔn)庫均有這樣的問題存在。為了尋找一些常 見的諸如緩沖區(qū)溢出和操作系統(tǒng)競(jìng)爭(zhēng)條件等漏洞, 一些代碼檢查小組檢査 了很多的代碼。然而依然有漏網(wǎng)之魚存在。盡管采用了 strcpy和sprintf 這些替代函數(shù)來防止緩沖區(qū)溢出的發(fā)生,但是由于編寫代碼的問題,仍舊 會(huì)有這種情況發(fā)生。比如lprm程序就是最好的例子,雖然它通過了代碼 的安全檢査,但仍然有緩沖區(qū)溢出的問題存在。
發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種緩沖區(qū)溢出的保護(hù)方法,主要解決現(xiàn)有的 通過編寫正確的代碼來實(shí)現(xiàn)的方法不但編寫過程十分費(fèi)時(shí),而且仍然無法
徹底解決緩沖區(qū)溢出的的技術(shù)問題,降低的系統(tǒng)由于緩沖區(qū)溢出而被攻擊 的概率。
為解決上述問題,本發(fā)明是這樣實(shí)現(xiàn)的
一種緩沖區(qū)溢出的保護(hù)方法,其特征在于該方法主要通過非執(zhí)行的 緩沖區(qū)來實(shí)現(xiàn),通過使被攻擊程序的數(shù)據(jù)段地址空間不可執(zhí)行,從而使得 攻擊者不可能執(zhí)行被植入被攻擊程序輸入緩沖區(qū)的代碼。
所述的緩沖區(qū)溢出的保護(hù)方法,其特征在于該方法在Linux系統(tǒng)中 采用信號(hào)傳遞方式來實(shí)現(xiàn),Linux通過向進(jìn)程堆棧釋放代碼然后引發(fā)中斷 來執(zhí)行在堆棧中的代碼進(jìn)而實(shí)現(xiàn)向進(jìn)程發(fā)送Unix信號(hào),非執(zhí)行緩沖區(qū)的 補(bǔ)丁在發(fā)送信號(hào)的時(shí)候是允許緩沖區(qū)可執(zhí)行的。
所述的緩沖區(qū)溢出的保護(hù)方法,其特征在于該方法在Linux系統(tǒng)中 采用GCC的在線重用方式來實(shí)現(xiàn),GCC在堆棧區(qū)里放置了可執(zhí)行的代碼以 便在線重用,非執(zhí)行堆棧的保護(hù)可以有效地對(duì)付把代碼植入自動(dòng)變量的緩 沖區(qū)溢出攻擊,而對(duì)于其他形式的攻擊則沒有效果。
通過上述技術(shù)方案,本發(fā)明方法可以通過編寫正確的代碼來實(shí)現(xiàn)的方 法不但編寫過程十分費(fèi)時(shí),而且仍然無法徹底解決緩沖區(qū)溢出的的技術(shù)問 題,降低的系統(tǒng)由于緩沖區(qū)溢出而被攻擊的概率。
具體實(shí)施例方式
本發(fā)明提供了一種緩沖區(qū)溢出的保護(hù)方法,該方法主要通過非執(zhí)行的 緩沖區(qū)來實(shí)現(xiàn)。通過使被攻擊程序的數(shù)據(jù)段地址空間不可執(zhí)行,從而使得
攻擊者不可能執(zhí)行被植入被攻擊程序輸入緩沖區(qū)的代碼,這種技術(shù)被稱為 非執(zhí)行的緩沖區(qū)技術(shù)。
事實(shí)上,很多老的Unix系統(tǒng)都是這樣設(shè)計(jì)的,但是近來的Unix和MS Windows系統(tǒng)為實(shí)現(xiàn)更好的性能和功能,往往在數(shù)據(jù)段中動(dòng)態(tài)地放人可執(zhí) 行的代碼。所以為了保持程序的兼容性不可能使得所有程序的數(shù)據(jù)段不可 執(zhí)行。但是我們可以設(shè)定堆棧數(shù)據(jù)段不可執(zhí)行,這樣就可以最大限度地保 證了程序的兼容性。Linux和Solaris都發(fā)布了有關(guān)這方面的內(nèi)核補(bǔ)丁。 因?yàn)閹缀鯖]有任何合的程序會(huì)在堆棧中存放代碼,這種做法幾乎不產(chǎn)生任 何兼容性問題,除了在Linux中的兩個(gè)特例,這時(shí)可執(zhí)行的代碼必須被放 入堆棧中
本發(fā)明的第一種實(shí)施例信號(hào)傳遞
Linux通過向進(jìn)程堆棧釋放代碼然后引發(fā)中斷來執(zhí)行在堆棧中的代碼 進(jìn)而實(shí)現(xiàn)向迸程發(fā)送Unix信號(hào)。非執(zhí)行緩沖區(qū)的補(bǔ)丁在發(fā)送信號(hào)的時(shí)候 是允許緩沖區(qū)可執(zhí)行的。
本發(fā)明的第二種實(shí)施例GCC的在線重用
研究發(fā)現(xiàn)GCC在堆棧區(qū)里放置了可執(zhí)行的代碼以便在線重用。然而, 關(guān)閉這個(gè)功能并不產(chǎn)生任何問題。只有部分功能似乎不能使用。非執(zhí)行堆 棧的保護(hù)可以有效地對(duì)付把代碼植入自動(dòng)變量的緩沖區(qū)溢出攻擊,而對(duì)于 其他形式的攻擊則沒有效果。通過引用一個(gè)駐留的程序的指針,就可以跳 過這種保護(hù)措施。其他的攻擊可以采用把代碼植入堆或者靜態(tài)數(shù)據(jù)段中來 跳過保護(hù)。另外,為了是本發(fā)明的效果更加明顯,可配合現(xiàn)有的通過編寫正確的 代碼來實(shí)現(xiàn)的方法來使用,只是實(shí)施這種方法的成本更加高。
綜上所述僅為本發(fā)明的較佳實(shí)施例而己,并非用來限定本發(fā)明的實(shí)施 范圍。即凡依本發(fā)明申請(qǐng)專利范圍的內(nèi)容所作的等效變化與修飾,都應(yīng)為 本發(fā)明的技術(shù)范疇。
權(quán)利要求
1、一種緩沖區(qū)溢出的保護(hù)方法,其特征在于該方法主要通過非執(zhí)行的緩沖區(qū)來實(shí)現(xiàn),通過使被攻擊程序的數(shù)據(jù)段地址空間不可執(zhí)行,從而使得攻擊者不可能執(zhí)行被植入被攻擊程序輸入緩沖區(qū)的代碼。
2、 根據(jù)權(quán)利要求l所述的緩沖區(qū)溢出的保護(hù)方法,其特征在于 該方法在Linux系統(tǒng)中采用信號(hào)傳遞方式來實(shí)現(xiàn),Linux通過向進(jìn)程堆 棧釋放代碼然后引發(fā)中斷來執(zhí)行在堆棧中的代碼進(jìn)而實(shí)現(xiàn)向進(jìn)程發(fā)送 Unix信號(hào),非執(zhí)行緩沖區(qū)的補(bǔ)丁在發(fā)送信號(hào)的時(shí)候是允許緩沖區(qū)可執(zhí) 行的。
3、 根據(jù)權(quán)利要求l所述的緩沖區(qū)溢出的保護(hù)方法,其特征在于-該方法在Linux系統(tǒng)中采用GCC的在線重用方式來實(shí)現(xiàn),GCC在堆棧區(qū) 里放置了可執(zhí)行的代碼以便在線重用,非執(zhí)行堆棧的保護(hù)可以有效地對(duì) 付把代碼植入自動(dòng)變量的緩沖區(qū)溢出攻擊,而對(duì)于其他形式的攻擊則沒 有效果。
全文摘要
本發(fā)明涉及計(jì)算機(jī)信息的讀入讀出保護(hù)方法,特別是一種緩沖區(qū)溢出的保護(hù)方法。該方法主要通過非執(zhí)行的緩沖區(qū)來實(shí)現(xiàn),通過使被攻擊程序的數(shù)據(jù)段地址空間不可執(zhí)行,從而使得攻擊者不可能執(zhí)行被植入被攻擊程序輸入緩沖區(qū)的代碼。本發(fā)明方法主要解決現(xiàn)有的通過編寫正確的代碼來實(shí)現(xiàn)的方法不但編寫過程十分費(fèi)時(shí),而且仍然無法徹底解決緩沖區(qū)溢出的技術(shù)問題,降低了系統(tǒng)由于緩沖區(qū)溢出而被攻擊的概率。
文檔編號(hào)G06F21/22GK101350051SQ200710044020
公開日2009年1月21日 申請(qǐng)日期2007年7月19日 優(yōu)先權(quán)日2007年7月19日
發(fā)明者杰 沈, 敏 項(xiàng) 申請(qǐng)人:上海市閔行中學(xué);項(xiàng) 敏