模糊測試的定義
模糊測試定義為“通過嚮應用提供非預期的輸入並監控輸出中的異常來發現軟體中的故障(faults)的方法”。 典型而言,模糊測試利用自動化或是半自動化的方法重複地嚮應用提供輸入。顯然,上述定義相當寬泛,但這個定義闡明瞭模糊測試的基本概念。
用於模糊測試的模糊測試器(fuzzer)分為兩類:
一類
是基於變異(mutation-based)的模糊測試器,這一類測試器通過對已有的資料樣本進行變異來建立 測試用例;
而另一類
是基於生成(generation-based)的模糊測試器,該類測試器為被測系統使用的協議或是檔案格式建模,基於模型生成輸入並據此建立測試用例。這兩種模糊測試器各有其優缺點。
如果你是模糊測試的新手,可以將模糊測試類比成如何闖進一所房子。假設你不幸丟了工作,不得不以犯罪為生,現在你想要破門進入一所房子。 如果採用純白盒測試的方法,你需要在破門前得到房子的所有相關資訊,包括房子的藍圖(blueprints),房子的鎖的生產廠家、房子的建築材料等。顯然,白盒測試放在這種情況下有獨特的好處,但也並非萬無一失。應用白盒測試方法,你需要對房子進行靜態分析而不是進行執行時(實際進入房子時)檢查。例如,通過靜態分析你發現這所房子起居室的側面窗戶有一個漏洞,可以把窗戶打碎進入房子。但你肯定沒辦法預見到你進入後的事情,也許當你進入以後,發現憤怒的房主正在屋裡拿著槍等你。 另外,你可以採用黑盒測試方法來進入這所房子。採用黑盒測試方法,你可以在黑暗的掩護下接近房子,悄悄測試所有的門和窗戶,向房子內窺視以決定最好的突破口。但是,如果你最終選擇使用模糊測試方法進入這所房子,你可以既不用研究房子的藍圖、也不用手工嘗試所有那些鎖,只需要選擇一種武器並讓進入房子的過程完全自動化——這就是強制安全漏洞發現方法的威力!
模糊測試各階段
採用何種模糊測試方法取決於眾多因素。沒有所謂的一定正確的模糊測試方法,決 定採用何種模糊測試方法完全依賴於被測應用、測試者擁有的技能、以及被進行模糊測 試的資料的格式。但是,不論對什麼應用進行模糊測試,不論採用何種模糊測試方法, 模糊測試執行過程都包含相同的幾個基本階段。
1.確定測試目標
只有有了明確的測試目標後,我們才能決定使用的模糊測試工具或方法。如果要在安全審計中對一個完全由內部開發的應用進行模糊測試,測試目標的選擇必須小心謹慎。但如果是要在第三方應用中找到安全漏洞,測試目標的選擇就更加靈活。要決定第三方應用模糊測試的測試目標,首先需要參考該第三方應用的供應商曆史上曾出現過的安全漏洞。在一些典型的安全漏洞聚合網站如 SecurityFocus 18 和 Secunia 19 上可以查詢到主要軟體供應商曆史上曾出現過的安全漏洞。如果某個供應商的歷史記錄很差,很可能意味著這個供應商的程式碼實踐 (code practice)能力很差,他們的產品有仍有很大可能存在未被發現的安全漏洞。除應用程式外,應用包含的特定檔案或庫也可以是測試目標。 如果需要選擇應用包含的特定檔案或者庫作為測試目標,你可以把注意力放在多個應用程式之間共享的那些二進位制程式碼上。因為如果這些共享的二進位制程式碼中存在安全漏洞,將會有非常多的使用者受到影響,因而風險也更大。
2.確定輸入向量
幾乎所有可被利用的安全漏洞都是因為應用沒有對使用者的輸入進行校驗或是進行必要的非法輸入處理。是否能找到所有的輸入向量(input vector)是模糊測試能否成功的關鍵。如果不能準確地找到輸入向量,或是不能找到預期的輸入值,模糊測試的作用就會受到很大的侷限。有些輸入向量是顯而易見的,有些則不然。尋找輸入向量的原則是:從客戶端向目標應用傳送的任何東西,包括頭(headers)、檔名(file name)、環 境變數(environment variables),登錄檔鍵(registry keys),以及其他資訊,都應該被看做是輸入向量。所有這些輸入向量都可能是潛在的模糊測試變數。
3.生成模糊測試資料
一旦識別出輸入向量,就可以依據輸入向量產生模糊測試資料了。究竟是使用預先確定的值、使用基於存在的資料通過變異生成的值、還是使用動態生成的值依賴於被測應用及其使用的資料格式。但是,無論選擇哪種方式,都應該使用自動化過程來生成資料。
4.執行模糊測試資料
該步驟緊接上一個步驟,正是在這個步驟,“模糊測試”變成了動詞。在該步驟中,一般會向被測目標傳送資料包、開啟檔案、或是執行被測應用。同上一個步驟一樣,這個步驟必須是自動化的。否則,我們就不算是真正在開展模糊測試。
5.監視異常
一個重要但經常容易被忽略的步驟是對異常和錯誤進行監控。設想我們在進行一次模糊測試,在測試中,我們向被測的 Web 伺服器傳送了 10000 個資料包,最終導致了伺服器崩潰。但伺服器崩潰後,我們卻怎麼也找不到導致伺服器崩潰的資料包了。如果這種事真的發生了,我們只能說這個測試毫無價值。模糊測試需要根據被測應用和所決定採用的模糊測試型別來設定各種形式的監視。
6.判定發現的漏洞是否可能被利用
如果在模糊測試中發現了一個錯誤,依據審計的目的,可能需要判定這個被發現的錯誤是否是一個可被利用的安全漏洞。這種判定過程是典型的手工過程,需要操作者具有特定的安全知識。這個步驟不一定要由模糊測試的執行者來進行,也可以交給其他人來進行。