KameleonFuzz:黑盒XSS检测的进化模糊测试(半机翻有删增)
摘要
模糊测试包括自动生成恶意输入并将其发送到应用程序,以便有可能触发漏洞。模糊测试需要这样的问题:在哪里模糊?模糊哪个参数?在哪里观察它的影响?等等
在本文中,我们特别针对以下问题:如何模糊参数?如何观察其影响?为了解决这些问题,我们提出了KameleonFuzz,一个用于Web应用程序的blackbox Cross Site Scripting(XSS)fuzzer(模糊器)。
KameleonFuzz不仅可以生成利用XSS的恶意输入,还可以检测它揭示漏洞的接近程度。恶意输入的产生和演变是通过一种由攻击语法引导的遗传算法实现的。双重污点推断,直到浏览器解析树能够精确检测利用代码是否成功执行。我们的评估显示没有误报并且有着很好的 XSS 漏洞检测功能:KameleonFuzz检测到其他黑盒扫描仪遗漏下来的漏洞。
介绍
现状
在过去几年中,XSS臭名昭着地保持其在最大漏洞中的地位。犯罪分子使用XSS在Paypal,Facebook和eBay等网站上执行恶意活动,例如垃圾邮件,恶意软件运营商或用户模仿。由于此类网站的复杂性和代码大小,XSS的自动检测是一个非常重要的问题。在访问源代码的情况下,白盒技术的范围从静态分析到仪表化代码的动态监控。如果二进制或代码不可访问,则黑盒方法会生成输入并观察响应。此类方法独立于用于创建应用程序的语言,并避免了线束设置。由于它们模仿外部攻击者的行为,因此它们对于安全目的非常有用,并且可以测试诸如Web应用程序防火墙之类的防御。用于Web应用程序的自动黑盒安全测试工具早已存在。然而,即使在2012年,这类工具的故障检测能力也很低:最好的只能检测到40%的 存储型XSS,而1/3 完全没有检测到。这是由学习知识不精确,近似判断和有限的攻击值集
Web漏洞的自动黑盒检测通常包括:第一个“爬行”以推断应用程序的控制流(以下称为宏状态感知),然后“Fuzz”以生成可能表现出漏洞的恶意输入。与不具有宏观状态意识的扫描仪相比,Doup等人。通过推断控制流模型来增加漏洞检测能力。在LigRE,Duch 等人使用污点流量推理扩展此类模型,并引导fuzzer 更进一步提高检测能力。
XSS是一个涉及 控制+污点流和输入过滤的问题。即使是基本的过滤器,许多扫描仪也难以创造适当的输入,从而产生误报。为了解决上述问题,我们提出了KameleonFuzz,这是一种LigREextension,它通过对最有希望的恶意输入和污染流进行演化和优先排序来模仿人类攻击者。我们在KameleonFuzz中加入了一个精确的测试结果,它依赖于现有的浏览器解析和双重污染推理。
我们的方法
KameleonFuzz是一款针对反射型和存储型 XSS的黑盒fuzzer,可以生成完整的开发序列。如下图所示,它包括学习应用程序模型和生成恶意输入。我们重用了其中的组件A,B,C。本文的主要贡献是块D1和D2。
XSS涉及从HTTP请求Isrc上的模糊值xsrc到易受攻击的语句Odst(HTML页面)的污点流。在反射型 XSS中,xsrc直接在当前输出中出现,而在存储型 XSS中,xsrc存储在中间存储库中并在稍后反射。
步骤A,控制流程推断学习如何在应用程序中导航。
给定接口和连接参数(例如,认证凭证),以具有实例化参数值的扩展有限状态机的形式学习模型,以及两级层次结构(节点和宏状态)。推断的模型可能不完整。
步骤B,近似污点流量推断检测到可能性
通过观察在请求Isrc中发送的值xsrc的反射到输出Odst(HTML页面)中的XSS。它在模型上生成步迹,并近似地推断出污点。子字符串匹配算法与启发式一起使用以避免漏报。下图显示了一个对照+污染流模型。
- 为清楚起见,我们仅表示转换上的输入,输出对应于彩色节点。
- 每种颜色对应一个宏观状态。输入由HTTP方法(例如,POST),URL的一部分(例如,/?)和POST参数(例如,{‘message2’:’2_e_g_a_s_sem’})组成,形式化控制+污点模型。
步骤C,通过应用一种称为斩波的特殊形式的切片来修剪对照+污染流模型。这减少了搜索空间。
块D.1(恶意输入生成)和D.2(精确污染推论)是本文的重点
通过攻击语法参数化的遗传算法(GA)演变恶意输入。攻击语法通过约束生成下一代输入的变异和交叉运算符来减少搜索空间并模仿人类攻击者的行为。
我们定义了一种有利于XSS攻击的最合适输入的功能。
由于服务器过滤器可能会改变反射点Odst处的观察值,因此单纯的子串匹配可能无法准确地推断出污点,这可能导致漏报。 为了克服这些限制,我们进行双重污染推理。 我们在第3节中详细介绍了这些子组件。
贡献
本文的贡献是:
- 第一个基于黑盒模型的GA驱动fuzzer,可检测反射型和存储型XSS;
- 模型推理和模糊测试的结合;
- 该方法的实施及其评估。
说明示例
P0wnMe是一个易受攻击的应用程序。登录后,用户可以保存新笔记,查看已保存的笔记或注销。
P0wnMe上的KameleonFuzz执行在图1的步骤A和B中,LigREin一个控件+污点
一个简化的extract1的模型如图2所示。控制流由普通箭头(过渡)和节点表示。污点流源自在Isrc中发送的粗体文本xsrc,以及反射在Odst中的(虚线箭头)。例如,输入参数msg的值egassem_ 被发送到 7->17 的转化中 并在输出转化 18->21 中被反射
图2包含了一个在转换7中发送的参数message2的值2_e_g_a_s_sem_ 33.输出Odst的摘录是
<input name ="message2" value ='2_e_g_a_s_sem'/>
其中我们突出显示反射。在这里,反射上下文位于标记属性值内。上下文中 了解攻击者如何生成fuzzer。清单1显示了此服务器的服务器清理程序信息。它阻止了简单的攻击
1 <?php function webapp_filter($str) {
2 if(eregi(’"|‘|>|<|;|/’,$str)) {
3 $filtered_str = "XSS attempt!";
4 } else {
5 $filtered_str = str_replace(" ","",$str);
6 }
7 return $filtered_str;
8 } ?>
攻击者搜索模糊值s.t. 如果通过过滤器,然后它的反射在语境中没有语法上的含义,即它跨越了解析树中的不同层次
表1显示了测试WebApp时由黑盒开源扫描程序w3af发送的模糊值。W3af迭代一组模糊值。它没有从以前的请求中学习,也没有考虑到反射的内容。
在步骤D中,KameleonFuzz生成个体,即正常输入序列,其中它使反射值模糊。 斩波(LigRE的步骤C)产生输入序列。 攻击语法产生模糊值。 对于每个人,精确地推断出污点。 它是测试结果的输入(这个人是否触发了XSS?)和适当评分(这个人触发XSS的距离有多近?)。 最好的个体根据攻击语法相互重组以创建下一代:例如,第1代的个体3和4产生第2代中的个体1。该过程被迭代直到测试者定义停止条件满足( 例如,找到一个XSS)。 表2说明了这种演变。
最后一个人的输出Odst的摘录是
<input name ="message2" value ='WUkp'nt onload ='alert(94478)'/>
由于清单1中的清理程序删除了空格,而不是\t,\r或\n,因此这是是一个成功的XSS漏洞,作为反射的语法连接违反了xsrc的行为。这个例子说明了进化输入生成如何适应过滤器。在下一节中,我们将详细介绍我们的模糊测量技术的进化特性。
进化 Fuzz
模糊测试(图1中的步骤D)生成一群个体(GA术语)。个体是由LigREin生成的输入序列,KameleonFuzz根据反射的攻击语法生成模糊值xsrc参数。如算法1中所述,该群体是通过突变和交叉算子 w.r.t进化而来的
差异
个体是针对特定反射的输入序列。 它包含从切片模型中提取的非恶意输入序列,以及模糊值xsrc。
该序列包括始发过渡Isrc,以及观察反射Odst的过渡。
攻击语法
为了约束搜索空间(的A* 子集,A是目标编码的字母表),我们使用攻击语法来生成模糊值。该语法还约束了变异和交叉算子(算法1的第3,14,16行)。攻击者会尝试向应用程序发送此类模糊值。与w3af和skipfish中的有效载荷列表相比,攻击语法可以生成更多值,并且由于其层次结构而更易于维护。
用于构建攻击语法的知识包括HTML语法,在上下文改变的情况下的字符串转换,已知的攻击向量。
我们尝试了如何构建攻击语法,因为它是手动编写的,它的自动生成是一个研究方向。图3说明了它的结构。
第一个生产规则包括表示和上下文信息。在属性值(<input value =“reflection”/>
)内部和标签外部(<h1>
反射)是反射的示例行为背景。该表示由编码,字符集和特殊字符串转换函数组成,我们将其命名为anti-lter(例如,PHP addslashes)
为了创建攻击语法,我们假设S的可用性,一组有代表性的易受攻击的Web应用程序(与测试的应用程序不同)和相应的XSS漏洞。对于每一个反射内容,分析师以终端和非终端的生产规则的形式写出了XSS漏洞的概括。
如果生产规则包括OR或REPEAT操作符,她根据S的利用频率分配选择权重。如果没有分配权重,则所有选择权重相等。一旦创建,我们使用此攻击语法对测试的应用程序进行模糊测试。
我们用扩展的Backus-Naur形式代表语法,重复次数有限。通过构造,攻击语法是非循环的。因此,它展现了很多可能性。附录C的清单3包含攻击语法的摘录。
生成模糊值包括遍历其生产规则,并在适用的情况下执行选择。从模糊值生成相应的字符串包括连接通过深入探索上下文子树获得的字符串,在给定的字符集中表示此字符串,应用防过滤器函数,以及应用编码函数。例如,由图4的模糊值产生的字符串是WUkp’nt onload =’alert(94478),在UTF-8字符集中,身份函数作为反字符应用,并且没有最终编码改变(节点平原)
精确污染流量推断(D.2)
精确的污点流量推断允许获得关于反射背景的信息,这稍后用于计算精确的测试判定,并且是适合函数的输入
用于产生污点感知的解析树Tdst如图5所示。
首先,在模糊值xsrc和反射它的输出Odst之间应用字符串到串的污点推理算法(例如,用Levenshtein编辑距离)。 并行地,解析器(例如,来自谷歌浏览器)评估应用程序输出Odst并产生解析树Pdst(例如,文档对象模型(DOM))。 然后在xsrc和Pdst的每个节点之间推断出污点以产生Tdst,一个污染感知的解析树(见图6),如下所示。
对于输出解析树Pdst的每个节点,我们计算每个受污染的子串与节点文本值之间的字符串距离。然后我们只保持最低的距离得分。
如果此分数低于测试人员定义的阈值,则此节点将标记为受污染。在邻居节点群具有接近阈值的距离\的情况下,这种污点条件可以略微放松。推断的污点感知解析树Tdst是用于适合函数和测试判定的输入。
重要的是要注意,我们依赖于真实的解析器,而不是编写我们自己的解析器。这有两个好处。首先,我们是
关于解析器是灵活的(例如,对于XSS:Chrome,Firefox,IE;对于其他漏洞,例如SQL注入,我们可以依赖于SQL解析器)。其次,我们确定检测到的漏洞的实际适用性。
测试结论
测试判决回答了问题,这是否触发了XSS漏洞?。污点感知解析树Tdst(图6)与一组污点感知树模式匹配(例如,图7)。如果至少 一个模式匹配,然后是XSS漏洞利用(即,测试判定将输出yes,检测到漏洞)。
污点树模式是在其节点上包含正则表达式的树。这些正则表达式可能包含字符串(例如,脚本),污点标记,重复运算符(+,*)或匹配所有字符(。)。 测试人员可以提供自己的模式。
我们在KameleonFuzz中加入了XSS漏洞的默认模式。 这些都违反了污点价值的句法连接。图7中所示的第二个模式与图6中表示的解析树相匹配。
适应性
适应度函数评估单项发现XSS漏洞的“接近程度”。值越高,GA进化过程就更有可能选择这个个体的基因来创造下一代。 函数的输入是个体I,具体输出Odst,其中反映了在转换Isrc中发送的模糊值xsrc,Tdst = taint(parse(Odst); xsrc)taintaware解析树,以及应用模型M.在成功的XSS攻击的情况下,完整性维度与我们在模糊值和反射之间观察到的属性有关。这些尺寸列于表3中,我们绘制了当前使用的适应性函数的草图。
这些维度模拟了人类渗透测试员可能具有的几种直觉。最重要的是:
1.成功注入的特征类的百分比。
组成单个模糊值树的叶子的字符(参见图4)根据它们在语法中的含义被分类为类。该度量表示所考虑的反射的“注入功率”。
2.解析树中受污染节点的数量。
尽管注入几个字符类很重要,但攻击者对多个解析树节点施加控制并不是一个充分条件。 成功的XSS注入通常以至少两个邻居被污染的节点为特征(一个被认为是连接反射,另一个包含有效载荷和一个有效载荷的触发器)。 因此,如果攻击者能够反映几个节点,我们预计它会增加利用潜在漏洞的机会。
3.个人的奇点w.r.t.它的当代。 ???
遗传算法的一个问题是过度专业化会限制探索的空间并不断发现相同的缺陷。 为了避免这个陷阱,我们计算一个人与当代人的“how singular”。该维度使用源转换Isrc,模糊值xsrc和反射上下文(即,目标转换Odst和解析树Tdst中的受污染节点)
4.Isrc与其Reflection Odst之间的转换次数
源转换Isrc与其Reflection Odst之间的转换次数越高,检测该漏洞的难度就越大,因为它会扩展搜索树。
5.发现新页面或宏状态:
增加应用程序覆盖率。
6.变异和交叉运算符
概率分布决定个体是否会发生变异。当发生突变时,可以在模糊值或输入序列上应用运算符。模糊值变异操作符在模糊值xsrc的生成树上工作(参见图4)。我们实现了几种策略来选择要变异的节点以及如何变异(例如,均匀分布,最近最少使用,……)。
突变的幅度是适应性得分的递减函数:如果个体具有高适应性得分,则突变将针对生产树中接近叶子的节点 类似地,在低适应性得分的情况下,操作员更可能改变靠近根的节点。应用于图4的模糊值变异的一个例子在于对HANDLER非终端执行不同的选择(例如,onmousover而不是onload)。输入序列变异算子在整个序列I上工作。它包括从源Isrcto到目标Odst的模型中的另一条路径,或者针对不同的反射交叉运算符在模糊值级别工作,即在生产树上工作。它的输入是两个高分数的人。它产生两个孩子。
实施
KameleonFuzz是一个针对反射型和存储型XSS的python3程序。它由4500行代码组成。如图8所示,我们使用Selenium库对Google Chrome 进行测试。我们使用LigRE,一个控件+污点流模型推理工具和切片器。
讨论
方法限制
重置:
我们假设能够在初始状态下重置应用程序,这可能并不总是实用的(例如,在测试用户连接的实时应用程序时;我们会处理副本)或者可能需要时间。然而,这并没有打破黑盒线束的假设:我们不需要知道如何存储宏状态(例如,数据库)。
生成攻击语法:
生成攻击语法:编写攻击语法需要了解之前中提到的参数。 这项工作还是手动的。该语法生成的语言大小与故障检测能力之间的权衡还有待研究。
过于狭窄的生成语言(例如,很少产生针对给定上下文的模糊值或非常少的上下文)可能限制故障检测能力,而过于重要的语言可能具有有限的效率。此外,攻击语法与目标注入子系列(例如,XSS,SQL注入等)相关联,因此对人类输入的需求是当前限制。 在自动化这一代过程中有研究的空间。
XSS模型假设:
我们假设XSS只是一个模糊值的结果。我们目前的方法可能在XSS上有误报,涉及一次至少两个模糊值的模糊测试。据我们所知,没有扫描仪可以处理这种情况。
使用LigRE的限制:
如果客户端不解释JavaScript时,KameleonFuzz支持Ajax应用程序,则它们具有相似的功能。 LigREreRequires在应用程序中识别非确定性值。
编码:
污点的精确度和效率 推断取决于所考虑的编码转换。实现了Plain,url和base64编码。LigRE和KameleonFuzz可以扩展到支持更多。
相关工作
黑盒方法中的XSS测试判定
基于连接的方法:
假设恶意输入在给定级别(词法或语法)中破坏结构。正如Sekar的工作,我们依赖于非语法连接,我们使用既有语法又有污点的检测策略。一个关键的区别是Sekar编写了自己的解析器来传播污点,而我们使用浏览器的解析器(例如Google Chrome)。因此我们两次推断污染(见图5)。通过这样做,我们确信已发现的XSS攻击的实际适用性,并且我们的实现是明智的w.r.t.浏览器。依赖于非词汇连接作为一种充分的故障检测措施,它更有效,但需要正确形成的输出(这在HTML网页上并不总是有效的假设)和很容易出现漏报。
基于正则表达式的方法:
假设模糊值在应用程序输出中“as such ”反映,即,过滤器是身份功能。在过滤器的情况下,这可能导致误报。而且,大多数人不考虑反射背景,这可能导致误报。 IE8 和NoScript 依赖于模糊值的正则表达式。 XSSAuditor(Chrome XSS lter)与JavaScript DOM节点执行精确的字符串匹配。
基于字符串距离的方法:
Sun 通过计算DOM节点与浏览器在运行时执行的请求之间的字符串距离来检测自我复制的XSS蠕虫。 IE8和Chrome XSSAuditor只能使用反射型XSS。 NoScript能够阻止某些存储型XSS,但只能作为Firefox插件使用。
学习和安全测试
在其基本形式中,模糊测试是一种无向的黑盒主动测试技术。 主要针对内存损坏漏洞。 Stocketal。最近的工作模糊并检测白盒线束中的Type-0 XSS Heiderich等。检测由浏览器解析器怪癖引起的基于黑盒突变的XSS 。 LigRE + KameleonFuzz是一款黑盒式模糊游戏,针对反射和存储型XSS。
用于黑盒安全测试的GA
已用于演变恶意软件和攻击者脚本。KameleonFuzz是GA对黑盒XSS搜索问题的第一个应用。它的适应性维度模拟了人类安全渗透测试人员的直觉。
攻击语法:
为XSS生成模糊值作为标记的组合在他们最近的工作中,Tripp等人。修剪基于测试历史的语法,以有效地确定反射的有效XSS攻击向量。将KameleonFuzz与他们的方法进行比较并将两者结合起来会很有趣。王等人。使用隐马尔可夫模型从XSS向量构建语法。
安全测试的模型推断:
Radamsa针对内存损坏漏洞:它从已知输入推断出语法,然后用模糊来创建新输入。舒等人从网络跟踪中被动推断模型,并主动模糊输入推断出触发失败的特定输入部分的可能性。对于命令注入漏洞(XSS,SQL注入,…),Dessiatniko等。根据SQL注入的特制距离进行集群页面。
Sotirov在XSS过滤器的逆向工程,局部模糊测试和远程模糊测试之间进行迭代。Doup等人。表明推断宏观状态感知控制流模型增加了漏洞检测能力。有了LigRE,Duchene等人。研究表明,增强这种具有污染流的模型可以进一步提高其能力。 KameleonFuzz扩展了LigRE,是一种黑盒完全主动的测试方法。它使用攻击语法和控制+污点流模型生成并演化获得的反射上的模糊输入。
结论和未来的工作
在本文中,我们介绍了KameleonFuzz,这是第一款针对反射型和存储型XSS的黑盒GA驱动模糊器。与之前的工作相比,我们精确的双重污染推理可以重复使用真实世界的解析器,我们的演化符合测试人员定义的攻击语法,而适应性函数通过关注最有希望的潜在漏洞来推动这一过程。我们的方法在检测XSS方面具有实际用途,并且优于最先进的开源黑盒扫描仪。它发现了以前未知的XSS。
我们认为以下方向对未来的工作很有意义:
如何自动创建攻击语法?
如何结合我们的方法和来提高XSS检测的效率?
如何使用模糊测试期间收集的其他知识来改进推断模型?
如何将这种模型推理和模糊测试的组合应用于其他类别的漏洞?
个人总结
这篇文章由于专业术语较多,工具流程比较复杂,故给我我机器翻译和人工校验带来了巨大的困难,我暂时也无法一下子理解其中的思想,文章中的很多不是很通顺的机器翻译我也不知道该怎么修改成正常的表述,但是因为这篇文章技术还是比较新,所以暂时先放在我的博客里,如果读者觉得有兴趣可以对其进行更好的翻译,如果没有兴趣的话,就等我日后对一些概念理解更深了以后再来重新翻译这篇文章
原文链接
KameleonFuzz: Evolutionary Fuzzing for Black-Box XSS Detection