qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

          安全性測試——Buffer overrun

          安全性測試——Buffer overrun

            什么是BO?

            BO的概念很容易理解,只需要C語言的基本知識就足夠了。申請了一段內(nèi)存,而填入的數(shù)據(jù)大于這塊內(nèi)存,填入的數(shù)據(jù)就覆蓋掉了這段內(nèi)存之外的內(nèi)存了。比如,

          void foo(char* input)
          {
          char buf[100];
          strcpy(buf, input);
          }

            沒有進行長度檢查,如果黑客通過操作input,可能重寫返回地址,從而產(chǎn)生安全性問題。

            為什么BO是一個安全問題?

            當copy的數(shù)據(jù)大于在stack聲明的buffer,導致buffer被overwritten,從而產(chǎn)生基于stack的buffer overrun。在stack聲明的變量位于函數(shù)調(diào)用者的返回地址,返回地址被攻擊者重寫,利用BO執(zhí)行惡意代碼從而控制計算機。

          X86 EBP Stack Frame
          Highest address
          Arguments
          Return address
          Previous EBP
          Saved rigisters
          local storageLowest address

            在C語言中,當調(diào)用一個函數(shù)的時候,在匯編或者機器碼的level是如何實現(xiàn)的呢?假設(shè)調(diào)上邊的函數(shù)foo的時候,程序的stack將會是下邊圖表的樣子。首先,輸入?yún)?shù)會放到棧中去,然后是這個函數(shù)執(zhí)行完的下一個指令的地址,也就是return address, 然后是EBP,再然后就是這個函數(shù)的本地變量的內(nèi)存空間。比如這個函數(shù)申請了100個字節(jié)的空間。當BO發(fā)生的時候,數(shù)據(jù)就會覆蓋掉buf之后的內(nèi)存,關(guān)鍵的部分是return address可以被覆蓋。那么黑客就可以把return address的值修改成這個buf的一個地址,比如起始地址buf[0]的地址,而這個buf里邊填入黑客自己的代碼。這樣當這個函數(shù)退出的時候,程序會執(zhí)行return address所指定的代碼,也就是黑客的代碼了。

            安全性測試

            在最高的層次上,安全漏洞發(fā)掘方法可被分為白盒、黑盒和灰盒測試方法三大類。測試者可以獲得的資源決定了這三種方法的差別。白盒測試需要使用所有可用的資源,包括源代碼,而黑盒測試只訪問軟件的輸入和觀察到的輸出結(jié)果。介于兩者之間的是灰盒測試,它在黑盒測試的基礎(chǔ)上通過對可用的二進制文件的逆向工程而獲得了額外的分析信息。

            白盒測試包括各種不同的源代碼分析方法。可以人工完成也可以通過利用自動化工具完成,這些自動化工具包括編譯時檢查器、源代碼瀏覽器或自動源代碼審核工具。

            灰盒測試定義是首先它包括了黑盒測試審核,此外還包括通過逆向工程(RE)獲得的結(jié)果,逆向工程也被稱為逆向代碼工程(RCE)。分析編譯后得到的匯編指令能夠幫助闡明類似的故事,但是要付出更多的努力。在匯編代碼層次上進行安全評估而不是在源代碼層次上進行安全評估,這種安全評估典型地被稱作二進制審核(binary auditing)。二進制審核也被稱為是一種”從里向外”的技術(shù):研究者首先識出反匯編結(jié)果中令其感興趣的可能存在的漏洞,然后反向追溯到源代碼中以確定漏洞是否可以被別人所利用。

            調(diào)試器能夠顯示應(yīng)用程序正在運行時CPU寄存器的內(nèi)容和內(nèi)存狀態(tài)。Win32平臺下的流行調(diào)試器包括OllyDbg18,其運行時的一個屏幕快照。此外還有Microsoft WinDbg(也被人稱做”wind bag”)19。WinDbg是Windows軟件調(diào)試工具包20中的一部分,可從Microsoft的網(wǎng)站上免費下載。OllyDbg是一個由Oleh Yuschuk開發(fā)的調(diào)試器,用戶友好性稍好于WinDbg。這兩個調(diào)試器都允許用戶創(chuàng)建自定制的擴展功能組件,有許多第三方插件可用于擴展OllyDbg的功能21。UNIX環(huán)境下也有各種各樣的調(diào)試器,GNU Project Debugger22(GDB)是最流行的也是最容易被移植的調(diào)試器。GDB是一個命令行調(diào)試器,許多UNIX/Linux產(chǎn)品中都包含這個調(diào)試器。

            在執(zhí)行黑盒測試時,源代碼是不可用的,通過黑盒測試來執(zhí)行。可以考慮結(jié)合模糊測試來進行。

            Fuzz Test

            Fuzz Test概念

            傳統(tǒng)的Fuzz指的是一種黑盒測試技術(shù)或隨機測試技術(shù),用來發(fā)現(xiàn)軟件的缺陷(flaws)。模糊測試是這樣的一個過程:向產(chǎn)品有意識地輸入無效數(shù)據(jù)以期望觸發(fā)錯誤條件或引起產(chǎn)品的故障。這些錯誤條件可以指導找出那些可挖掘的安全漏洞.

            1990年Miller等人發(fā)現(xiàn),通過簡單的Fuzz testing可以使運行于UNIX系統(tǒng)上的至少25%的程序崩潰;2002年Aitel通過自己設(shè)計實現(xiàn)的Fuzz工具SPIKE成功地發(fā)現(xiàn)了多個未知漏洞;安全漏洞困擾了許多流行的客戶端應(yīng)用程序,包括Microsoft的Internet Explorer、Word和Excel,它們中的許多漏洞在2006年通過模糊測試技術(shù)被發(fā)現(xiàn)。模糊測試技術(shù)的有效應(yīng)用產(chǎn)生了許多新的工具和日益廣泛的影響??梢?,F(xiàn)uzz測試在安全領(lǐng)域的重要性。

            安全性必須被融入軟件開發(fā)生命周期(SDLC),而不是到了最后才草率處理。模糊測試可以并且應(yīng)該是任何完整SDLC的一部分,不僅在測試階段需要考慮,在開發(fā)階段也同樣需要考慮。缺陷被發(fā)現(xiàn)得越及時,修補缺陷的成本就越低。

            Fuzz技術(shù)的原理

            Fuzz技術(shù)的原理簡單,基本的思想是將隨機數(shù)據(jù)作為程序的輸入,并監(jiān)視程序執(zhí)行過程中產(chǎn)生的任何異常,記錄下導致異常的輸人數(shù)據(jù),從而定位軟件中缺陷的位置。

            Fuzz 階段

            模糊測試方法的選擇依賴不同的因素,可能有很大的變化。沒有一種絕對正確的模糊測試方法。模糊測試方法的選擇完全取決于目標應(yīng)用程序、研究者的技能,以及需要測試的數(shù)據(jù)所采用的格式。然而,無論要對什么進行測試,也不論確定選擇了哪種方法,模糊測試總要經(jīng)歷幾個基本的階段。

            其中,識別輸入:幾乎所有可被人利用的漏洞都是因為應(yīng)用程序接受了用戶的輸入并且在處理輸入數(shù)據(jù)時沒有首先清除非法數(shù)據(jù)或執(zhí)行確認例程。

            經(jīng)驗介紹

            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等函數(shù)調(diào)用之前,是否有做判斷?另外,不安全調(diào)用CreateProcess()也會引起漏洞。

            借助工具如Prefast,F(xiàn)xcop等工具進行測試。

            AP測試:

            黑盒測試:

            舉例,假設(shè)Name域應(yīng)該接受一個字符串值,Age域應(yīng)該接受一個整數(shù)值。如果用戶偶然改變了兩個域的實際輸入范圍并且在Age域輸入了一個字符串后會發(fā)生什么呢?字符串值會被自動轉(zhuǎn)換為基于ASCII碼的整數(shù)值嗎?是否會顯示一條錯誤報告消息?應(yīng)用程序會崩潰嗎?借助模糊自動化測試實現(xiàn);

            也可以通過工具或源代碼檢查來進行。


          posted on 2013-07-15 10:08 順其自然EVO 閱讀(292) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄

          <2013年7月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          導航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 肥城市| 南涧| 利津县| 沙雅县| 六安市| 五常市| 永宁县| 龙门县| 武清区| 商丘市| 无极县| 日照市| 宜章县| 贺州市| 陆川县| 永善县| 社旗县| 威信县| 株洲县| 亳州市| 萝北县| 内丘县| 腾冲县| 分宜县| 博客| 贵州省| 稷山县| 晋宁县| 金沙县| 望江县| 奉贤区| 吴桥县| 绥宁县| 宁城县| 芜湖县| 广南县| 威信县| 长宁区| 个旧市| 太白县| 林口县|