2010年9月25日 星期六

應用程式模糊測試


模糊測試工具適用的時機

  • 要尋找某些會被攻擊的缺陷,但不是全部
  • 使用相同協定時,在多種軟體中尋找缺陷
  • 迅速地測試原始碼被關閉的軟體,而不去檢視原始碼或二進碼
  • 簡單地自動化
  • 簡單地平行化
  • 使用依賴協定與檔案類型但獨立於軟體的某些東西


模糊測試工具不適用的時機

  • 尋找軟體品時的信心度
  • 達成程式碼的涵蓋程度
  • 取得品質的統計數據
  • 測試多重條件的案例


選擇模糊測試工具的條件

  • 撰寫模糊測試工具的時間與發現的缺陷之間取得最好的比例


發現缺陷數量主要依靠

  • 模糊測試工具遵循協定標準的能力(確保資訊會被處理,而不會被視為無效而丟棄)
  • 模糊字串/值(fuzz string/value)或payload的品質(亦即,我們正餵進應用程式的東西)
:要確保符合協定標準,模糊測試工具必須遵守基本的有效性檢查(validity check),像是payload尺寸、校驗和、和雜湊值,即使最簡單的協定都有尺寸和校驗和,如果這些檢查未被遵循,那請求或payload會被應用程式的第一層視為無效而丟棄,而且只能提供非常小的程式碼涵蓋度。這是基於區塊(block-based)之模糊測試工具優於其他模糊工具的地方,因為他能處理子資訊,並且在正確的地方放置正確的尺寸值與校驗和

模糊字串/值的品質是關鍵,好的模糊字串/值可以觸發其他測試案例不會觸發的缺陷,一組良好的測試案例至少應該能夠包含這些缺陷
  • 緩衝區溢流(buffer overflow)
  • 格式字串(format string)
  • 目錄橫跨(directory traversal)
  • 有號/無號值(例如,負的payload尺寸,巨大的值)
  • 跨網站指令稿(cross-site scripting)
  • 注入(injection,例如,命令注入,SQL注入)
  • 整數溢流(integer overflow)


基於區塊的模糊測試工具(block-based fuzzer)

  • Spike為此類模糊測試工具
  • 允許用戶建立基於區塊之模式表現協定或檔案格式的框架
  • 工具將根據值的類型(協定的配置)模糊測試每個區塊
  • 對於複雜的二進制協定運作得很好,多重一致性檢查(consistency check)在資料處理前先被完成
基於區塊的優點
  • 容易控制你想要攻擊的東西
  • 能夠根據值的類型針對特定攻擊類型(例如,指針對某種尺寸的Int攻擊)
  • 對校驗和與尺寸值運作得很好
  • 時間足夠的情況下,幾乎可以實做任何協定
基於區塊的缺點
  • 需要花時間開發新協定的配置
  • 很難涵蓋協定的所有狀況
  • 逆轉檔案格式之協定非常費時


Riot

  • 不支援區塊,只能運作在最簡單的協定上
  • 透過在ASCII串流中檢測自然分割字元(諸如CR、@、.、&、空白、跳格、/、\)而運作,它會對兩個自然分割字元之間的字串,使用模糊字串進行替換
Riot的優點
  • 很快能夠適應新協定
  • 提供良好的涵蓋度
  • 非常容易實作
  • 可以從封包補捉物自動建立模糊測試器
  • 可置於內部作為看不見的代理人
Riot的缺點
  • 只能在ASCII協定上運作
  • 假如有一個校驗和或尺寸存在於payload就會變得很沒用


Flipper

  • 為bit-flipper的簡稱
  • 主用被用來涵蓋二進制協定或檔案
  • 基於以下假設:檔案標頭(包含函式呼叫編號、尺寸、引數的數量、payload的尺寸、旗標等資訊)或協定包含影響程式行為的大多數資訊
  • 要保持檔案的最大一制性,bit-flipper重新發送基礎通訊,同時一次只調整一個位元
