基于权限验证图的Web应用访问控制漏洞检测

2018-06-26 10:19夏志坚彭国军胡鸿富
计算机工程与应用 2018年12期
关键词:漏洞页面节点

夏志坚,彭国军,胡鸿富

武汉大学 计算机学院,武汉 430072

1 引言

近年来,互联网飞速发展,社交、购物、金融等不同行业都开始互联网化。Web应用不断出现,而这些应用存储了大量的用户隐私数据,为了保障隐私数据的安全性,必须采用严格的权限控制[1]。相比于传统应用的权限控制,由于http协议的无状态特性,每次请求隐私数据都必须进行权限验证,因此用户的每次请求都需要验证权限,因而需要更加完善的权限验证机制[2]。受限于开发者的水平和程序逻辑的复杂性,权限验证遗漏或不完全仍然普遍存在于Web应用中,导致权限控制漏洞影响范围十分广泛。根据OWASP(Open Web Application Security)组织公布的数据,权限控制漏洞已经成为前10大Web应用安全漏洞之一[3],权限控制漏洞已然成为Web应用所面临的主要安全威胁之一。权限控制漏洞依赖于应用本身,不同的应用的权限控制往往在逻辑上有很大不同,而权限控制漏洞主要分为以下3种情况:

(1)强制访问:应用中访问某页面前包含权限验证,但未授权用户可以通过直接访问页面URL绕过权限验证。

(2)权限验证不当或缺失:页面中包含具有特定权限的用户才能访问的资源,在资源访问路径上权限控制不当或缺少权限控制。

(3)权限验证处理逻辑不当:权限验证失败后,未正确终止当前访问,未授权用户仍能访问敏感资源。

学术界针对权限控制漏洞的检测做了很多研究,目前主要的检测方法包括静态检测、动态检测以及动静结合检测[4-9],然而目前在效率和准确性上还并不能令人满意。美国加利福尼亚大学的孙芳琪等人采用自动推断隐式权限控制假设的技术,构建基于角色的站点图,提取权限页面,推测权限页面是否能被强制访问,能够准确检测权限控制漏洞[10],但只能检测强制访问类权限控制漏洞,检测范围较窄。在此基础上,文献[11]设计了一种基于应用保护状态的漏洞模型检测机,通过识别权限页面保护状态,快速地检测权限控制漏洞,能够检测强制访问和部分权限验证不当或缺失多种权限控制漏洞,而对权限验证后处理逻辑不当漏洞则无法检测。文献[12]静态分析获取权限验证的关键逻辑,在权限验证未通过的代码中插入监视代码,然后在动态运行时检测是否有权限控制漏洞攻击行为发生,可以检测多种类型权限控制漏洞,但检测方法依赖于测试集,并且需要较高的系统开销。

程序可以通过控制流图抽象表示,选取控制流图中的权限验证节点和资源节点可以组成权限验证图,权限验证图中,每个资源对应多条权限验证路径,比较每条权限验证路径的验证权限与资源访问权限,从而检测资源是否具有权限控制漏洞。上述3种权限控制漏洞均可等价为“存在一条或多条权限验证路径的验证权限低于相应资源的访问权限”,因此本文的算法可以覆盖上述3种权限控制漏洞。本文提出了一种新的权限控制漏洞检测算法,实现了检测工具,并针对7个流行Web系统进行了安全检测,发现了8个已知和未知漏洞。

2 权限验证图与权限控制漏洞

权限验证图是由起始节点、终止节点、资源节点和权限验证节点组成的无环有向图,为了抽象定义权限验证图,有如下定义:

定义1(角色)一个角色拥有一种权限或者多种权限,R为权限集。在大多数系统中,权限的分配通过赋予某种角色来实现,资源具备某种访问权限即为资源能被具有某种权限的角色访问。

