当前位置: 首页 > > 天 方 夜 “谈” 第2期 | NAVEX:动态Web应用程序的精确可扩展漏洞利用生成

天 方 夜 “谈” 第2期 | NAVEX:动态Web应用程序的精确可扩展漏洞利用生成

发表于:2020-03-18 20:53 作者: 方滨兴班 阅读数(12035人)

NAVEX: Precise and Scalable Exploit Generation for Dynamic Web Application

本文发表于Usenix Security 2018,作者:Abeer Alhuzali,Rigel Gjomemo,Birhanu Eshete,V.N. Venkatakrishnan。

1. 背景介绍

现代Web应用程序通常被设计为多层应用程序(客户端、服务器和数据库等)。它们包含许多动态功能,可根据用户交互和其他输入"生成"对应内容。这种动态特征有助于提高应用程序的可用性和对用户的响应性。但是这些功能增加了Web应用程序的复杂性,并增加了分析其安全性的难度。

目前现存的几种漏洞分析技术可用于静态分析,以识别SQL注入和跨站脚本伪造(XSS)等漏洞。但是这些方法的缺点是它们只是产生漏洞警报,需要人工分析该漏洞是否可被利用。

也有其他方法尝试通过生成具体漏洞自动利用来判断漏洞是否可用。但是上述的方法都是使用静态分析技术。虽然静态分析技术有很高的代码覆盖率,但是由于Web程序的复杂性,静态分析会产生很高的误报率。尤其是在Web应用程序的动态特征下,其内容(表单、链接、JS代码)通常是在文件中生成的,并在不同层级执行,效果具有动态性和多样性,很难静态建模。

2. 本文提出的思路

在本文中,作者们的主要工作是提出对具有动态功能的多层Web应用程序进行漏洞分析的精确方法。作者们的方法不是严格遵循静态分析策略,而是将Web应用程序的动态分析和静态分析相结合,以自动识别漏洞并生成漏洞利用,作为验证漏洞可利用的证据。动静态分析相结合的好处有:

首先,动态执行组件通过显示运行时状态来降低静态分析所面临的复杂性,这些状态不需要静态建模。另一方面,静态分析组件分析应用程序路径并提供输入来实现这些路径,从而引导其动态对应最大化应用程序的覆盖范围。

其次,作者们的方法适用于非常大的应用,效果超过现有的技术。可扩展性增加的主要原因是动态执行组件降低静态分析组件所面临的多种状态的复杂性。

此方法的另一个目标是以最小的分析开销实现针对不同类型漏洞的自动漏洞利用技术。为了实现这一目标,作者们的方法设计了几个分析模版和一个用于实例化每个模版的攻击字典。此方法看似与其他静态方法识别漏洞相似。但此方法还包括:应用精准的动态分析技术和自动生成识别漏洞利用技术。

作者们实现的系统叫做NAVEX,NAVEX的操作分为两个步骤:

1.使用符号执行创建Web应用程序的各个模块的行为模型。为了解决可拓展性问题,作者们仅优先考虑那些包含潜在易受攻击的输入模块(输入模块是攻击者可能注入恶意代码或利用其他类型漏洞),并在后续搜索中分析它们。

2.作者们构建了实际的exp。这需要对整个应用程序进行建模并发现一系列HTTP请求,这些请求会使应用程序执行易受攻击的输入模块。为了解决此阶段的可扩展问题,作者们对已部署的应用程序执行动态分析,并在服务器端使用Web爬虫和concolic执行器来发现可能导致攻击者进入易受攻击的输入模块可能的HTTP请求路径。为了在动态分析期间最大化代码的覆盖率,爬虫和concolic执行器由约束求解器辅助,约束求解器生成(漏洞)HTTP输入序列。

表1-3提供了一个简单的图书借阅Web应用程序,将在本文中用于说明作者们的方法。

可以通过selectBooks.php模块中的Web表单选择书籍(第23-38行)。SelectBooks.php使用JS验证一些用户输入(第31-36行)。用户输入由服务器端代码进一步验证和清理(第4-12行)。接下来,模块查询数据库以检查书籍可用性(第17行)。根据查询结果,$_SESSION['ISBN']被初始化并将连接到hold.php的HTTP链接打印到浏览器上。

图片.png

表 1:selectBooks.php

Hold.php执行附加检查,如果正确,HTTP链接将引导用户进入下一步(第7行)。单击链接时,将设置全局变量$_GET['step'],因此hold.php包含模块checkout.php并执行。Checkout.php通过向用户提供链接(第19行)来完成对借用过程的确认。该链接设置两个超级全局变量($_GET['step']和$_GET['msg']),并使用模块进行检查(第6行)。最后调用确认功能(第13行)以通知用户该书已成功保留。