Flipper的優點
  • 容易實作
  • 對二進制協定或檔案有效
  • 可置於內部作為代理人
Flipper的缺點
  • 不易達成程式碼的涵蓋度
  • 假如效驗和的值存在則不合適
  • 對基於字串的協定完全無用


Inline Fault Injection(行內錯誤注入)

  • 非真正的模糊測試工具,差別在於模糊測試工具將自己限制在程式進入點(entry point)(檔案、網路、或環境變數),fault Injection試圖產生隨機錯誤以便找出缺陷,或者測試程式的錯誤處理/回覆機制
  • 大多數的fault Injection軟體運作在某種沙箱(sanbox)中,可能的Fault Injection從網路資料損壞(random fault Injection)到syscall輸出損壞都可
  • 即使fault Injection找到缺陷,不保證有效的測試案例會確認可攻擊的條件存在,而一般的模糊測試工具則提供觸發例外(exception)或失敗(crash)的輸入資料組
  • fault Injection適合搭配其他追蹤器(tracer)一起使用,作為可靠度或錯誤回覆的測試工具
Fault Injection的優點
  • 如果實做的很好,可提供優於其他模糊測試工具的涵蓋度
  • 快速地測試,因為它通常掛勾DLL和syscall來注入錯誤,不需要每次通過整個傳輸層(transport layer)
  • 有整合的應用程式存在
Fault Injection的缺點
  • 不用真實的資料流卻可以尋找缺陷
  • 不是安全防護導向,而是容錯導向
  • 某些fault Injection只奠基於隨機位元調整,不提供code resistance的保證


建立網路模糊測試平台

  • 由客戶端、伺服器/目標、模糊測試工具組成
  • 通常以代理或橋接模式在客戶端和伺服器端之間設置模糊測試工具
  • 讓模糊測試工具能夠在本期程(session)和欺騙(spoof)期間收集所有的傳輸的通訊,並且讓模糊測試工具本身作為有效的客戶端
  • 使用具有兩個介面的系統的士比較合適的,一個為了測試模糊工具的網路,一個為了管理和收集紀錄
  • 為紀錄輸出與偵錯使用獨立的Ethernet網卡,或甚至是串列匯流排(serial bus)
客戶端
  • 具有一張網卡連接到模糊測試工具的機器
  • 讓所有的應用程式可以存取伺服器,好讓有效的通訊被建立
模糊測試工具
  • 讓硬體能夠把來自客戶端的交通流量傳送給伺服器,因此,擁有兩張網卡
  • 安裝像是網路分析器的工具(例如,tcpdump、Wireshark、tcpreplay、tcpflow、Netcat),讓它能夠捕捉、分析、重新發送交通流量
  • 為攻擊加密與模糊測試工具框架準備編密工具組(諸如OpenSSL或stunnel)
  • li>擁有一個以上的框架,以便包含多種情況(例如,基於區塊的模糊測試工具、位元調整、動態修改)
伺服器/目標
  • 安裝適合的工具以便進行分析、追蹤、量化系統行為
  • 需要追蹤紀錄器(tracer)(例如,ktrace或ptrace),以及錯誤監視器(fault monitor);這些工具可始收集大量的資訊時,不會在嚴重缺現出現時停止,就像偵錯器(debug)一樣
  • 以手動方式檢視令人關注的狀況時,諸如SoftICE、GDB、OllyDbg、WinDbg之類的工具對第二階段的分析很有好處
  • 載入debug symbol(偵錯符號),可以提升偵錯器的使用性
  • 要安置在高階測試平台上的其他工具包括記憶體側寫器(memory profiler)和涵蓋度工具(coverage tool),像是Purify,TrueCoverage、BoundsChecker之類的工具,在測試平台上試圖盡可能完整地執行測試
資料出處:O'REILLY 防駭超級工具

沒有留言:

張貼留言