qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問(wèn) http://qaseven.github.io/

          安全性測(cè)試——Buffer overrun

          安全性測(cè)試——Buffer overrun

            什么是BO?

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

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

            沒(méi)有進(jìn)行長(zhǎng)度檢查,如果黑客通過(guò)操作input,可能重寫返回地址,從而產(chǎn)生安全性問(wèn)題。

            為什么BO是一個(gè)安全問(wèn)題?

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

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

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

            安全性測(cè)試

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

            白盒測(cè)試包括各種不同的源代碼分析方法??梢匀斯ね瓿梢部梢酝ㄟ^(guò)利用自動(dòng)化工具完成,這些自動(dòng)化工具包括編譯時(shí)檢查器、源代碼瀏覽器或自動(dòng)源代碼審核工具。

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

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

            在執(zhí)行黑盒測(cè)試時(shí),源代碼是不可用的,通過(guò)黑盒測(cè)試來(lái)執(zhí)行??梢钥紤]結(jié)合模糊測(cè)試來(lái)進(jìn)行。

            Fuzz Test

            Fuzz Test概念

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

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

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

            Fuzz技術(shù)的原理

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

            Fuzz 階段

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

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

            經(jīng)驗(yàn)介紹

            API測(cè)試:

            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()也會(huì)引起漏洞。

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

            AP測(cè)試:

            黑盒測(cè)試:

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

            也可以通過(guò)工具或源代碼檢查來(lái)進(jìn)行。


          posted on 2013-07-15 10:08 順其自然EVO 閱讀(291) 評(píng)論(0)  編輯  收藏 所屬分類: 測(cè)試學(xué)習(xí)專欄

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

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 巨野县| 汶上县| 桦川县| 营山县| 霍邱县| 翁源县| 万宁市| 仙居县| 陆良县| 河东区| 盐城市| 濉溪县| 无为县| 西充县| 安陆市| 泗洪县| 兴安盟| 二连浩特市| 城市| 呼图壁县| 盐津县| 海南省| 平阳县| 准格尔旗| 屏边| 昭觉县| 宜城市| 丰镇市| 都江堰市| 苍梧县| 吉木萨尔县| 兴海县| 邵武市| 古蔺县| 伊通| 安泽县| 沂源县| 登封市| 西充县| 八宿县| 昌平区|