图片.png

表 2:hold.php

图片.png

表 3: checkout.php

该示例包含易受注入和逻辑攻击的敏感输入单元。例如,Listing1(第17行)中查询通过变量$_publisher可以进行SQL注入,该变量在到达输入函数之前没有进行过滤。str替换功能(第13行)在清理$_publisher时仍然可以使用不涉及双引号的SQL注入。Listing3中的echo调用易受XSS攻击,因为用户输入$_msg未进行过滤。Listing1第3行的输入函数易受到执行重定向(EAR)逻辑攻击,因为在调用标头后执行(将执行重定向到另一个PHP模块)不会停止,因为没有调用执行终止之后的功能。因此,无论第2行的检查如何,都将执行以下语句。由于这些语句包含易受攻击的SQL查询,因此问题进一步恶化。攻击者可以在不需要首先登陆的情况下运行SQL漏洞利用程序。

3. 技术路线

作者们的目标是构建一个精确,可拓展且高效的漏洞利用生成框架,该框架考虑了Web应用程序的动态特性以及源自客户端、服务器端和数据库后端之间依赖关系的路径复杂性。作者们的方法在一个名为NAVEX的系统中实现,如图1所示。为了解决可扩展性挑战,作者们的方法分为两个步骤:(I)易受攻击的识别和(II)具体的漏洞利用生成。

图片.png

图1:Navex的架构

给定应用程序源代码:

第一步确定应用程序和相应模块中的易受攻击的输入单元。这个阶段分别对每个模块进行分析,对于优先考虑那些存在漏洞的模块至关重要;因此显着减少了搜索空间并有助于扩展性。为了解决输入单元可达性的难题,NAVEX构建了内置过滤例程语义的精确表示。此外,对于自定义过滤,它使用符号约束构建模型。约束求解器使用这些约束来确定过滤是否足够稳健。

第二步是负责产生具体的漏洞。自动生成具体漏洞的主要问题是识别应用程序范围的路径,从面向公众的页面开始,通过一系列HTTP请求将执行驱动到第一步中识别出的易受攻击的输入单元。动态执行的输出是导航图,表示Web应用程序的路径结构。

最后,对于包含易受攻击的输入单元的每个模块,如第一步所述,NAVEX使用导航图来查找从公共模块到可执行漏洞利用的模块的路径。NAVEX通过结合动态分析和应用程序的符号执行来解决动态特性的难题。

4. 导航图

动态执行步骤生成的导航图表示应用程序的导航行为。它是有向图G=(N,E),其中每个节点n∈N表示HTTP请求,并且每个边表示从的导航,其可以是类型链接或形式。特别地,每个边表示发起请求的页面。图表中的每个节点都具有以下属性id,URL,role和form_params,用于表示由表单提交生成的HTTP请求的节点。id属性存储节点的唯一标识符,URL属性是HTTP请求中的URL,它由请求的模块名称和HTTP参数组成,role属性包含用作爬网程序输入的登录凭据,如图2所示。重要的是要注意导航图可以包含与同一PHP模块关联的多个节点。特别是,如果PHP模块可以接受输入变量的不同组合,则每个这样的组合由NG中的对应节点表示。

图片.png

图2:运行实例导航图

图2中列出了与实现相关的示例,例如,由解算器生成的表单输入值的一个可能的表单提交由节点2和3之间的边缘表示,而其他边缘表示链接导航。注意,hold.php与两个不同的节点相关联,每个节点具有输入变量的不同组合(即,HTTP参数)。在探索可利用模块的路径时,此表示在下一步中至关重要。

5. 最终漏洞利用生成

NAVEX执行预处理包含解析步骤,该步骤创建存储文件包含关系的包含图。通过执行遍历来构造映射,该遍历在增强的CPG中搜索表示对文件包含PHP函数的调用的节点(例如,require,include等)。

一旦包含解析步骤完成,NAVEX使用NG和生成的包含图来搜索NG上的路径,从公共模块到可利用模块(或其包括父项)。值得注意的是,先前对可能被利用的易受攻击的汇的识别大大降低了此类搜索的成本,并增加了发现可执行漏洞的可能性。

