李 棟
(上海大學計算機工程與科學學院 上海 200072)
隨著互聯網絡技術快速發展和成熟,Web應用已經滲透到人們現代生活的每一個角落。開放的互聯網絡為基于軟件程序業務的發展提供了極大的便利,但伴隨而來的Web應用安全問題也引起了社會的廣泛關注。由于編程軟件自身的特點和一些設計本身的缺陷,使得信息安全事故頻發。Web應用中HTML5和JavaScript框架等新技術的使用,使得諸如SQL注入和跨站腳本(XSS)等安全漏洞呈級數式的增長,并產生后果嚴重的攻擊事件。
文獻[1-3]對Web應用常見的注入型安全漏洞檢測技術進行了分析,同時對現行的Web應用安全測試方法進行了分類總結。Web應用的安全測試可以分為兩類,靜態分析和動態分析。靜態分析是一個白盒的方法,包括了源碼、字節、對象代碼掃描器和靜態分析技術。靜態分析可以檢測如緩沖溢出和字符串錯誤等誘發的安全問題。動態分析一般都采用滲透測試的思想,從攻擊者的角度出發,利用軟件中存在的安全漏洞,設計攻擊方法,通過對軟件系統進行攻擊來發現其中存在的安全漏洞。可以有效檢測出諸如SQL注入、XSS、CSRF等導致安全事故頻發的重要漏洞。動態分析包括基于黑盒的Web應用漏洞掃描器,模糊測試技術和基于模型的安全測試技術等。
諸如AppScan等Web應用漏洞掃描器可以對Web系統進行自動有效的安全漏洞檢測,但是常常會產生許多正面和負面的錯誤結果,并且有些測試結果仍需人工參與才能正常執行。
模糊測試采用了模糊技術,可以隨機生成大量無效的測試輸入數據進行安全測試。文獻[4]提出一種通過模糊操作符產生無效信息序列而不是無效輸入數據進行測試的方法。這種測試方法雖然在提供輸入信息上提供了巨大的便利,但是同樣會產生許多無用的測試結果,增加了測試分析的復雜度。
基于模型的安全測試通過對系統中威脅、漏洞、風險等進行形式化的抽象建模,從相應模型中生成測試用例,驅動Web應用的安全測試。抽象的形式化模型可以在系統設計初期對Web應用中的安全問題進行有效描述,使得設計開發人員對于Web安全問題的理解更為直觀簡便,而不必去考慮在用戶和Web應用在實現上的交互細節。
本文的工作將基于模型的測試和滲透測試的方法相結合,根據抽象的安全有限機模型對被測系統建立威脅模型,從中挖掘出Web系統中存在安全漏洞的測試序列,并結合工程化的方法將抽象的測試序列實例化,自動生成可執行的測試用例,提高安全測試的工作效率。最后設計了一個實驗,并用開發的原型工具驗證了該方法的可行性和有效性。
根據已有的研究現狀,基于模型的安全測試根據模型的描述對象可以分為三類[2]:
1) 基于結構和功能模型的安全測試。結構和功能模型主要關注安全需求和實現。比如基于訪問用控制模型的安全測試。
2) 基于缺陷和漏洞模型的安全測試。這類模型主要從缺陷和漏洞自身出發,針對某一種特定類型的安全漏洞或缺陷自身的結構特性建立模型。文獻[5]試圖在系統開發生命周期的早期減少系統中可能存在的SQL注入漏洞,描述了SQL注入漏洞產生的原因,并用威脅建模的方式指導開發者如何在開發過程中減少SQL注入漏洞。文獻[6]提出一種基于模型的Web漏洞測試方法。文獻分為兩個部分,采用行為模型捕捉系統動作;用漏洞測試樣式對漏洞進行形式化的描述產生測試目的。最后用測試目的驅動行為模型生成測試用例。漏洞測試樣式包含了漏洞的名稱、描述、行為、實現條件、涉及變量等。研究對象是存儲型XSS和反射型XSS漏洞。
3) 基于威脅、故障和風險模型的安全測試。這類模型用于檢測被測系統在受到攻擊時會產生什么樣的錯誤,主要關注Web安全漏洞問題產生的原因和后果。MARBACK[7]等采用AND/OR樹形式化的表示Web系統可能面臨的威脅。Xu等[8]基于形式化的Petri網對威脅場景建模產生測試用例,結合MIM(Model-Implementation Mapping)規格說明,基于自主開發的工具,實現了從抽象測試用例到代碼級別的可執行的安全測試用例。Wang等[9]提出一種模型驅動的安全測試方法,利用UML時序圖對違背安全策略的威脅進行建模,從威脅模型中提取威脅跡的集合。其中,每條威脅跡對應一個威脅序列。通過程序插樁的方法,將描述威脅行為的序列轉化為測試用例。
除此之外,文獻[10]提出一種從一個安全模型出發的半自動化Web安全測試方法。作者假設存在一個基于被測系統規格說明的形式化安全模型,利用這個模型對系統中出現的漏洞進行建模,使用模型檢測器從模型中輸出由漏洞所引發的攻擊路徑。最后將這些攻擊路徑實例化成測試用例并交由測試人員對這些一一執行。這種方法的主要貢獻是提供了一個在瀏覽器級別來描述Web應用的模型,指導滲透測試者從中找出基于邏輯漏洞所產生的攻擊行為。
基于對相關工作內容的深入研究,本文工作有以下幾點不同:
1) 基于安全有限狀態機模型對Web應用中可能存在的安全問題進行威脅建模,不僅可以在功能上實現被測系統的安全需求,同時可以發現被測系統的安全漏洞。高度抽象的威脅模型有助于減少安全專家和開發人員之間的知識差距,有助于開發人員在系統設計時提高安全性。
2) 通過對安全問題提出的測試方法可以應用到Web應用開發的各個周期,與軟件開發完成后的安全測試相比,可以節省測試時間,提供更好的防御。
3) 設計的原型工具實現了安全測試用例的自動生成,提高測試效率同時縮減了測試成本。
威脅建模[11]采用滲透測試的思想,從攻擊者的角度出發來描述軟件系統將要面臨的安全威脅。威脅模型可以為安全測試提供可靠的理論基礎。雖然威脅建模已在軟件的安全開發上得到了廣泛應用,但使用隱式和非形式化的威脅模型的安全測試對于軟件安全測試的自動化產生了很大的局限性[12]。有限狀態機(FSM)提供了一個對復雜Web應用行為進行建模描述的理論基礎,采用基于 FSM 的模型來捕捉軟件的行為在實踐中得到廣泛的認同[13]??娀纯鄣萚14]以FSM作為測試模型,設計并實現了一個基于模型的 Web 應用測試系統。本文利用擴展的有限狀態機S-FSM中的字符和語法對Web系統的狀態、遷移和動作進行充分描述,引入了注入點InP的定義來描述Web中接收的攻擊輸入語句。威脅模型為開發和測試人員提供了一個直觀的視角去研究攻擊者如何通過滲透軟件系統并實現安全威脅的具體過程。通過這種反向的建模方法,使得軟件設計人員可以有效地理解Web系統中可能存在的安全隱患,確定系統的安全漏洞。
定義1安全有限狀態機模型(S-FSM)。S-FSM描述為一個三元組(Q,q0,T)。其中:
Q={q0,q1,…,qn}:表示非空的有限狀態集。qi在Web應用中表示為網頁。
q0∈Q是初始狀態,即Web應用的起始頁面。
T表示有限的遷移集合。每條遷移t∈T描述為一個五元組(qf,G,Act,I,qb),描述了Web應用中從一個網頁到另一個網頁發生的狀態遷移。qf表示當前遷移的前狀態,qb表示后狀態。G表示該遷移上的衛視條件集合;Act表示一個有限的動作集;I={Id1,Id2,…,Idn}表示一個有限輸入集合,例如在網頁中需要輸入的對話框內容等。
定義2注入點(Injection Point)。InP(type)∈qi,表示網頁中需要輸入的對話框和地址欄等表單的集合。存在于某個狀態qi中,根據注入點的類型,接收輸入數據Id。
定義3攻擊路徑。如果一個S-FSM所產生的遷移路徑中的終止狀態為attack,則稱這條遷移路徑為攻擊路徑。攻擊路徑的集合記為TC,每一個TCi=
定義4威脅模型。對于一個S-FSM,M=(Q,q0,T),如果模型中有一到多個攻擊路徑,則稱這個有限狀態機為威脅模型。
圖1描述了一個簡單的Web應用登錄系統,當用戶打開初始頁面,非注冊用戶需要先進入注冊頁面q1,注冊成功后從q12頁面再自動跳轉到登錄頁面q2。已注冊用戶則直接在登錄頁面q2進行登錄,登錄成功后進入主頁qm。若登錄失敗需要重新找回密碼,則進入q3頁面,設置新的密碼成功后從q31頁面返回登錄頁面進行正常登錄。其中發現創建賬戶頁面q1、登錄頁面q2和設置新密碼頁面q3都包含了輸入框,即我們定義的注入點,非法用戶可以在注入點輸入攻擊代碼從而使Web應用進入危險狀態Attack。
根據圖1中的描述,我們利用S-FSM對Web登錄系統建立了受到SQL注入攻擊的威脅模型,如圖2所示??梢娫谶w移t3/t5/t6/t8/t10中都包含了注入點,不良用戶可以在這些遷移中利用SQL注入的方式,向頁面注入非法的SQL語句條件,完成攻擊。

