动静结合挖掘Web漏洞 NAVEX: Precise and Scalable Exploit Generation for Dynamic Web Application

原文链接:https://www.usenix.org/system/files/conference/usenixsecurity18/sec18-alhuzali.pdf

1 Introduction

现代Web应用程序通常包含客户端、服务端和数据库三层架构,而且包含许多的动态特性,会根据用户的交互和输入动态地生成内容。这些动态特性增加了Web应用的复杂性,并提高了分析的难度。目前有动态分析的方法,如SQLI和XSS,但这些方法的会生成错误警报,因此需要手动检查每个报告的漏洞是否确实可被利用,并不能做到自动化;当然也有静态分析的方法,它能很好地覆盖应用程序,但由于与处理复杂程序工件相关的技术挑战,它们经常牺牲精度,这是产生假阳性的主要原因之一,并且静态分析在动态特征的分析时很难静态建模,极大的降低了可用性。

论文的主要贡献在于为具有动态特性的多层Web应用提供了一种精确的脆弱性分析方法。作者的方法不是遵循严格的静态分析策略,而是将Web应用程序的动态分析与静态分析相结合,以自动识别漏洞并生成具体的利用漏洞作为这些漏洞的证据。

作者实现一个名为NAVEX的工具来自动识别漏洞,并生成相应的exploit。最后作者对26个PHP CMS进行了测试,发现NAVEX一共构建了204个具体的exploit,其中195个与SQLI和XSS漏洞相关,9个与EAR(Execution After Redirect,重定向后执行)漏洞相关。

2 Architecture and Algorithms

NAVEX的工作机制如上图所示,主要分为两个阶段,第一阶段是Vulnerable Sinks Identification(静态分析阶段),目的是找到候选的漏洞点及其触发漏洞的漏洞利用字符串;第二个阶段是Concrete Exploits Generation(动态分析阶段),目标是生成具体的exploit,由从公共页面到sink点所在页面会产生的一系列HTTP请求组成。

2.1 Vulnerable Sinks Identification

在静态分析阶段,作者在NAVEX中定义了一个Attack Dictionary,由四个部分组成:(i)Sinks,敏感函数;(ii)Sanitization,常见的过滤函数或是过滤方式;(iii)Traversal type,遍历方向,分为前向回溯和后向回溯;(iv)Attack Strings,触发漏洞的攻击字符串,是一个fuzz字典。

首先,对每个潜在漏洞的模块建立图模型:作者对图模型生成工具phpjoern进行了扩展,加入了节点的过滤信息。

然后,对代码属性图进行遍历来寻找从source点到sink点的路径,对于注入类漏洞统一采取后向回溯的方式,根据PDG关系寻找攻击路径;对于EAR漏洞采取前向遍历的漏洞方式。

最后,用符号执行生成公式后利用约束求解器求解哪些路径可以被利用,输出是触发漏洞的exploit string,在第二阶段会被使用。

2.2 Concrete Exploits Generation

从上图可以看到,动态分析阶段分为3个步骤:

a. Dynamic Execution

这一步的目的是生成从公共页面到sink点所在页面会产生的HTTP请求,涉及到前端约束提取求解以及后端约束提取求解。

前端约束提取是利用爬虫完成的,Crawler爬取HTML页面中的表单属性信息并生成约束F(html),同时爬取验证表单信息时会用到JavaScript代码并生成约束F(js)。最后生成最终的前端约束F(form)=F(html)∧F(js),用约束求解器Z3求解生成相应的表单input。

除了客户端的约束之外,服务端也会对用户的输入做一些限制,所以还需要满足服务端的约束。NAVEX会动态跟踪判断用户输入是否满足服务端约束,该判断主要基于两种方式:(i) 是否更改程序状态(有无新的session生成,是否有新变量生成等); (ii) 是否有敏感操作被执行,如sql查询操作等。如果检测到请求没有成功,NAVEX会将后端的约束也加入到前端约束中,用约束求解器重新生成的新input进行提交,这个过程会重复多次,直到请求成功为止。

b. Navigation Graph

NAVEX会将上一步动态执行生成的相关HTTP请求信息都存储到Navigation Graph,G = (N, E)中,该图结构如下图所示:

上图中,每一个节点表示一个完整的HTTP请求,边表示跳转的方式(通过链接link或是表单form进行跳转)。单个节点中,ID是节点的唯一标识符,URL是HTTP请求中的URL,Form_Params存储表单的输入,Role存储爬虫时用到的登录凭证。

c. Final Exploit Generation

最后NAVEX会结合静态分析阶段得到的漏洞模块及其对应的exploit string对Navigation Graph进行遍历,最后会得到完整的攻击请求链接。

3 Evaluation

作者对26个PHP CMS进行了测试,数据集包含22.7K PHP文件,代码行数超过了3.2M行。针对这些CMS,NAVEX共构造了204个具体的exploit,以SQL注入漏洞为例:

对于SQL注入漏洞,NAVEX仅关心4种敏感函数:

mssql_query, mysql_query, mysqli_query,sqlite_query

最后NAVEX在37m 45s内找到了155个SQLI漏洞点,并在7m左右生成了与之对应的exploit。

作者同时对NAVEX的性能进行了评估。如下图所示,作者发现在CPG中加入sanitization tag和database constraint tag之后,找到的漏洞点的误报被大幅度减少。

除此之外,在动态分析阶段对客户端代码进行分析也在一定程度上提高了程序覆盖率,生成的exploit的数量也随之增加了。

最后,因为Chainsaw支持SQL注入漏洞和XSS漏洞的exploit生成,作者将NAVEX与Chainsaw进行了对比,结果如下图所示。除了SchoolMate之外,对于其余参与测评的8个cms,无论是在生成exploit的数量上还是效率上,NAVEX都有更好的表现。

4 Conclusions

本文的创新点在于采用了动静结合的分析方法,扩大了程序的覆盖范围,因此相比于先前的静态审计工具能找到更多的漏洞。相较于作者先前的发表在CCS 2016的工作Chainsaw,在静态分析阶段,作者采用扩展后的代码属性图挖掘攻击路径,利用sanitization tag和database constraint tag过滤掉很多不可利用的路径来防止路径爆炸,所以在效率方面也有较大幅度的提升。同时,phpjoern生成的CPG图不支持动态函数调用的问题也导致了NAVEX会遗失一些潜在的漏洞点。

转载于:https://mp.weixin.qq.com/s/FA0quMBlzcJOUKhma7aSAA