定义2(资源节点)资源节点是对资源进行操作的代码模块,现代Web应用数据主要存储在数据库中[13],因此资源节点主要为数据库操作,但也能方便地扩展到文件等操作,资源节点集合为S。资源节点的权限通过权限表与角色相关联,例如从数据库中删除用户user1,对应的角色为“admin”。

定义3(起始节点和终止节点)起始节点为页面起始节点,终止节点为页面跳转或终止执行函数,起始节点集合为ST,终止节点集合为TE。起始节点和终止节点验证权限为NULL。

定义4(权限验证节点)权限验证节点是验证访问用户是否具有某种权限或拥有某个角色的代码模块,权限验证节点集合为A。权限验证节点的权限与它所验证的角色相关,例如if($_COOKIE[“user”]==“admin”)的权限即为它检查的角色“admin”的权限。

权限验证图表示为G=(V,E),其中V为节点集,V={v|v∈(ST⋃A⋃S⋃TE)}。假设节点a,b∈V,a权限验证通过后可达b,则称a有一条T边到b,记作a→T=b,若a权限验证未通过仍然可达b,则称a有一条F边到b,记作a→F=b,若a直接到b,则a→T=a→F=b。E={|v1,v2∈V,v1→T=v2⋃v1→F=v2}。权限验证路径为起始节点经过若干非终止节点到达资源节点的一条路径,权限验证路径为节点有序序列,资源节点s的权限验证路径集为:

任意资源节点存在一条或者多条权限验证路径,权限验证路径上的T边的源节点称为有效权限验证节点,而所有有效权限验证节点的权限并集则为权限验证路径的验证权限。如果用U表示权限集,资源节点s∈S的权限验证路径r∈routes的验证权限可表示为:

定义5(权限控制漏洞)如果资源节点s∈S存在一条验证权限为ur⊂U的权限验证路径r且s对应的访问权限为us⊂U ,若us⊄ur,则资源s的访问权限高于验证权限,此时拥有权限低于资源访问权限的角色可以通过路径r访问资源节点s,则此时存在针对资源节点s的权限控制漏洞。

3 基于权限验证图的权限控制漏洞检测算法

控制流图(CFG)为有向图G=(N,E,entry,exit),N为节点集,每个节点代表一个基本块。边集E={|n1,n2∈N 且n1语法可达n2},entry和exit为程序入口和出口节点。CFG有唯一的入口点和出口点,通过CFG清晰地表示了程序的控制逻辑[14-15]。

通过节点识别从CFG中分离出定义2~4中的节点,这些节点与程序的权限验证逻辑相关,依据节点间的验证逻辑关系,生成通过T边和F边连接的权限验证图。因此,权限验证图可以表示页面的权限验证逻辑。由定义4、5可知,权限验证图中每个资源节点对应至少一条权限路径,比较资源节点对应的权限路径验证权限与资源节点访问权限,即可检测权限控制漏洞。因此本文算法分为以下两步:

表1 简单权限控制实例

(1)解析php源码,生成CFG,递归遍历CFG,识别节点,并生成权限验证图。

(2)深度优先搜索权限验证图,获取每个资源节点对应的所有权限路径,计算权限路径验证权限,并与资源节点访问权限比较,判定是否存在权限控制漏洞。

3.1 节点识别

权限验证节点分为页面内权限验证节点和页面间权限验证节点,页面内权限验证节点由分支语句(if-then-else或者switch)和包含权限变量的条件表达式组成,权限变量预先配置;页面间权限验证节点包括封装权限验证节点的函数和页面。表1中“delete.php”包含3个权限验证节点,行4的“else if(!checkAdmin($_COOKIE[‘username’])))”和行3的“if(!$logined)”为页面权限验证节点,行1的“include(‘access.php’)”为页面间权限验证节点,在“access.php”中包含了页面内权限验证模块。