圖2 受到SQL注入攻擊的威脅模型
威脅模型建立之后,需要從威脅模型中解析出有效的安全測試序列,即攻擊路徑。基于不同的測試覆蓋準則,可以從威脅模型中產生不同的安全測試序列。文獻[15]給出了深度優先遍歷FSM 產生滿足遷移覆蓋的測試用例集合的算法。本文研究的對象是安全測試,只需獲得從起始節點到攻擊節點的所有遷移序列。因而將原算法中的終止狀態改為Attack狀態,命名為算法1?;谏疃葍炏人惴▽eb應用威脅模型中的所有遷移進行遍歷,生成從根節點到攻擊節點(Attack)的所有遷移序列。
算法1根據深度優先遍歷產生滿足狀態遷移覆蓋的測試用例集的算法。
1)Input:q0∈S-FSM
2)Begin
3)bool DFS(Node q0, int d,str tc[ ]= ‘q0’)
4)for (i = 0,Node nextNode in q0, i++)
5)if (!visit[nextNode])
6)visit[nextNode] = true;
7)while(nextNode!=Attack)do
8)DFS(nextNode, d+1); }
9)return true;
10)tc[i] = tc[i]+″>>″nextNode;
11)visit[nextNode] = false;
12)Output tc[i];
13)End.
算法1中以待測模型的初始狀態作為輸入節點(步驟1),深度優先遍歷整個S-FSM模型。步驟3定義起始節點為q0,并將根節點q0加入遍歷序列。步驟4和步驟5利用for循環遍歷其余節點,若發現不為空,定義nextNode為true,并判斷nextNode是否為Attack節點,若否則繼續遍歷,同時深度加一(步驟8)。直至nextNode為Attack時遍歷結束,將遍歷的節點依次記錄下來加入當前攻擊路徑的數組集合(步驟10)。一次遍歷后將nextNode節點設置為false,返回步驟3開始下一輪深度優先遍歷(步驟11)。最終輸出所有的遍歷數組(步驟12)。所得到的數組集合tc[]即為滿足狀態遷移條件的安全測試序列集合。
根據上文中提到的算法,可以將圖2所示的SQL注入FSM樹中解析得到符合條件的5條遷移序列,即攻擊路徑(如圖3所示)。
TC1:
TC2:
TC3:
TC4:
TC5: < t2, t7, t81, t9, t10(Injection5), Attack>。

