黃惠烽
(四川民族學院 圖書館,四川 康定 626001)
圖書館局域網緩沖區溢出漏洞原理分析
黃惠烽
(四川民族學院 圖書館,四川 康定 626001)
隨著數字圖書館的發展,圖書館局域網的安全工作越來越受到大家的重視,近年出現的緩沖區溢出漏洞也成為了網絡攻擊中最常用、最典型的攻擊漏洞.本文通過講述緩沖區溢出漏洞的原理,介紹了預防緩沖區溢出漏洞的相關方法,使得圖書館局域網盡量避免緩沖區溢出漏洞的攻擊.
局域網;緩沖區溢出漏洞;原理;預防
隨著數字圖書館的不斷發展,圖書館局域網的安全也越來越受到人們的重視,圖書館管理系統中的讀者信息、圖書借還信息、藏書目錄和電子資源數據等信息都是圖書館的核心數據,一旦這些數據遭遇丟失或損壞將會嚴重影響圖書館各部門的工作,嚴重時將導致圖書館工作的癱瘓.因此圖書館局域網安全工作不容刻緩.
現在的很多操作系統和應用軟件或多或少都存在著各種安全隱患,從UNIX到Microsoft操作系統無一例外,只不過是這些系統的漏洞被發現時間的早晚不同,對系統造成的危害程度不同而已.作為網絡管理員應該熟悉這些漏洞,并掌握這些漏洞的原理還和補救方法.
因編程缺陷或程序設計語言中的問題造成的緩沖區溢出問題是一種廣泛存在的安全漏洞,人們對緩沖區溢出的漏洞早已有所了解,這方面的漏洞在圖書館局域網中也是時有發生的,但是直到近幾年,才引起了人們的重視,因此研究圖書館局域網中的緩沖區溢出漏洞非常必要.
緩沖區溢出英文叫Buffer overflow,它是一個非常危險而又常見的漏洞,它能在windows、Unix等操作系統存在,也可以在SQL sever、日歷程序、計算器程序和游戲程序等應用軟件中存在.1988年發生的Morris“蠕蟲”事件就是利用緩沖區溢出漏洞的“杰作”之一,著名紅色代碼網絡病毒是根據微軟提供的因特網服務軟件IIS4.0、5.0中的一個緩沖區溢出漏洞傳播的.據統計,緩沖區溢出漏洞占了已確認漏洞的20%.這種漏洞被認為是輸入驗證漏洞的子集,輸入驗證漏洞則幾乎占了已確認漏洞的50%.對于軟件使用者來說,緩沖區溢出是最可怕的漏洞.它經常會引起網絡蠕蟲、有助于利用的能動性的工具和入侵嘗試.但是,我們可以這樣說,發生緩沖區溢出的基本都是那些結構比較差的軟件程序產品,它們基本上都存在一些不足之處.那么什么是緩沖區溢出呢?緩沖區溢出為什么能產生這么大的危害呢?
緩沖區溢出顧名思義就是緩沖區太小,裝不了足夠多的數據,多出來的部分跑出來了.產生緩沖區溢出的主要原因是,當向一個有限的緩沖區拷貝了過長的字符串時,這將導致過長的字符串覆蓋相鄰的存儲單元,從而引起程序運行失敗,個別人甚至可以惡意利用這種漏洞去執行任意命令,取得系統的特權,從而進行系統的攻擊和破壞.
我們需要知道什么是緩沖區,一般來說,緩沖區就是分配的一塊存儲空間,其中可以存儲某種類型的文本或者數據.程序員利用緩沖區的一塊或多塊數據提供系統預先制定的空間.例如,用C語言編寫程序時會經常用到緩沖區來存放用戶輸入的姓名,程序員必須首先判斷姓名緩沖區要求有多少字符,該字段允許多少字符,或者用戶在給定的字段可以敲多少下鍵,這稱為字符緩沖區的大小.
一個程序通常由多個子程序(模塊)組成,程序規模越大,模塊就越多.當對一個程序編譯以后,在內存中劃分三種區域,分別存放程序代碼區、數據區和堆棧區.其中程序中定義的各種變量和緩沖區存放在數據區,調用子程序的返回地址存放在堆棧區,當控制從子程序返回時,按照堆棧頂指示的地址返回到主控程序.
在利用C語言編寫程序時一般要用到輸入函數來獲得用戶輸入的姓名.當用戶試圖將超過緩沖區能夠處理的更多的姓名字符輸入到緩沖區時,程序中如果沒有緩沖區越界檢查機制,當超長的字符串輸入后,就會產生緩沖區的溢出.例如,如果程序員編寫的程序中定義:char name[15],當輸入超過15個字節長的字符串后,就會溢出字符緩沖區.
在C語言中它是假定了緩沖區的長度是足夠的,所以數組是不進行邊界檢查的.但是實踐中往往會出現特殊情況,當向局部變量拷貝了一個超過定義長度的字符串時,這時候其他的變量空間將會被超出的字符串所覆蓋,這時變量就會出現異常情況.另一種情況下,由于超出的字符串覆蓋了子程序的返回地址,子程序返回時便可能轉向一個未知的地址,從而使程序發生錯誤.
讓我們來看看另一個例子:


