安全性測試——Buffer overrun
什么是BO?
BO的概念很容易理解,只需要C語言的基本知識就足夠了。申請了一段內存,而填入的數據大于這塊內存,填入的數據就覆蓋掉了這段內存之外的內存了。比如,
void foo(char* input) { char buf[100]; strcpy(buf, input); } |
沒有進行長度檢查,如果黑客通過操作input,可能重寫返回地址,從而產生安全性問題。
為什么BO是一個安全問題?
當copy的數據大于在stack聲明的buffer,導致buffer被overwritten,從而產生基于stack的buffer overrun。在stack聲明的變量位于函數調用者的返回地址,返回地址被攻擊者重寫,利用BO執行惡意代碼從而控制計算機。
X86 EBP Stack Frame Highest address Arguments Return address Previous EBP Saved rigisters local storageLowest address |
在C語言中,當調用一個函數的時候,在匯編或者機器碼的level是如何實現的呢?假設調上邊的函數foo的時候,程序的stack將會是下邊圖表的樣子。首先,輸入參數會放到棧中去,然后是這個函數執行完的下一個指令的地址,也就是return address, 然后是EBP,再然后就是這個函數的本地變量的內存空間。比如這個函數申請了100個字節的空間。當BO發生的時候,數據就會覆蓋掉buf之后的內存,關鍵的部分是return address可以被覆蓋。那么黑客就可以把return address的值修改成這個buf的一個地址,比如起始地址buf[0]的地址,而這個buf里邊填入黑客自己的代碼。這樣當這個函數退出的時候,程序會執行return address所指定的代碼,也就是黑客的代碼了。
安全性測試
在最高的層次上,安全漏洞發掘方法可被分為白盒、黑盒和灰盒測試方法三大類。測試者可以獲得的資源決定了這三種方法的差別。白盒測試需要使用所有可用的資源,包括源代碼,而黑盒測試只訪問軟件的輸入和觀察到的輸出結果。介于兩者之間的是灰盒測試,它在黑盒測試的基礎上通過對可用的二進制文件的逆向工程而獲得了額外的分析信息。
白盒測試包括各種不同的源代碼分析方法??梢匀斯ね瓿梢部梢酝ㄟ^利用自動化工具完成,這些自動化工具包括編譯時檢查器、源代碼瀏覽器或自動源代碼審核工具。
灰盒測試定義是首先它包括了黑盒測試審核,此外還包括通過逆向工程(RE)獲得的結果,逆向工程也被稱為逆向代碼工程(RCE)。分析編譯后得到的匯編指令能夠幫助闡明類似的故事,但是要付出更多的努力。在匯編代碼層次上進行安全評估而不是在源代碼層次上進行安全評估,這種安全評估典型地被稱作二進制審核(binary auditing)。二進制審核也被稱為是一種”從里向外”的技術:研究者首先識出反匯編結果中令其感興趣的可能存在的漏洞,然后反向追溯到源代碼中以確定漏洞是否可以被別人所利用。
調試器能夠顯示應用程序正在運行時CPU寄存器的內容和內存狀態。Win32平臺下的流行調試器包括OllyDbg18,其運行時的一個屏幕快照。此外還有Microsoft WinDbg(也被人稱做”wind bag”)19。WinDbg是Windows軟件調試工具包20中的一部分,可從Microsoft的網站上免費下載。OllyDbg是一個由Oleh Yuschuk開發的調試器,用戶友好性稍好于WinDbg。這兩個調試器都允許用戶創建自定制的擴展功能組件,有許多第三方插件可用于擴展OllyDbg的功能21。UNIX環境下也有各種各樣的調試器,GNU Project Debugger22(GDB)是最流行的也是最容易被移植的調試器。GDB是一個命令行調試器,許多UNIX/Linux產品中都包含這個調試器。
在執行黑盒測試時,源代碼是不可用的,通過黑盒測試來執行。可以考慮結合模糊測試來進行。
Fuzz Test
Fuzz Test概念
傳統的Fuzz指的是一種黑盒測試技術或隨機測試技術,用來發現軟件的缺陷(flaws)。模糊測試是這樣的一個過程:向產品有意識地輸入無效數據以期望觸發錯誤條件或引起產品的故障。這些錯誤條件可以指導找出那些可挖掘的安全漏洞.
1990年Miller等人發現,通過簡單的Fuzz testing可以使運行于UNIX系統上的至少25%的程序崩潰;2002年Aitel通過自己設計實現的Fuzz工具SPIKE成功地發現了多個未知漏洞;安全漏洞困擾了許多流行的客戶端應用程序,包括Microsoft的Internet Explorer、Word和Excel,它們中的許多漏洞在2006年通過模糊測試技術被發現。模糊測試技術的有效應用產生了許多新的工具和日益廣泛的影響??梢?,Fuzz測試在安全領域的重要性。
安全性必須被融入軟件開發生命周期(SDLC),而不是到了最后才草率處理。模糊測試可以并且應該是任何完整SDLC的一部分,不僅在測試階段需要考慮,在開發階段也同樣需要考慮。缺陷被發現得越及時,修補缺陷的成本就越低。
Fuzz技術的原理
Fuzz技術的原理簡單,基本的思想是將隨機數據作為程序的輸入,并監視程序執行過程中產生的任何異常,記錄下導致異常的輸人數據,從而定位軟件中缺陷的位置。
Fuzz 階段
模糊測試方法的選擇依賴不同的因素,可能有很大的變化。沒有一種絕對正確的模糊測試方法。模糊測試方法的選擇完全取決于目標應用程序、研究者的技能,以及需要測試的數據所采用的格式。然而,無論要對什么進行測試,也不論確定選擇了哪種方法,模糊測試總要經歷幾個基本的階段。
其中,識別輸入:幾乎所有可被人利用的漏洞都是因為應用程序接受了用戶的輸入并且在處理輸入數據時沒有首先清除非法數據或執行確認例程。
經驗介紹
API測試:
Memory Boundary Test for GetPluginVersion:
Buffer is bigger than needed Buffer;
content is setted to be 0xFF before calling the fuction
Input buffer with sizeWChar is bigger than the actual value
Expected Results:The lower bytes of the buffer is the actual vertion information,and other bytes is the setted 0xFF before calling the fuction.
閱讀源代碼,也可以查找這類Bug,如查看Strcpy,memcopy等函數調用之前,是否有做判斷?另外,不安全調用CreateProcess()也會引起漏洞。
借助工具如Prefast,Fxcop等工具進行測試。
AP測試:
黑盒測試:
舉例,假設Name域應該接受一個字符串值,Age域應該接受一個整數值。如果用戶偶然改變了兩個域的實際輸入范圍并且在Age域輸入了一個字符串后會發生什么呢?字符串值會被自動轉換為基于ASCII碼的整數值嗎?是否會顯示一條錯誤報告消息?應用程序會崩潰嗎?借助模糊自動化測試實現;
也可以通過工具或源代碼檢查來進行。