搜索的第一个输入是来自NAVEX的步骤I的对{(模块,漏洞利用)}的集合。模块表示易受攻击的模块,exploit表示将恶意值分配给解算器生成的输入。下一个输入是InclusionMap和SeedURL,它们代表可公开访问的模块。对于每个易受攻击的模块,使用包含映射和漏洞利用中的参数,算法首先找到可能的目标节点,这将是图搜索的目标(第5行)。这些节点(DestURL)表示易受攻击的模块或其父节点(如果父PHP模块包含易受攻击的模块)。 GetDestURLs仅返回NG的节点,其参数名称与相应漏洞中出现的参数名称匹配。函数ExpSearch首先识别其URL与其中一个SeedURL匹配的节点(即匹配URL属性)(第11行)。然后,遍历探索每个检索到的SrcNode的NG,以找到源节点和DestURL之间的路径(第13行)。最后,对于每个找到的路径,它将最后一个边缘的HTTP参数值替换为求解器生成的恶意值。

6. 实现

NAVEX的实施基于几个现有工具,其中大部分工具已经扩展到可以解决作者们的问题。对于作者们方法的第一步,代码属性图的PHP扩展通过附加标记得到增强,以实现精确的污点跟踪和数据库约束推理。然后将增强的CPG导入Neo4j图形数据库,这是一个用于创建和查询图形数据库的开源图形平台。

对于约束求解,作者们利用Z3求解器及其扩展Z3-str。特别是,当图遍历报告漏洞的易受攻击路径时,NAVEX会分析返回的路径及其节点。根据每个节点类型,自动创建表示节点的三地址代码(TAC)公式。TAC公式由右操作数(rightOp),运算符,左操作数(leftOp),节点类型和唯一节点id组成。 然后,NAVEX开始根据其类型分析每个TAC公式。基于operator,leftOp,rightOpNAVEX生成:(1)适当的Z3变量声明,(2)在Z3规范中复制PHP运算符语义的一组断言,以及(3)分配适当攻击的断言从作者们的攻击字典到公式中的每个接收器变量的字符串。NAVEX支持赋值,一元,二元,条件,内置函数和强制转换语句类型。TAC公式分析和Z3转换引擎代码大约是3600 Java LOC。

对于第二步,作者们通过添加对表单和JavaScript代码的支持,从表单中提取约束以及生成Z3断言来扩展crawler4j。为了处理JavaScript,作者们使用了Narcissus JavaScript引擎的扩展,它增加了以符号方式评估JavaScript代码的能力。然后,从与表单输入相关的JavaScript中提取的约束被转换并与表单约束组合并由Z3解决。

为了生成服务器端执行跟踪,作者们利用了Xdebug,一个用于PHP代码的开源调试器。请注意,与任何调试工具一样,Xdebug会产生性能问题,例如由于跟踪生成而导致的HTTP响应延迟。因此,为了保持可接受的性能,NAVEX调用Xdebug并按需分析跟踪。

从广义上讲,NAVEX中实现的技术可用于为非PHP Web应用程序生成漏洞。在实现级别,如果目标源代码表示为CPG,目标语言功能的模型(即内置函数,运算符等)作为求解器规范可用,则NAVEX适用于其他服务器端语言,并且使用合适的服务器端执行跟踪工具。

7. 评估

1】数据集

作者们在26个真实的PHP应用程序上评估了NAVEX,其组合代码基础为3.2M SLOC和22.7K PHP文件,如表1所示。作者们选择应用程序的标准包括:(i)评估流行的,复杂的和大型PHP应用程序的最新版本,如Joomla,HotCRP和WordPress,以及(ii)NAVEX与开发利用程序(例如,Chainsaw)和漏洞分析(例如RIPS)中最先进工作所使用的相同测试应用程序的比较。

【2】建立

NAVEX部署在Ubuntu 12.04 LTS VM上,每个内核拥有2核2.4GHz和40GB RAM。作者们首先生成了增强型CPG,并使用它来为所有26个应用程序找到可利用的路径。然后,作者们部署了具有可利用路径的应用程序。部署过程包括:在服务器上安装每个应用程序,为每个角色创建登录凭据,并通过导航应用程序并在必要时提交表单来使用初始数据填充应用程序数据库。作者们拍摄每个应用程序数据库的快照,并在每次爬网后使用它来恢复数据库的原始状态。请注意,由于每个应用程序的特定部署指令,作者们无法利用自动化来包含更多要评估的应用程序。如果有足够的时间进行手动部署,NAVEX可用于分析和生成数百或数千个应用程序的漏洞。

【3】结果摘要

NAVEX共构建了204个漏洞,其中195个正在注入,9个是逻辑漏洞。消毒标签增强的CPG平均减少了假阳性(FP)87%。包含用于构建导航图的客户端代码分析平均提高了利用率生成的精度54%。在评估集上,NAVEX能够向下钻取6个HTTP请求以拼接攻击。