從軟件質量說起
隨著信息技術的發展,計算機軟件已逐步滲透到社會生活的方方面面,可以說目前是一個軟件定義世界,軟件定義服務,軟件定義硬件的時代。
軟件正在爆發式的增長,隨之而來的軟件質量問題也大大影響著我們的生活。比如新聞報道中出現的一輛新能源汽車出現剎車失靈,撞在樹上等問題,其實都是軟件質量問題導致的。新能源汽車的代碼現在大概有3-4億行,以后很可能會變成10億行以上,依靠人力讀完所有代碼的可能性幾乎沒有。所以,我們勢必需要以特定的軟件測試方式去盡量避免因軟件質量問題而引起的安全性、穩定性問題。
認識軟件缺陷與漏洞
軟件缺陷是影響軟件質量的關鍵因素,同時它也是軟件開發過程中不可避免的。軟件缺陷也叫bug,指計算機軟件或程序存在某種破壞正常運行能力的問題、錯誤,或者隱藏的功能缺陷。
據統計,在軟件開發中約有42%的經費用于投入與軟件缺陷相關的工作,而在維護階段發現bug的成本是開發階段發現bug的100倍。由此可見,使用更先進的測試技術及工具盡快、盡早地發現軟件的bug,將非常有利于降低開發成本、提升軟件安全質量。
在軟件缺陷中,有一種類型正逐步受到廣泛的關注和重視,即軟件漏洞。它是程序中可以被攻擊利用的缺陷,也被稱為軟件安全性缺陷。經常被提及的有:已知漏洞、未知漏洞和0-day漏洞,我們可以通過下圖來說明。
發現缺陷的方法
當今軟件無處不在,那么應該如何去發現軟件缺陷呢?當下我們可使用白盒、黑盒和灰盒測試技術來發現軟件缺陷。
簡單來說,黑盒測試可將被測程序看做是個黑盒子,我們看不到它里面做了些什么,只能通過輸入輸出看是否能得到我們所需的來測試。白盒測試可以當盒子是透明的,里面的一切我們都看得清楚,從而我們可以通過測內部結構來進行測試。而灰盒測試介于白盒和黑盒之間,不僅關注輸入輸出,還關注目標內部狀態。
與眾不同的智能模糊測試
模糊測試作為一種測試技術,其概念的提出最早可以追溯到 1989 年。但從模糊測試到智能模糊測試,其技術發展經歷一段歷程。早期的模糊測試技術主要以黑盒模糊測試技術為主,它具備簡單、直接、粗暴的特點,但效率十分低下。隨著人工智能技術的發展2014年后智能模糊測試進入高速發展的階段,結合機器學習的灰盒模糊測試技術成為了主流。灰盒模糊測試通過源代碼插樁等技術捕捉程序控制流信息,并通過控制流信息的變化來選取優異種子進行變異,因此測試效果要遠高于黑盒模糊測試。
由于模糊測試技術的成熟與發展,國內外也紛紛出現一批商業化的公司可提供成熟的模糊測試產品,并逐步進入各個領域。國外如美國公司ForAllSecure、以色列公司Fuzzit。國內如安般科技,是國內首家將智能模糊測試技術商業化的公司,旗下多款智能模糊測試工具已應用到了國防軍工、軟件測評中心、汽車等多個行業領域。
什么是模糊測試?
作為當今熱門的測試技術,模糊測試是一種自動化的測試技術,它會根據一定的規則自動或半自動地生成隨機數據,然后將這些產生的隨機數據輸入到動態運行的被測程序入口,同時監控被測程序是否有異常情況出現,如系統崩潰、斷言失敗等來發現軟件的缺陷。
模糊測試技術可發現那些使程序運行異常的缺陷,同時它也特別適合發現未知/0-day漏洞。
模糊測試僅僅是隨機嗎?
看到這里,有人會問這不就是隨機數自動化測試嗎?怎么就叫模糊測試了呢?
隨機測試中最著名的例子就是Android的Monkey Test(猴子測試)。其思想就是模擬猴子毫無邏輯的操作,以此來測試手機軟件的健壯性。但它只是測試用戶界面上的隨機操作,有些深層次、底層的問題是很難發現的,如通訊協議的缺陷。
比較起來,模糊測試用例的變異,是建立在一定的規則上的隨機,用例生成有如下兩種算法:
基于生成:根據協議或接口規范進行建模,由模型直接生成新的測試用例。我們知道某些程序是無法接收非結構化的輸入的,因為它對輸入有嚴格的規則,例如協議規范、SQL語句。因此測試引擎在測試前需要預先學習相應的語法、語義規則,對其進行建模,并在此基礎上才能變異出有效的測試用例。
基于變異:在已知數據樣本的基礎上通過變異的方法生成新的測試用例。例如要對一個圖片文件進行變異,用戶就需要提供一個相應格式的圖片文件,變異生成器會基于這張圖片進行變異。目前這種技術主流是灰盒模糊測試,在對樣本進行變異的時候,能夠獲取代碼邏輯信息,基于路徑反饋進行變異,所以可達到一個很好的測試效果。
因此可以說,模糊測試與純隨機自動化測試,是完全不同的。模糊測試構造出的測試用例其針對性、有效性更強,測試效率更高。并且隨著人工智能技術的發展,模糊測試技術結合更多種的智能分析方法,測試覆蓋率會更高,測試用例的構造也會更快、更準確地發現程序深層次的缺陷。
模糊測試的工作流程
結合模糊測試的特點來看,它對被測程序是有要求的,一是可以動態運行,二是一定要有輸入入口。
對于一個模糊測試通用的測試流程,其描述如下:
01
首先被測系統要動態運行,被測工具要與被測系統建立聯系;
02
測試工具根據變異算法對原始測試用例進行變異;
03
測試工具將生成的測試用用例發送給被測系統的入口;
04
測試工具監控被測系統的運行狀態(是否可以正常響應,是否可以正常運行);
05
測試工具如果發現缺陷,進行記錄;
06
重復上述操作,直至測試結束。
模糊測試的優點
作為當今世界極具創新的測試技術,模糊測試一定有其特殊性,我們可以從如下幾個方面進行總結:
01
模糊測試是一種自動化的測試方式,測試用例是由測試工具自動產生的,其測試效率高,且不依賴于測試人員的經驗;
02
目前普遍使用的測試方式,大部分集中在功能測試,并結合一些非功能測試,如壓力測試。但這些測試都是正面測試,很少有工具專注于負面測試(即驗證軟件不執行其不應該完成的工作)。而模糊測試的出現,正彌補了其他測試方法的不足,它專注于負面測試,與其他測試技術聯合使用可全面保障軟件的安全性和穩定性;
03
模糊測試是動態測試技術,因此查找到的缺陷幾乎沒有誤報。而目前市面上流行的基本都是靜態分析工具,其誤報率遠遠高于模糊測試工具;
04
目前市面上的自動化測試工具更注重已知漏洞的發現,忽視了未知漏洞的危害,模糊測試工具正是發現未知漏洞的利器;
05
模糊測試變異的測試用例,是有一定規則的隨機,相較于隨機自動化測試工具,模糊測試的測試用例能達到更好的效果。
模糊測試能發現真正的缺陷嗎?
模糊測試技術已經是軟件測試、漏洞挖掘領域中最有效的手段之一,可發現程序中那些引起系統運行異常的缺陷。
近幾年許多國際知名的大型公司也在開發自己的模糊測試工具,如FAANG(Facebook、Apple、Amazon、Netflix和Google)已經廣泛使用模糊測試來檢測未知/0-day漏洞,以確保其產品的健壯性和安全性。Google對模糊測試尤為重視,Chrome在最近幾年利用模糊測試找到16000個bug,占所有bug總量的80%以上。而微軟也將模糊測試應用在Windows內核、Office等產品的測試中,據報告Windows發現的安全漏洞約1/3是通過模糊測試技術發現的。此外,根據公開資料統計模糊測試也是黑客們發現軟件漏洞的首選技術。因此可以說模糊測試技術是目前世界范圍內熱門的動態挖掘軟件深層次缺陷的有力工具。
模糊測試,它的能與不能
世界上沒有任何一種測試技術或工具是完美的,也沒有任何一種測試技術或工具,可以保證軟件0缺陷。模糊測試技術也是如此,它善于發現某些類型缺陷的同時,也存在著一定的局限性。
這些缺陷,“我可以”
由于模糊測試的特性,模糊測試工具更擅長發現那些會引起系統運行異常的缺陷,其缺陷類型如下圖所列。
這些缺陷,“Say sorry”
模糊測試是發現那些引起系統運行異常的缺陷、未知漏洞的利器。但對邏輯上的缺陷卻無能為力,例如訪問控制漏洞、代碼邏輯錯誤漏洞、后門、多點觸發的漏洞(當前的模糊測試技術只能挖掘出由單個因素引起的漏洞)等,這些類型缺陷就無法通過模糊測試發現。
那些正在被fuzzing的程序
目前模糊測試技術的應用十分廣泛, 可以測試的對象種類繁多, 比如源代碼、API接口、通訊協議、數據庫系統等。
源代碼模糊測試,是一種灰盒模糊測試。可通過特定的編譯器對源碼進行編譯,在其編譯的過程中對源代碼進行插樁,取得代碼的邏輯結構,并基于路徑反饋進行變異。然后通過程序入口輸入大量的非預期輸入,觀察該程序是否能夠正常響應。這種類型的模糊測試工具,可以作為單元測試在開發階段進行,比如安般科技的拳頭產品——易恒智能模糊測試系統。
Web 應用程序容易受到各種類型的漏洞攻擊, 如拒絕服務、跨站點編寫腳本等。通過對Web API的接口函數進行模糊測試,可保證Web應用程序的安全性和穩定性,安般科技旗下的易察WEB/API 模糊測試系統正是該類型產品。
通訊協議的模糊測試可能是最廣泛被利用的模糊測試類別。主要是因為它能夠發現很多高風險漏洞,其測試對象包括工控設備、智能駕駛設備、物聯網設備等。安般科技的易偵協議模糊測試系統就在被大范圍的商業化應用中。
針對數據庫系統的模糊測試,是通過對數據庫訪問操作語句進行變異,然后將測試用例輸入到數據庫系統中,但其變異算法較為復雜,因此目前成熟的數據庫系統模糊測試工具較少,但該類型的模糊測試工具對推進國產軟件自主化的發展價值巨大,安般科技相關產品也將推出上市。
模糊測試的發展方向
模糊測試通過其特定的測試方法可以發現程序代碼中隱藏的、很難通過常規測試方法發現的缺陷和漏洞,所以在現實中的意義巨大。
未來,模糊測試會逐步深入到開發流程中,在開發的各階段對程序進行模糊測試。例如在軟件設計階段,針對軟件架構設計好模糊測試方案,引入模糊測試工具進行單元測試,實現測試左移;在測試驗證階段,基于設計好的模糊測試方案,進行大規模的模糊測試,同時可將模糊測試工具集成到CICD流程中進行全自動化的模糊測試。
在模糊測試應用場景方面,由于嵌入式技術的迅猛發展以及多個領域的廣泛使用,針對嵌入式設備的模糊測試也是一個發展方向,但模糊測試要求被測程序動態運行,因此與固件仿真技術相結合,可使模糊測試技術更廣泛地應用到嵌入式領域中。目前將兩者成功結合的成熟經驗在世界范圍內都比較欠缺,但安般科技在該領域已經取得了階段性的成果,并開始逐步商用,填補了國內外的空白。
另外,隨著對模糊測試技術的重視,各國也紛紛將模糊測試技術納入軟件測試標準中,未來模糊測試工具將會進一步集成到各大測試平臺,形成統一的測試規范。
簡而言之,模糊測試正在逐漸改變軟件測試的整個生態。