圖3 根據深度優先算法生成的FSM測試樹
前文通過S-FSM模型對Web應用建模并產生了安全測試用例。然而這些測試用例只能給軟件設計者提供抽象的理論依據,實際的開發過程中則需要可執行的測試用例來支持工程進展。為了獲得可執行的安全測試用例,本文提出一種算法,將從FSM測試樹中生成的安全測試序列對應Web應用中的實際網址、按鍵和表單等進行實例化,結合基于語法的常見注入攻擊語句作為輸入條件,生成可執行的安全測試用例。實現算法如下。
算法2可執行安全測試用例生成。
1)Input :TC from S-FSM / URL/ Test Code Str from Attack DataBase
2)Begin
3)Test Suite←” ”;
4)For each AttackPath∈TC;
5)Append initial code, Preconditions, Postconditions and Help code to AttackPath;
6)FOR(i= 1 to n) do
7)For each t∈AttackPath
8)While InP?t
//當前遷移中不包含注入點,則繼續
9)Continue;
10)For(i= 1 to n)do
11)Check the InP type
//檢查注入點的類型
12)Append Idito InP;
13)End for.
14)Append AttackPath to Test Suite;
15)End for.
16)Output Test Suite
//輸出可執行的測試用例集合
17)End.
在算法2中,以算法1中得到的安全測試序列集合TC、待測網站起始地址和攻擊輸入語句作為輸入條件(步驟1),初始化測試用例集為空,并依次遍歷TC中的每一條安全測試序列(步驟3、步驟4)。利用輔助代碼實例化出當前測試序列中狀態(對應網址)、遷移中的動作和衛式條件(網頁上對應的按鍵和鏈接、限定條件)、注入點(網頁中的表單和地址欄等),加入該條安全測試序列的實例化的初始代碼、前后置條件,構造出一條可執行用例的基本代碼結構(步驟5)。步驟(6-9)依次遍歷安全測試序列中每個注入點,若發現注入點InP,檢測注入點類型(步驟11),并將從網絡中搜集出符合該類型的Web漏洞攻擊注入代碼作為輸入,依次加入該條安全測試序列的注入點中(步驟12),生成一條可執行的安全測試用例。依次遍歷安全測試序列集合TC中的每一條測試序列,最終輸出基于語義的可執行安全測試用例集合(步驟16)。
為了驗證基于模型的安全測試生成方法的可行性和有效性,設計了一個原型工具,并使用它對 一個開源Web電商網站進行了安全測試。圖4為整個測試生成工具的具體框架。

