黃惠烽
(四川民族學(xué)院 圖書(shū)館,四川 康定 626001)
圖書(shū)館局域網(wǎng)緩沖區(qū)溢出漏洞原理分析
黃惠烽
(四川民族學(xué)院 圖書(shū)館,四川 康定 626001)
隨著數(shù)字圖書(shū)館的發(fā)展,圖書(shū)館局域網(wǎng)的安全工作越來(lái)越受到大家的重視,近年出現(xiàn)的緩沖區(qū)溢出漏洞也成為了網(wǎng)絡(luò)攻擊中最常用、最典型的攻擊漏洞.本文通過(guò)講述緩沖區(qū)溢出漏洞的原理,介紹了預(yù)防緩沖區(qū)溢出漏洞的相關(guān)方法,使得圖書(shū)館局域網(wǎng)盡量避免緩沖區(qū)溢出漏洞的攻擊.
局域網(wǎng);緩沖區(qū)溢出漏洞;原理;預(yù)防
隨著數(shù)字圖書(shū)館的不斷發(fā)展,圖書(shū)館局域網(wǎng)的安全也越來(lái)越受到人們的重視,圖書(shū)館管理系統(tǒng)中的讀者信息、圖書(shū)借還信息、藏書(shū)目錄和電子資源數(shù)據(jù)等信息都是圖書(shū)館的核心數(shù)據(jù),一旦這些數(shù)據(jù)遭遇丟失或損壞將會(huì)嚴(yán)重影響圖書(shū)館各部門(mén)的工作,嚴(yán)重時(shí)將導(dǎo)致圖書(shū)館工作的癱瘓.因此圖書(shū)館局域網(wǎng)安全工作不容刻緩.
現(xiàn)在的很多操作系統(tǒng)和應(yīng)用軟件或多或少都存在著各種安全隱患,從UNIX到Microsoft操作系統(tǒng)無(wú)一例外,只不過(guò)是這些系統(tǒng)的漏洞被發(fā)現(xiàn)時(shí)間的早晚不同,對(duì)系統(tǒng)造成的危害程度不同而已.作為網(wǎng)絡(luò)管理員應(yīng)該熟悉這些漏洞,并掌握這些漏洞的原理還和補(bǔ)救方法.
因編程缺陷或程序設(shè)計(jì)語(yǔ)言中的問(wèn)題造成的緩沖區(qū)溢出問(wèn)題是一種廣泛存在的安全漏洞,人們對(duì)緩沖區(qū)溢出的漏洞早已有所了解,這方面的漏洞在圖書(shū)館局域網(wǎng)中也是時(shí)有發(fā)生的,但是直到近幾年,才引起了人們的重視,因此研究圖書(shū)館局域網(wǎng)中的緩沖區(qū)溢出漏洞非常必要.
緩沖區(qū)溢出英文叫Buffer overflow,它是一個(gè)非常危險(xiǎn)而又常見(jiàn)的漏洞,它能在windows、Unix等操作系統(tǒng)存在,也可以在SQL sever、日歷程序、計(jì)算器程序和游戲程序等應(yīng)用軟件中存在.1988年發(fā)生的Morris“蠕蟲(chóng)”事件就是利用緩沖區(qū)溢出漏洞的“杰作”之一,著名紅色代碼網(wǎng)絡(luò)病毒是根據(jù)微軟提供的因特網(wǎng)服務(wù)軟件IIS4.0、5.0中的一個(gè)緩沖區(qū)溢出漏洞傳播的.據(jù)統(tǒng)計(jì),緩沖區(qū)溢出漏洞占了已確認(rèn)漏洞的20%.這種漏洞被認(rèn)為是輸入驗(yàn)證漏洞的子集,輸入驗(yàn)證漏洞則幾乎占了已確認(rèn)漏洞的50%.對(duì)于軟件使用者來(lái)說(shuō),緩沖區(qū)溢出是最可怕的漏洞.它經(jīng)常會(huì)引起網(wǎng)絡(luò)蠕蟲(chóng)、有助于利用的能動(dòng)性的工具和入侵嘗試.但是,我們可以這樣說(shuō),發(fā)生緩沖區(qū)溢出的基本都是那些結(jié)構(gòu)比較差的軟件程序產(chǎn)品,它們基本上都存在一些不足之處.那么什么是緩沖區(qū)溢出呢?緩沖區(qū)溢出為什么能產(chǎn)生這么大的危害呢?
緩沖區(qū)溢出顧名思義就是緩沖區(qū)太小,裝不了足夠多的數(shù)據(jù),多出來(lái)的部分跑出來(lái)了.產(chǎn)生緩沖區(qū)溢出的主要原因是,當(dāng)向一個(gè)有限的緩沖區(qū)拷貝了過(guò)長(zhǎng)的字符串時(shí),這將導(dǎo)致過(guò)長(zhǎng)的字符串覆蓋相鄰的存儲(chǔ)單元,從而引起程序運(yùn)行失敗,個(gè)別人甚至可以惡意利用這種漏洞去執(zhí)行任意命令,取得系統(tǒng)的特權(quán),從而進(jìn)行系統(tǒng)的攻擊和破壞.
我們需要知道什么是緩沖區(qū),一般來(lái)說(shuō),緩沖區(qū)就是分配的一塊存儲(chǔ)空間,其中可以存儲(chǔ)某種類型的文本或者數(shù)據(jù).程序員利用緩沖區(qū)的一塊或多塊數(shù)據(jù)提供系統(tǒng)預(yù)先制定的空間.例如,用C語(yǔ)言編寫(xiě)程序時(shí)會(huì)經(jīng)常用到緩沖區(qū)來(lái)存放用戶輸入的姓名,程序員必須首先判斷姓名緩沖區(qū)要求有多少字符,該字段允許多少字符,或者用戶在給定的字段可以敲多少下鍵,這稱為字符緩沖區(qū)的大小.
一個(gè)程序通常由多個(gè)子程序(模塊)組成,程序規(guī)模越大,模塊就越多.當(dāng)對(duì)一個(gè)程序編譯以后,在內(nèi)存中劃分三種區(qū)域,分別存放程序代碼區(qū)、數(shù)據(jù)區(qū)和堆棧區(qū).其中程序中定義的各種變量和緩沖區(qū)存放在數(shù)據(jù)區(qū),調(diào)用子程序的返回地址存放在堆棧區(qū),當(dāng)控制從子程序返回時(shí),按照堆棧頂指示的地址返回到主控程序.
在利用C語(yǔ)言編寫(xiě)程序時(shí)一般要用到輸入函數(shù)來(lái)獲得用戶輸入的姓名.當(dāng)用戶試圖將超過(guò)緩沖區(qū)能夠處理的更多的姓名字符輸入到緩沖區(qū)時(shí),程序中如果沒(méi)有緩沖區(qū)越界檢查機(jī)制,當(dāng)超長(zhǎng)的字符串輸入后,就會(huì)產(chǎn)生緩沖區(qū)的溢出.例如,如果程序員編寫(xiě)的程序中定義:char name[15],當(dāng)輸入超過(guò)15個(gè)字節(jié)長(zhǎng)的字符串后,就會(huì)溢出字符緩沖區(qū).
在C語(yǔ)言中它是假定了緩沖區(qū)的長(zhǎng)度是足夠的,所以數(shù)組是不進(jìn)行邊界檢查的.但是實(shí)踐中往往會(huì)出現(xiàn)特殊情況,當(dāng)向局部變量拷貝了一個(gè)超過(guò)定義長(zhǎng)度的字符串時(shí),這時(shí)候其他的變量空間將會(huì)被超出的字符串所覆蓋,這時(shí)變量就會(huì)出現(xiàn)異常情況.另一種情況下,由于超出的字符串覆蓋了子程序的返回地址,子程序返回時(shí)便可能轉(zhuǎn)向一個(gè)未知的地址,從而使程序發(fā)生錯(cuò)誤.
讓我們來(lái)看看另一個(gè)例子:
這個(gè)程序的函數(shù)明顯有一個(gè)內(nèi)存緩沖區(qū)編碼錯(cuò)誤.這個(gè)函數(shù)出現(xiàn)錯(cuò)誤的主要原因,一是因?yàn)闆](méi)有進(jìn)行邊界檢查就復(fù)制了字符串,二是錯(cuò)誤地使用了strcpy()而沒(méi)有使用strncpy().所以運(yùn)行這個(gè)程序就會(huì)產(chǎn)生段錯(cuò)誤,strcpy()將*str的內(nèi)容(lars[])復(fù)制到bf[]里,到在字符串中碰到一個(gè)空字符.顯然,*s比 bf[]大得多,bf[]只有26個(gè)字節(jié),而 *s有356個(gè)字節(jié)的內(nèi)容.當(dāng)程序執(zhí)行到這個(gè)地方時(shí),bf之后的堆棧中330個(gè)字節(jié)將會(huì)全被覆蓋.當(dāng)函數(shù)返回時(shí),程序嘗試讀取返回地址的下一個(gè)指令,此時(shí)就會(huì)得到一個(gè)段錯(cuò)誤.
在網(wǎng)絡(luò)上最常見(jiàn)的是通過(guò)制造緩沖區(qū)溢出使程序運(yùn)行一個(gè)用戶shell,再通過(guò)shell執(zhí)行其它命令.如果該程序?qū)儆趓oot且有suid權(quán)限的話,攻擊者就獲得了一個(gè)有root權(quán)限的shell,可以對(duì)系統(tǒng)進(jìn)行任意操作了.在執(zhí)行溢出的電腦打開(kāi)DOS(shell).只要很簡(jiǎn)單的一段程序:
只要到這里就獲得shell了,再通過(guò)shell執(zhí)行其它命令,黑客們可以激動(dòng)地?fù)碛辛艘慌_(tái)“肉雞”,可以對(duì)這臺(tái)電腦為所欲為了.
下面我們?cè)賮?lái)看一下緩沖區(qū)溢出漏洞的攻擊過(guò)程:
首先對(duì)ROOT程序進(jìn)行試探性攻擊,然后執(zhí)行類似exec(sh)的執(zhí)行代碼來(lái)獲得具有root權(quán)限的shell.此步可再分二步走:a.植入一定的代碼到程序中b.初始化內(nèi)存和寄存器,使程序跳轉(zhuǎn)到預(yù)定的程序中去.步驟如下:
(1)植入一定的代碼到程序中.當(dāng)攻擊者輸入一個(gè)字符串到被攻擊程序時(shí),這個(gè)字符串會(huì)被放到緩沖區(qū)里去.該字符串的相關(guān)信息就成為了可以運(yùn)行的一些指令序列.在這個(gè)時(shí)候攻擊代碼就可以存放在被攻擊程序的緩沖區(qū)中去.第二種是利用已經(jīng)存在的代碼.前提是攻擊者想要的代碼已經(jīng)在被攻擊的程序中了.這時(shí)候需要完成的任務(wù)是對(duì)代碼參數(shù)的傳遞.
(2)使程序跳轉(zhuǎn)到預(yù)定的程序中去方法.當(dāng)程序沒(méi)有通過(guò)緩沖區(qū)溢出檢查時(shí),就會(huì)產(chǎn)生一個(gè)相應(yīng)的緩沖區(qū),它會(huì)影響程序的執(zhí)行順序,使得程序跳轉(zhuǎn)到一個(gè)未知的地址.
目前預(yù)防緩沖區(qū)溢出的方法有很多種,但是基本有三種基本方法:
(1)通過(guò)給操作系統(tǒng)添加補(bǔ)丁等辦法,一旦某個(gè)漏洞被廠家的補(bǔ)丁程序修補(bǔ)了,那么針對(duì)該漏洞的攻擊手段也將失效,這樣緩沖區(qū)就不能執(zhí)行,攻擊代碼就不能寫(xiě)入操作系統(tǒng).
(2)編寫(xiě)程序時(shí)要使用正確的方法,避免所拷貝的字符串長(zhǎng)度超過(guò)所定義的字符串長(zhǎng)度,保證代碼的正確性.
(3)通過(guò)編譯器作為關(guān)卡,實(shí)現(xiàn)邊界檢查,這樣可以實(shí)現(xiàn)保護(hù)緩沖區(qū)的目的,避免了緩沖區(qū)的溢出.
但是不管編寫(xiě)什么程序,做到?jīng)]有錯(cuò)誤是極其困難的,即使最仔細(xì)的復(fù)查通常也會(huì)遺漏其中一些錯(cuò)誤.開(kāi)發(fā)安全程序的最重要方法之一是最小化特權(quán).那意味著程序的各個(gè)部分應(yīng)該具有它們需要的唯一特權(quán),一點(diǎn)也不能多.這樣即使程序具有缺陷,也可能會(huì)避免將該缺陷轉(zhuǎn)化為安全事故.
緩沖區(qū)溢出漏洞問(wèn)題并不是一個(gè)新問(wèn)題,許多常見(jiàn)的工具都容易受到緩沖區(qū)溢出的攻擊.但入侵者需要很高的技巧才能實(shí)現(xiàn)緩沖區(qū)溢出的攻擊.實(shí)際上也確實(shí)很少入侵者有高超的編程知識(shí)來(lái)做到這一點(diǎn).為了防止系統(tǒng)不受到緩沖區(qū)溢出攻擊,應(yīng)該要求程序員在編程時(shí),限制緩沖區(qū)的輸入字符數(shù),使它們不超過(guò)緩沖區(qū)的定義長(zhǎng)度,這樣就不會(huì)產(chǎn)生緩沖區(qū)溢出問(wèn)題.
〔1〕Necula G C;Mc Peak S;Weimer W CCured:typesafe retrofitting of legacy code 2002.
〔2〕U Hermann Overview of pscan source package 2006.
〔3〕Z Lin;B Mao;L Xie LibsafeXP.A practical and transparent tool for run-time buffer over flow preventions 2006.
〔4〕Luk C;Cohn R;Muth R Pin:Building Customized Program Analysis Tools with Dynamic Instrumentation 2005.
〔5〕Taeho Oh.Advanced Buffer Overfiow Expioit [ EB/OL]。 http://postech.edu/ohhara,2004-09.
〔6〕Vendicator,StackShield:A stack smashing technique protection tool for Linux 2010.
〔7〕徐啟杰.基于Win32平臺(tái)的漏洞挖掘和漏洞利用技術(shù)研究[J].上海交通大學(xué)(學(xué)位論文),2007.
G250.73
A
1673-260X(2012)05-0131-02