页面间权限验证节点均可等价为if(cond),其中cond=expr1 op1 expr2 op2 expr3…,而expri为不包含逻辑运算符&&和||的简单条件表达式,权限变量格式为{变量名,参数,验证通过取值,权限}(变量不为函数时,参数取值为NULL),例如列表1中“{$_COOKIE[‘isLogined’],NULL,1,‘isLogined’}”,表示 cookie 中变量isLogined值为1时,权限高于“user的角色可通过验证。页面内权限验证节点算法:

算法1页面内权限验证节点识别算法

输入:条件表达式cond,权限变量集合authVar。

输出:节点验证权限w,条件表达式值val。

1.DisAuthNode(cond,authVar)

2. w=NULL,op=&&,val=True,op=&&,val=True

3. while cond

4.expr=GetFirstExpr(cond)//取第一个简单表达式

5. for var in expr

6. if var in authVar or DataFlaw(var) in authVar

7.tmp=GetVar(authVar,var)

8. replace(expr,var,tmp)//用 tmp 值替换expr中的var

9. if expr

10. op=||,w=tmp&&w

11. val=val op expr,delete expr from cond

12. if cond==NULL

13. break

14. op=op1,delete op1 from cond

15.return[w,var]

算法1中,第3~14行遍历条件表达式cond中的所有简单条件表达式。首先取第一个简单条件表达式expr,然后针对expr中的所有变量进行后向数据流分析,判断变量是否为权限变量。如果是,则用权限变量值替换expr中变量,计算expr值。将expr值与条件表达式值val进行运算,然后删除当前expr,接着替换运算符op,并删除op,重复直到cond为NULL。最终返回节点验证权限和条件表达式值。

页面间权限验证节点是函数或页面封装了页面间权限验证节点,因此只需要对函数调用或include等包含的页面,重复上述步骤即可。页面间权限验证节点验证权限为其包含的页面内权限节点权限。

本文中的资源节点主要为数据库操作,包括删除、更新、插入、查询某一张表,针对不同表的不同操作对应的角色也不同,因此可以用三元组(操作,表,角色)表示一个资源节点。预先配置时,可以根据系统的权限表生成资源权限表,每一项包含一个三元组。识别资源节点时,首先识别数据库操作函数,然后从函数参数中匹配操作和表,如果匹配到,则将这个代码模块视为资源节点。

每个页面均有唯一的起始节点,而终止节点则包括页面结束,return语句,exit和die等终止执行函数,以及页面跳转语句。页面跳转语句包含多种形式,表2给出了页面跳转实例。文献[10]提出了一个链接提取的综合性方法,本文只需要识别跳转语句,因此首先匹配API函数,例如“Header、echo、print”,然后在函数参数中匹配是否包含本地或远程地址。当匹配到Header函数时,下一个节点必须为终止执行函数,否则不识别为终止节点。

表2 PHP页面跳转方法实例

3.2 生成权限验证图

生成权限验证图只需要遍历CFG图,识别节点类型,将节点加入权限验证图,然后递归得到节点的T边和F边指向的权限验证节点,其中资源节点的T边和F边指向同一节点,终止节点的T边和F边指向NULL。算法如下:

算法2权限验证图生成算法

输入:CFG,权限变量checkNodes,资源集s。

输出:权限验证图Graph。

1.GraphBuilder(CFG,checkNodes,s)

2. node=curr=CFG->start

3. if curr==exit||!curr||curr为终止节点

4. node->T=node->F=NULL

5. else if curr是权限验证节点

6. node->T=GraphBuilder(curr->True,checkNodes,s)

7.node->F=GraphBuilder(curr->False,checkNodes,s)

8. else if curr是资源节点

9. node->T=node->F=GraphBuilder(curr->child,checkNodes,s)

10. else

11. node=GraphBuilder(curr->child,checkNodes,s)

12.return(Graph=node)

算法2为递归算法,取CFG中首节点,判断节点类型,如果节点为终止节点、exit或者NULL,则将节点node的T边和F边均指向NULL。curr→True、curr→False表示当前节点跳转条件为真或假的子节点,curr→child表示当前节点的子节点(无跳转)。节点为权限验证节点、资源节点时,分别将node的T边和F边指向不同的节点。节点如果为其他类型节点,则忽略当前节点,直接递归当前节点子节点。图1是通过上述算法生成的一个权限验证图,从图中可以清晰地获取从起始节点到资源节点的所有路径。