圖4 基于S-FSM的Web安全測試工具框架
為了支持基于S-FSM的安全測試生成方法,用Java語言開發了一個原型工具。主要分成4個模塊。
4.1.1從模型的規格說明生成圖形化威脅模型
本文設計的工具是以FSM模型的XML文件作為測試輸入,FSMDesigner是一個基于C++的有限狀態機設計工具,可以有效地描述FSM模型中狀態和遷移。生成的S-FSM模型以XML文件的形式保存,滿足了設計需要。如圖5所示。

圖5 使用FSM Designer描述的威脅模型
4.1.2解析威脅模型的XML文件以得到安全測試序列
利用SAX解析器對FSM模型的XML文檔進行解析,設計實現了上文中提出的基于遷移覆蓋深度優先算法,生成滿足條件的安全測試序列。如圖6所示,設計的測試生成工具包含裝載FSM模型的XML文件、顯示,選擇覆蓋準則點擊執行生成安全測試序列。

圖6 安全測試序列的生成
4.1.3生成可執行安全測試用例
一條完整的可執行的安全測試用例包含:測試用例的編號、測試用例的起始條件即前置條件、測試預期結果、測試輸入數據和安全測試中涉及的各種參數等。在設計的工具中選擇安全測試序列和相應的測試數據,可以生成一條安全測試用例。圖7中生成的是一條包含URL注入的可執行安全測試用例,存在于每一個測試序列中,向URL地址欄注入SQL攻擊語句以達到非法登錄的目的。

圖7 可執行安全測試用例的生成
4.1.4執行測試用例,并生成測試報告
可執行的安全測試用例使用 Perl 語言來編寫。生成的可執行安全測試用例可以在 Selenium IDE 的 Firefox 擴展包來運行并得到執行結果。執行結果可以顯示出注入的攻擊語句是否成功侵入待測Web系統,與測試的預期結果是否一致。如果出錯則報出相應的位置并進行信息統計。
實驗中所使用的測試系統 Magento1.1.8 是一個專業開源的電子商務系統,采用PHP語言進行開發,后臺使用MYSQL數據庫存取數據。它的設計結構靈活,具有模塊化架構體系和豐富的功能。由于Magento1.1.8的結構龐大,實驗中只選取了系統中的登錄模塊和支付模塊進行建模測試。為了評估威脅模型的安全測試的有效性,選擇了OWASP Top10中常見的6種注入型漏洞設計攻擊輸入語句,包括SQL注入,跨站點腳本XSS,Xpath注入,LDAP注入,SSI注入和目錄遍歷。使用開發工具生成了18條攻擊路徑和58個可執行的安全測試用例。
實驗目的是驗證采用基于S-FSM模型生成的安全測試方法能否發現Web系統中存在的漏洞。為了顯示測試結果的多樣性,在設計輸入代碼時加入了正常的測試攻擊語句和無效的測試輸入語句。表1展示了實驗中安全測試用例的運行結果。