這個程序的函數明顯有一個內存緩沖區編碼錯誤.這個函數出現錯誤的主要原因,一是因為沒有進行邊界檢查就復制了字符串,二是錯誤地使用了strcpy()而沒有使用strncpy().所以運行這個程序就會產生段錯誤,strcpy()將*str的內容(lars[])復制到bf[]里,到在字符串中碰到一個空字符.顯然,*s比 bf[]大得多,bf[]只有26個字節,而 *s有356個字節的內容.當程序執行到這個地方時,bf之后的堆棧中330個字節將會全被覆蓋.當函數返回時,程序嘗試讀取返回地址的下一個指令,此時就會得到一個段錯誤.
在網絡上最常見的是通過制造緩沖區溢出使程序運行一個用戶shell,再通過shell執行其它命令.如果該程序屬于root且有suid權限的話,攻擊者就獲得了一個有root權限的shell,可以對系統進行任意操作了.在執行溢出的電腦打開DOS(shell).只要很簡單的一段程序:

只要到這里就獲得shell了,再通過shell執行其它命令,黑客們可以激動地擁有了一臺“肉雞”,可以對這臺電腦為所欲為了.
下面我們再來看一下緩沖區溢出漏洞的攻擊過程:
首先對ROOT程序進行試探性攻擊,然后執行類似exec(sh)的執行代碼來獲得具有root權限的shell.此步可再分二步走:a.植入一定的代碼到程序中b.初始化內存和寄存器,使程序跳轉到預定的程序中去.步驟如下:
(1)植入一定的代碼到程序中.當攻擊者輸入一個字符串到被攻擊程序時,這個字符串會被放到緩沖區里去.該字符串的相關信息就成為了可以運行的一些指令序列.在這個時候攻擊代碼就可以存放在被攻擊程序的緩沖區中去.第二種是利用已經存在的代碼.前提是攻擊者想要的代碼已經在被攻擊的程序中了.這時候需要完成的任務是對代碼參數的傳遞.
(2)使程序跳轉到預定的程序中去方法.當程序沒有通過緩沖區溢出檢查時,就會產生一個相應的緩沖區,它會影響程序的執行順序,使得程序跳轉到一個未知的地址.
目前預防緩沖區溢出的方法有很多種,但是基本有三種基本方法:
(1)通過給操作系統添加補丁等辦法,一旦某個漏洞被廠家的補丁程序修補了,那么針對該漏洞的攻擊手段也將失效,這樣緩沖區就不能執行,攻擊代碼就不能寫入操作系統.
(2)編寫程序時要使用正確的方法,避免所拷貝的字符串長度超過所定義的字符串長度,保證代碼的正確性.
(3)通過編譯器作為關卡,實現邊界檢查,這樣可以實現保護緩沖區的目的,避免了緩沖區的溢出.
但是不管編寫什么程序,做到沒有錯誤是極其困難的,即使最仔細的復查通常也會遺漏其中一些錯誤.開發安全程序的最重要方法之一是最小化特權.那意味著程序的各個部分應該具有它們需要的唯一特權,一點也不能多.這樣即使程序具有缺陷,也可能會避免將該缺陷轉化為安全事故.
緩沖區溢出漏洞問題并不是一個新問題,許多常見的工具都容易受到緩沖區溢出的攻擊.但入侵者需要很高的技巧才能實現緩沖區溢出的攻擊.實際上也確實很少入侵者有高超的編程知識來做到這一點.為了防止系統不受到緩沖區溢出攻擊,應該要求程序員在編程時,限制緩沖區的輸入字符數,使它們不超過緩沖區的定義長度,這樣就不會產生緩沖區溢出問題.
〔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平臺的漏洞挖掘和漏洞利用技術研究[J].上海交通大學(學位論文),2007.
G250.73
A
1673-260X(2012)05-0131-02