图1 权限验证图

3.3 漏洞检测

根据定义5,通过深度优先遍历权限验证图,获取起始节点到目标资源节点的所有权限验证路径的权值,每获取一条权限验证路径的权值后,比较权值与资源访问节点权值,从而判断漏洞是否存在,具体算法如下:

算法3漏洞检测算法

输入:权限验证图G,目标资源节点s。

输出:漏洞vul。

1.DetectVul(G,s)

2. stack.push(G->start) //入栈

3. G->start->visited=1

4. do

5. node=GetChild(stack.top) //获取节点的非空未被访问子节点

6. if node==s

7. var=stack.traverse()//k为栈底节点,k+1为下一个节点,如果k->F!=k+1,tmp=tmp||k,重复直到k为NULL,返回tmp

8. if var

9. report vul,return

10. else if node!=NULL

11. stack.push(node)

12. node->visited=1

13. continue

14. stack.pop()//栈顶节点被访问,出栈

15.while!stack.isEmpty()

在算法3中,建立了一个节点栈stack,首先将权限验证图G的首节点入栈,并设置为已访问,然后第4~15行为对G的深度优先搜索。当搜索到目标资源节点s时,此时栈中所有节点即为s的一条权限路径,从栈底遍历整个栈,根据定义4,计算权限路径验证权限var,比较var与资源节点s.var,如果有漏洞则报告漏洞。如果节点不为s且不为NULL,则将节点入栈,然后直接跳转到循环开始,否则当前节点出栈,栈为NULL时,循环遍历结束。通过该算法,图1中start到s的权限验证路径总共有两条,即{start,1,2,3,s}和{start,1,2,4,s}。因为3→T=3→F=s,所以计算权值时,节点3不是有效权限节点,因此,它们的有效权限验证节点集合为{1,2}、{1,4},假设权限验证节点1和4的权限均小于资源节点s的权限,则存在一条权限验证路径{start,1,2,4,s}的权值小于资源节点s的权限,因此资源节点s存在权限控制漏洞,报告漏洞信息。遍历所有的资源节点后,就可以完成对页面的漏洞检测。通过构建权限验证图的方法,可以简化程序逻辑,将无规则的权限验证逻辑转换为清晰的权限验证路径,从而较大地提高权限控制漏洞分析效率和准确度。

4 实验与结果分析

4.1 漏洞检测工具

为了验证算法有效性,本文实现了权限控制漏洞检测工具:AccVulHunter。PHP-Parser是由PHP编写的一个语法分析器,直接生成抽象语法树(AST),功能简单,易于扩展,因此,将PHP-Parser作为语法分析器。整个工具包括全局信息收集、CFG生成部分、权限验证图构建、权限控制漏洞检测和漏洞报告等5个部分。整个工具的系统结构如图2。

AccVulHunter针对权限控制漏洞的检测主要步骤为:

步骤1将页面分为功能页面和定义页面,初始化程序主要参数。

步骤2对功能页面进行分析,生成AST抽象语法树,然后遍历AST,收集全局信息,并构建CFG控制流图。

步骤3遍历CFG图,识别权限验证节点和资源访问节点,根据权限验证图构建算法构建页面权限验证图。

步骤4判断页面所有资源访问是否存在权限控制漏洞,如果存在通过xml报告漏洞位置信息和对应资源信息。

图2 AccVulHunter工具系统结构图

4.2 实验与结果分析

为了测试漏洞检测算法的有效性,本文选取了4个Web开源应用mantisbt-master、SlimCMS、redaxscript和DDCMS以及在文献[6-7]中测试的3个Web应用SCARF、PHP Calendars、PHPOLL。

