李 栋
(上海大学计算机工程与科学学院 上海 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所示。可见在迁移t3/t5/t6/t8/t10中都包含了注入点,不良用户可以在这些迁移中利用SQL注入的方式,向页面注入非法的SQL语句条件,完成攻击。
图2 受到SQL注入攻击的威胁模型
威胁模型建立之后,需要从威胁模型中解析出有效的安全测试序列,即攻击路径。基于不同的测试覆盖准则,可以从威胁模型中产生不同的安全测试序列。文献[15]给出了深度优先遍历FSM 产生满足迁移覆盖的测试用例集合的算法。本文研究的对象是安全测试,只需获得从起始节点到攻击节点的所有迁移序列。因而将原算法中的终止状态改为Attack状态,命名为算法1。基于深度优先算法对Web应用威胁模型中的所有迁移进行遍历,生成从根节点到攻击节点(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.