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