实验的结果如表3所示,总共报告漏洞12个,经过人工确认漏洞数为8个,确认漏洞中未知漏洞2个,已知漏洞6个。AccVulHunter在SCARF、PHPCalendars中各检测到了1个已知权限控制漏洞,分别为CVE-2006-5909和CVE-2010-0380。SCARF的“generaloptions.php”中缺少权限验证节点“require_admin()”,导致任意角色可以编辑应用配置,而PHPCalendars的instll.php中可以编辑系统配置,然而并未验证用户权限,因此存在权限控制漏洞。文献[10]中的工具在PHPPOLL中检测到了3个新的漏洞,在“modifica_configurazione.php”、“modifica_votanti.php”、“modifica_band.php”中检测到了权限控制漏洞,而本文工具检测出了“modifica_votanti.php”中缺乏权限验证,导致用户可以修改其他用户信息,另外两个漏洞由于版本更新已修补。这3个漏洞属于均为强制访问权限控制漏洞。

SlimCMS中的“redirect.php”中包含插入新管理员的资源节点,但在页面中被未发现权限验证节点,因此检测出了一个权限验证缺失的漏洞(CVE-2008-5708)。Redaxscript中检测到了1个权限控制漏洞,在“admin_center.php”中,不同权限用户属于不同组,在生成新用户中,虽然验证了用户是否有权注册为“admin”,但是没有验证用户注册的组,因此可以通过将用户组改为管理组,使得普通用户具有管理员权限,这个漏洞属于权限验证不当的漏洞。

AccVulHunter还在DDCMS和SlimCMS中检测到了两个未知漏洞,在DDCMS中,通过权限变量“$admin”验证管理员,在页面“wap_admin_cg.php”中,虽然通过权限节点“if($admin!=1)”进行了权限验证,但是当权限验证失败时,调用header函数跳转,AccVulHunter在header函数后未匹配到exit或die函数,因此并未视为终止节点,因此仍能访问到后续节点,因此存在一个权限验证处理逻辑不当的漏洞。在SlimCMS中,系统通过查询管理员用户名和用户提交用户名是否一致,判断用户权限,而在“install.php”中可以重新设置管理员用户名和密码,但是在文件中并未对创建者身份进行验证(数据库用户名密码直接调用配置文件,未进行验证)。如果攻击者重新访问该页面,则可以创建新的管理员用户名和密码,从而提升权限,因此存在一个强制访问权限控制漏洞。

本文工具采用了基于权限验证图的检测算法。该算法定义了将权限控制漏洞的检测转为资源节点对应的权限路径验证权限与资源节点访问权限的比较的检测模型,而前述4种权限控制漏洞中均存在一条权限低于资源节点权限的权限路径,因此本文的检测模型可以覆盖这四种权限控制漏洞。文献[10]中算法只判断页面是否包含防护,并使用强制访问进行确认,因此只能覆盖强制访问权限控制漏洞。而文献[11]中,忽略了权限验证失败后的处理逻辑检查,导致无法检测权限验证处理逻辑不当的权限控制漏洞。表4是本文工具与文献[10-11]中工具的漏洞发现类型比较,从表中可以看出文献[10]中工具只能检测强制访问权限控制漏洞,文献[11]的ACMA可以检测除权限验证处理逻辑不当以外的权限控制漏洞,而AccVulHunter可以检测全部4种权限控制漏洞。因此通过实验对比,可以证明本文算法具有更好的漏洞检测广度。

表3 AccVulHunter扫描结果

表4 漏洞发现类型比较

AccVulHunter扫描Web系统的时间与系统的文件数和资源节点数以及权限节点数正相关,由于权限验证节点识别涉及到更多的数据流分析和过程间分析,相对于另外两者,扫描时间相对较长,未来通过优化节点识别,仍然可以提高算法分析速度。

