黑盒測試通常不考慮測試的路徑覆蓋問題,在測試的完整性方面存在局限,往往不能發(fā)現未執(zhí)行代碼中的漏洞。例如下面是摘自于一個服務器軟件的代碼片段:

?
此處軟件利用sscanf() API 將原始網絡數據轉換為一個整數,然后將所生成的該整數與靜態(tài)整數值3 857 106 359 進行比較,如果這2 個值不匹配,那么協議解析器就會由于一個“訪問協議錯誤”而返回。若測試用例中無此整數,則無法對跳轉后的代碼進行測試,而要想通過一般的數據變異生成包含此數的用例,所要構造的測試用例數和耗費的測試時間都是相當龐大的。為提高效率,可以根據諸如此類的代碼中的靜態(tài)整數和字符串生成相應的測試用例集。只要利用靜態(tài)代碼分析工具,查找代碼中的靜態(tài)字符串、整數和路徑分支處有關路徑選擇的比較字段,將其保存到測試數據庫。
另外還可在錯誤注入點所在的函數中搜索對不安全庫函數的調用,根據不安全庫函數易引發(fā)漏洞的類型,生成相關的測試用例集。同時還可以在動態(tài)追蹤過程中,在執(zhí)行跳轉指令前修改指定寄存器的值以到達不同路徑的代碼,從而提高了測試的代碼覆蓋率。
2.4 基于快照恢復的錯誤注入技術
現今大多數軟件為了提高自身安全性,都加強了軟件的糾錯能力和安全保護機制,會在接收外部輸入后對輸入數據進行正確和一致性檢測,甚至一些軟件還要在之前對編碼的數據進行解碼,不考慮數據格式的暴力測試在軟件對輸入數據進行的正確和一致性檢測中都會被過濾掉。而大多數協議或文件格式都非常復雜且未被公開,想要了解格式的結構或生成正確格式的文件都非常困難。為此,采用基于內存快照恢復的錯誤注入技術,以繞過軟件的檢測機制進行fuzzing測試。選用具有正確格式的輸入數據樣本以通過軟件的相關檢測函數的驗證,在執(zhí)行到真正對數據進行應用的相關解析函數時,設置錯誤注入點,保存此時進程的所有上下文內容即進程快照,接著改變調用參數為生成的測試用例,再在函數的結束處設置還原點,接著繼續(xù)運行并監(jiān)測程序的運行狀況。若無異常發(fā)生,則當程序運行到還原點時掛起進程,將進程環(huán)境恢復為錯誤注入點處保存的上下文內容,重新進行錯誤注入,直到程序發(fā)生異常或測試用例耗盡。采用這種方法還可以避免通常測試過程中的網絡延遲、重啟程序和執(zhí)行與處理輸入無關的代碼等所耗費時間,大大提高了測試效率。
3 系統的設計實現與實驗評估
用pythON 語言編寫了基于上述技術的測試工具,此工具主要由5 個模塊組成,分別為靜態(tài)逆向分析模塊、動態(tài)跟蹤模塊、測試數據生成模塊、錯誤注入模塊、異常檢測及記錄模塊。總體模塊組成如圖2 所示。

?
靜態(tài)逆向分析模塊主要是利用反匯編工具IDA Pro 來反匯編目標程序的二進制代碼,以生成相應的匯編代碼,在此基礎上利用腳本自動識別確定函數塊及其內部的基本塊,分析程序的基本結構和函數調用關系;查找代碼中的靜態(tài)字符串、整數和代碼分支處的比較字段,并搜索代碼中調用的不安全庫函數,用以建立測試用例庫。
動態(tài)跟蹤模塊在調試器的基礎上構建而成,主要負責在程序執(zhí)行期間動態(tài)監(jiān)測輸入函數的調用,以確定輸入數據的內存位置;接著跟蹤輸入數據的流向和使用,在輸入數據被讀寫時記錄操作函數,以確定錯誤注入點。
測試數據生成模塊主要負責根據靜態(tài)逆向分析模塊提供的分析查找結果自動建立測試用例庫,并利用測試用例庫在測試過程中自動生成測試用例。
錯誤注入模塊主要負責自動將測試數據生成模塊生成的測試用例注入到程序進程中。在程序運行到錯誤注入點時,保存錯誤注入前的進程快照,修改輸入數據所在的地址指針;在執(zhí)行到還原點時,恢復之前保存的進程快照,重新進行錯誤注入。
異常檢測記錄模塊主要負責通過監(jiān)測程序的異常報錯,尋找軟件存在的問題。要記錄分析的部分包括:(1)異常的類型:運算錯誤,標準輸入/輸出錯誤,內存訪問錯誤,系統APIs 調用錯誤,一般運行時錯誤,語法錯誤,應用程序不可預知的崩潰等。(2)錯誤記錄:系統自身的錯誤記錄,可執(zhí)行程序的錯誤記錄。(3)出錯時各個寄存器值和其他環(huán)境變量的值,以及程序的返回值。
選取一款小型代理服務器軟件Polipo 作為測試對象,驗證該動態(tài)輸入追蹤方法的有效性。用系統動態(tài)跟蹤服務器進程接收來自遠程client 的http 請求,針對處理請求消息中各字段的處理函數生成測試用例并注入進行fuzzing。當生成測試用例的Content-Length 字段值為一個極大整數時,檢測到發(fā)生內存非法訪問異常,服務器隨即崩潰。通過調試器調試軟件發(fā)現Polipo 的client.c 文件中httpClientDiscardBody()函數存在符號錯誤,當遠程用戶提交帶有超長Content-Length頭的http 請求會產生整數溢出,進而導致服務崩潰,從而驗證了該漏洞的存在。
4 結束語
本文在基于反匯編的輸入路徑追蹤技術的基礎上,結合基于代碼覆蓋的測試數據生成和基于快照恢復的錯誤注入技術,將其應用于fuzzing 測試中,提出了一種軟件安全漏洞自動挖掘的新方法。該方法較好地解決了fuzzing 技術存在的測試數據空間巨大、代碼覆蓋不完整和測試效率低等問題,且無需目標軟件源代碼,因而應用范圍較廣。基于此方法設計并實現了一個測試系統,通過對實例軟件的漏洞挖掘實驗,驗證了該方法的有效性。下一步工作主要為對輸入路徑的追蹤細化為針對指令級的追蹤,以進一步提高動態(tài)追蹤的精確性和可靠性。
電子發(fā)燒友App






評論