表1 實驗結果
其中,根據幾種不同的安全漏洞攻擊方式分別設計了包含10條有效輸入和8條無效輸入共計18條測試輸入數據,將這些測試數據注入相應的安全測試序列中攻擊得到了58條可執行的安全測試用例。為了驗證所得到結果的有效性,分別將這58條測試用例一一執行,并將分析結果匯總到圖8所示的柱狀圖中。圖8中四條不同灰度的柱子分別代表了安全測試用例數、根據有效輸入得到的安全測試用例數、可以正確執行的安全測試用例數和發現威脅的安全測試用例數。所有6種攻擊方式得到的數據結果可以清晰的表示出來。

圖8 發現威脅的安全測試用例數據分析圖
由圖8可以發現,除去由無效輸入數據而生成的安全測試用例,其他測試用例得到了正確執行,測試用例的有效性達到了100%。根據安全測試用例的執行結果,幾種安全漏洞攻擊方式下的測試用例發現安全威脅的比例分別為80%、100%、100%、80%、0%和80%。其中SSI注入沒有發現安全威脅,是因為當前系統版本已經對這種攻擊方式進行了有效防御。其余的測試用例在發現問題上的覆蓋率達到了92%以上。實驗結果表明,基于S-FSM模型的安全測試方法是一種有效的技術,通過這種方法,設計人員可以在Web應用的開發設計時期有效地發現這些安全漏洞。
本文提出一種基于擴展FSM模型的Web應用安全測試方法,生成可執行的安全測試用例。實驗驗證了該方法的有效性和可行性。該方法將傳統的基于模型的測試方法和工程化的基于代碼的測試方法相結合,可以幫助開發者在設計階段有效地考慮和規避Web系統中可能出現的安全漏洞,從而提高整個系統工程的開發效率。
由于Web系統中不同漏洞的攻擊方式也不盡相同,接下來的工作需要將模型進一步細化。同時在面對龐大的Web應用系統時,設計出自動化更強的測試軟件。
[1] Felderer M,Büchler M,Johns M,et al.Security Testing:A Survey[M]//Advances in Computers,2015.
[2] 王丹,趙文兵,丁治明.Web應用常見注入式安全漏洞檢測關鍵技術綜述[J].北京工業大學學報,2016,42(12):1822-1832.
[3] Felderer M,Zech P,Breu R,et al.Model-based security testing:a taxonomy and systematic classification[J].Software Testing Verification & Reliability,2016,26(2):119-148.
[4] Schneider M,Tcholtchev N,Pietschker A,et al.Behavioral fuzzing operators for UML sequence diagrams[C]//International Conference on System Analysis and Modeling:Theory and Practice.Springer-Verlag,2012:88-104.
[5] Kaur N,Kaur P.Mitigation of SQL Injection Attacks using Threat Modeling[J].Acm Sigsoft Software Engineering Notes,2014,39(6):1-6.
[6] Lebeau F,Legeard B,Peureux F,et al.Model-Based Vulnerability Testing for Web Applications[C]//IEEE Sixth International Conference on Software Testing,Verification and Validation Workshops.IEEE,2013:445-452.
[7] Marback A,Do H,He K,et al.A threat model-based approach to security testing[J].Software Practice & Experience,2013,43(2):241-258.
[8] Xu D,Tu M,Sanford M,et al.Automated Security Test Generation with Formal Threat Models[J].IEEE Transactions on Dependable & Secure Computing,2012,9(4):526-540.
[9] Wang L,Wong E,Xu D.A Threat Model Driven Approach for Security Testing[C]//International Workshop on Software Engineering for Secure Systems,2007.Sess’07:ICSE Workshops.IEEE,2007:10.
[10] Büchler M,Oudinet J,Pretschner A.Semi-Automatic Security Testing of Web Applications from a Secure Model[C]//International Conference on Software Security and Reliability.2012:253-262.
[11] Swiderski F,Snyder W.Threat Modeling[M].Redmond,Washington:Microsoft Press,2004.
[12] Wagner F,Schmuki R,Wagner T,et al.Modeling Software with Finite State Machines:A Practical Approach[M].Auerbach Publications,2006.
[13] Binder R V.Testing Object-Oriented Systems:Models,Patterns, and Tools[M].Addison Wesley,2000.
[14] 繆淮扣,陳圣波,曾紅衛.基于模型的Web應用測試[J].計算機學報,2011,34(6):1012-1028.
[15] 錢忠勝.基于模型的Web應用測試用例生成方法[D].上海:上海大學,2008.