综合实验结果看,本文的权限控制漏洞检测算法可以快速、有效地发现权限控制漏洞,相对于已有方法,能够检测更多的权限控制漏洞,具有更高的实用性。另外由于相对更大的代码分析量,AccVulHunter在时间消耗上较大,但相对于人工审查,仍然能较大提高分析速率。

5 结束语

本文提出了一种基于权限验证图的访问控制漏洞检测算法,通过静态识别权限验证节点,建立权限验证图,生成权限验证路径,快速有效地检测权限控制漏洞,相对于已有方法,扩大了权限控制漏洞检测范围并提升了检测准确性。设计了漏洞检测工具AccVulhunter,针对7个Web内容管理系统进行了漏洞检测实验,证明了漏洞检测算法的有效性,下一步将优化数据流分析和节点识别算法,进一步加快工具扫描速度。

[1]刘金晓,马素霞,齐林海.Web应用系统中权限控制的研究与实现[J].计算机工程与设计,2008,29(10):2550-2553.

[2]Kolovski V,Hendler J,Parsia B.Analyzing web access control policies[C]//International Conference on World Wide Web(WWW 2007),Banff,Alberta,Canada,May 2007:677-686.

[3]OWASP.Owasp top 10-2013 the ten most critical Web application security risks.[EB/OL].[2013-06-12].https://www.owasp.org/index.php/Top10#OWASP_Top_10_for_2013.

[4]Jovanovic N,Kruegel C,Kirda E.Precise alias analysis for static detection of web application vulnerabilities[C]//The Workshop on Programming Languages&Analysis for Security,2006:27-36.

[5]Su Z,Wassermann G.The essence of command injection attacksin web applications[J].ACM Sigplan Notices,2006,41(1):372-382.

[6]Dalton M,Kozyrakis C,Zeldovich N.Nemesis:Preventing authentication & accesscontrolvulnerabilitiesin Web applications[C]//Proceedings Usenix Security Symposium,Montreal,Canada,2009:267-282.

[7]Stergiopoulos G,Katsaros P,Gritzalis D.Automated detection of logical errors in programs[C]//International Conference on Risks and Security of Internet and Systems,2014:35-51.

[8]Gauthier F,Letarte D,Lavoie T,et al.Extraction and comprehension of moodle’s access control model:A case study[C]//Conference on Privacy,Security and Trust(PST 2011),Montreal,Québec,Canada,2011:44-51.

[9]Letarte D,Merlo E.Extraction of inter-procedural simple role privilege models from PHP code[C]//Working Conference on Reverse Engineering,2009(Wcre’09),2009:187-191.

[10]Sun F,Xu L,Su Z.Static detection of access control vulnerabilities in Web applications[J].Shanxi Architecture,2011,2:6392-6396.

[11]Gauthier F,Merlo E.Fast detection of access control vulnerabilities in PHP Applications[J].Reverse Engineering,2012:247-256.

[12]Zhu J,Chu B,Lipford H.Detecting privilege escalation attacks through instrumenting Web application source code[C]//Proceedings of the 21st ACM on Symposium on Access Control Models and Technologies,2016:73-80.

[13]Liu T,Lin Y,Wen X,et al.BindingDB:A Web-accessible database of experimentally determined protein-ligand binding affinities[J].Nucleic Acids Research,2007,35(S1):198-201.

[14]Hills M.Streamlining control flow graph construction with DCFlow[C]//International Conference on Software Language Engineering.[S.l.]:Springer International Publishing,2014:322-341.

[15]Nandi A,Mandal A,Atreja S,et al.Anomaly detection using program control flow graph mining from execution logs[C]//Proceedings of the 22nd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining,2016:215-224.

猜你喜欢
漏洞页面节点
漏洞
刷新生活的页面
CM节点控制在船舶上的应用
Analysis of the characteristics of electronic equipment usage distance for common users
基于AutoCAD的门窗节点图快速构建
三明:“两票制”堵住加价漏洞
漏洞在哪儿
高铁急救应补齐三漏洞
抓住人才培养的关键节点
网站结构在SEO中的研究与应用