基于动态污点分析的DOMXSS漏洞检测算法

2016-05-14 08:38李洁俞研吴家顺
计算机应用 2016年5期

李洁 俞研 吴家顺

摘要:针对Web客户端中基于文档对象模型的跨站脚本攻击(DOM XSS)漏洞检测问题,提出一种基于动态污点分析的DOM XSS漏洞检测算法。通过构造DOM模型和修改Firefox SpiderMonkey脚本引擎,利用动态的、基于bytecode的污点分析方法实现了DOM XSS漏洞的检测。对DOM对象类属性的扩展和SpiderMonkey字符串编码格式的修改可以完成污点数据标记;遍历JavaScript指令代码bytecode的执行路径,获得污点传播路径,实现污点数据集的生成;监控所有可能会触发DOM XSS攻击的输出点,实现DOM XSS漏洞的判定。在此基础上,利用爬虫程序设计并实现了一个互联网DOM XSS漏洞检测系统。实验结果表明,所提算法能有效检测网页存在的DOM XSS漏洞,其检测率可达92%。

关键词:动态污点分析;注入点;输出点;执行路径

中图分类号:TP393.08 文献标志码:A

Abstract: Concerning DOM XSS (Document Object Model (DOM)based Cross Site Scripting (XSS)) vulnerability detection in Web client, a detection algorithm for DOM XSS vulnerability based on dynamic taint analysis was proposed. By constructing DOM model and modifying Firefox SpiderMonkey script engine, a dynamic taint analysis method based on the bytecode was used to detect DOM XSS vulnerabilities. First, taint data was marked by extending the attribute of the DOM object class and modifying the string encoding format of SpiderMonkey. Then, the execution route of the bytecode was traversed to generate the tainted data set. After that, all the output points which might trigger DOM XSS attacks were monitored to determine whether the application contained the DOM XSS vulnerabilities. In the experiment, a DOM XSS vulnerability detection system containing a crawler was designed and implemented. The experimental results show that the proposed algorithm can effectively detect the DOM XSS vulnerabilities, and the detection rate is about 92%.

Key words:dynamic taint analysis; source; sink; execution route

0 引言

随着网络技术的快速发展以及互联网的广泛应用,Web服务也在不断地更新与发展。然而,与Web应用相伴的是Web安全问题,早期Web安全主要体现在服务端动态脚本与Web服务器安全方面,而Web攻击技术的不断演进,使得Web客户端逐渐成为攻击的热点,针对Web客户端的攻击主要有跨站脚本攻击(Cross Site Scripting, XSS)、跨站请求伪造(CrossSite Request Forgery, CSRF)和界面操作劫持等。

在众多针对Web客户端的攻击中,XSS攻击是最为严重也最容易被忽略的安全威胁。在各种Web安全漏洞中,XSS长期占据着开放式Web应用程序安全项目(Open Web Application Security Project, OWASP)列出的安全漏洞列表的前列[1]。XSS漏洞通常是由于Web应用程序对于用户的输入过滤不足而产生的[2-3],其最大特点是攻击者利用网站漏洞将恶意脚本代码,例如超文本标记语言(Hypertext Markup Language, HTML)和客户端JavaScript等,注入用户浏览的网页上,从而实现隐私信息窃取、会话劫持等攻击目的。与此同时,伴随着客户端JavaScript功能的日益复杂和强大,也使得XSS漏洞问题日益严重。

传统意义上的XSS,例如反射型XSS和存储型XSS,通常是攻击者向服务器发送JavaScript代码等恶意数据,在服务器返回该恶意数据后由客户端浏览器在本地执行JavaScript恶意脚本。然而,基于文档对象模型(Document Object Model, DOM)的XSS漏洞[4](DOM XSS)则是专门针对Web客户端进行攻击的主要XSS漏洞之一,它不依赖于客户端向服务器发送恶意数据即可在客户端本地执行。DOM XSS与反射型XSS相似,通常诱使用户访问精心构造的统一资源定位符(Uniform Resource Locator, URL)来执行脚本,但二者之间的差异在于DOM XSS的URL不会被发送至服务器,而是在用户浏览器本地执行,因而威胁更大,也更难以防御。

由于DOM XSS攻击直接在客户端执行而不经过服务器端,因而无法直接应用传统的XSS漏洞检测技术来检测XSS漏洞。Klein[4]在发现并分析DOM XSS形成原因的基础上,提出应检查有可能被攻击者影响或使用的对于DOM对象的引用,来防止DOM XSS攻击,但文中并未给出对DOM对象引用的分析方法。FLAX[5]针对字节码bytecode进行动态污点分析,来表示JavaScript脚本中不安全的数据流,然而FLAX采用基于程序切片的静态分析技术,将程序切片翻译为JavaScript脚本的简化版本JASIL(JavaScript Simplified Instruction Language),而未真正将动态污点分析应用于JavaScript引擎。DexterJS[6]采用插装技术执行字符精度的动态污点追踪,然而,DexterJS并未在bytecode层面实现数据流追踪,而仅是在源代码层面追踪对原始污点数据的操作可能导致的污点字符串的输出,因而具有很大的局限性。贾文超等[7]采用正则表达式匹配程序的输入点和输出点,通过混合驱动爬虫检测,虽然其基于污点传播模型,但并没有实现污点数据的追踪过程,并未真正地应用动态污点分析技术,而且该方法需要对每个输出点进行检测,检测时间增加,因而具有局限性。

本文在对DOM XSS漏洞原理和动态污点追踪技术研究的基础上,提出了一种基于动态污点分析的DOM XSS漏洞检测方法,通过对Firefox SpiderMonkey浏览器引擎进行修改,实现了动态的、基于bytecode的污点追踪方法,该方法直接修改SpiderMonkey引擎中底层字符串类型的表示方法和DOM对象类的特征属性,完成污点分析过程中对JavaScript脚本语言特性和DOM API的完全覆盖。

1 问题描述

与反射型XSS和存储型XSS等传统的XSS攻击依赖于从服务器返回浏览器的恶意载荷实施攻击的方式不同[8-9],DOM XSS是一种基于DOM文档对象模型的漏洞,并不依赖于服务器返回的恶意数据,仅受客户端浏览器的脚本所影响,其产生的原因是HTML页面以不安全的方式使用了document等攻击者可以操纵的对象来操作数据。

客户端浏览器的JavaScript脚本可以访问浏览器的DOM,通过DOM动态检查和修改页面内容,且可以不依赖于服务器端数据,从客户端浏览器获得DOM中的数据,例如可以从URL中提取数据等,并在本地执行。另一方面,客户端浏览器的JavaScript脚本可以操纵DOM中的对象,若用户在客户端输入的数据包含了恶意JavaScript脚本,而这些脚本未经过适当的过滤,则应用程序可能遭受DOM XSS攻击。

此时,客户端浏览器将HTML文本解析为DOM,而上述URL属性值的一部分会被写入HTML文本中产生DOM XSS。由于URL中#之后的字符串不会被当作浏览器的查询字符串发送至服务器,因而作为代码片段在客户端浏览器本地解释和执行。

由上例可见,DOM XSS的请求不会被发送至服务器,而是在客户端浏览器本地执行,因而更难以防御,威胁更大。针对DOM XSS存在的上述问题,本文提出一种基于动态污点分析的DOM XSS漏洞检测方法,通过跟踪document.referrer等JavaScript脚本能够操纵的属性,查看其获得的数据是否会在document.write等能够使字符串在页面上输出的方法或函数中执行,从而确定是否会造成DOM XSS攻击。

2 DOM XSS漏洞检测算法研究

2.1 基本思想

DOM XSS漏洞的产生是因为攻击者可以输入不可信的数据,而在客户端浏览器与用户交互时,JavaScript脚本能够对DOM进行操纵从而获得敏感的本地数据,并将敏感数据泄露出去。由于DOM XSS漏洞是由于客户端代码的非正确执行而导致的,且客户端代码呈现出多种多样且动态的特点,因而,采用一般的扫描技术或者黑盒测试方法[11]无法检测DOM XSS漏洞。

动态污点分析(Dynamic Taint Analysis, DTA)[12]能够在运行时对软件中的不可信数据进行信息流追踪,从而发现漏洞或恶意行为。动态污点分析通常包括污点标记、污点传播和污点检测三个过程,在执行动态污点分析时,首先将来自污点源(source)的数据标识为污点数据,然后跟踪污点数据可能发生的操作和运算过程,并记录污点数据的传播路径。当污点数据传播到敏感操作点(sink)时,则按相应的策略触发操作。

由于动态污点分析技术能够有效追踪敏感数据的传播路径,因而可以将其应用于DOM XSS漏洞检测。本文方法的基本思想是:首先标记可以触发DOM XSS漏洞的属性,例如document.referrer、window.name、location等JavaScript脚本可以操纵的属性,将其标记为污点数据源;然后利用污点传播方法跟踪标记数据的传播路径,即标记数据传递时所经过的方法,例如substr()、concat()等,以标记发生转换后的污点数据;最后,检查产生字符串输出的方法,例如eval()、document.write()等,以确定其中是否包含了标记的污点数据,从而可以确定是否发生了敏感信息的泄露。另外,本文还设计并生成了测试用例集合,对提出的漏洞检测算法进行了实验验证,以确定算法的有效性。

基于动态污点分析的DOM XSS漏洞检测算法中敏感数据的污点标记、传播以及检测过程的示意图如图1所示。

图1中,首先将可能触发DOM XSS漏洞的方法作为外部数据的可能注入点,并对该方法的输入变量1,2,…,n进行污点标记,构造污点源;对JavaScript脚本引擎进行修改,使得在脚本执行过程中能够分析指令与函数对污点变量的操作,追踪污点传播过程,例如污点变量1在执行过程中,由于指令或函数的操作,将其污点传播至变量a和变量b,从而使得与污点源1相关的污点数据集变为{1,a,b};最后,检测输出点函数或方法是否对污点数据集中的数据进行了执行操作,若是则判定存在DOM XSS漏洞。

2.2 算法描述

基于动态污点分析的DOM XSS漏洞检测算法通过构造DOM模型和修改SpiderMonkey引擎,实现了对DOM漏洞的检测。具体的检测算法如下所示。

2.3 算法实现

本文算法利用了爬虫程序Heritrix来搜集页面,并为搜集到的页面URL构造DOM XSS攻击载荷payload。同时,为了模拟浏览器DOM模型,构造了DOM模块,以模拟document和window等可能的DOM XSS攻击对象,并实现污点标记功能。另外,为了实现污点传播,对Firefox SpiderMonkey脚本引擎进行了修改。

2.3.1 污点标记

为了实现动态污点追踪,要获取污点源并实现污点源的标记。本文首先对有可能触发DOM XSS漏洞的DOM对象进行分析,确定了window.location.href、location.href、location.pathname、location.search、location.protocol、location.hostname和document.referrer等14个可以操纵数据的注入点方法,然后修改浏览器对象所对应类的属性,在其中增加污点属性taint,以标记该对象所获得的变量是否为污点变量。

对于SpiderMonkey脚本引擎的字符串表示方法进行修改,将其中的字符串编码格式由4位扩展至5位,并使用扩展位作为污点标记位。

通过对于DOM类属性和SpiderMonkey字符串编码格式的修改,算法可以实现对于注入点数据的污点标记。

2.3.2 污点传播

JavaScript脚本在执行过程中,污点数据受到数据操作和控制结构的影响,会产生新的污点数据,新污点数据与源污点数据存在依赖关系,称为源污点数据的依赖污点数据。同样,依赖污点数据在执行过程中也会产生新的污点数据,因而在程序执行过程中需要递归处理依赖污点数据以产生污点数据集。为了存储污点数据集以及源污点数据和依赖污点数据之间、依赖污点数据之间的传递依赖关系,本文算法定义了用于保存污点数据集的结构体TaintEntry,如下所示:

TaintEntry中,TaintDep链表存储了获得污点数据的DOM对象以及从源污点数据开始污点传播过程中所影响的污点数据集,而TaintEntry结构体则存储了污点数据相关信息,包括源污点数据、产生依赖污点数据的操作以及依赖关系污点数据信息。

另外,为了实现污点传播过程中污点数据的记录,算法对JavaScript脚本引擎的字符串操作方法进行了修改。在操作方法中对所获得的字符串进行污点判断,若该字符串为污点字符串,则其返回的结果字符串也保存为污点字符串;为了实现程序控制结构中污点数据的传播,对bytecode指令的执行过程进行了修改,以获得bytecode的执行路径,若控制结构中有数据是污点数据,则其执行路径中的其他数据也将变为污点数据。

2.3.3 污点检测

DOM XSS的基本检测方法是检测注入脚本能否在sink点执行。因此,算法监控sink点,添加analyse()方法,首先,判定sink点方法中获得的实参是否是污点数据,若是,则从污点数据集中获得该污点数据的依赖关系,通过逆向遍历污点数据集,获得该污点数据的源污点数据来源,若其源污点数据来自标记对象产生的污点数据,并且该污点数据存在执行路径。则在分析方法将测试结果输出。

2.4 测试用例生成

为了测试提出的DOM XSS漏洞检测算法的有效性,本文对DOM XSS漏洞利用点的上下文进行了分析,并根据以下规则设计DOM XSS攻击载荷以生成测试用例:

Usecase ::= URL‖截断序列‖有效载荷‖转义序列

其中:URL表示待测网站的URL地址,攻击者可以对URL进行修改以实施DOM XSS攻击;截断序列通常用于闭合页面漏洞利用点中未结束的标签;有效载荷标识攻击者用于实施攻击的代码片段;而转义序列通常为截断序列的反序列,其目的是能够使得经过修改的漏洞利用点能够在当前上下文中正常执行。

本文根据上述提出的测试用例生成规则,生成针对不同注入点的攻击载荷集,并结合fuzzing测试方法[13],生成一些特殊的载荷,组成攻击载荷集合,依次将攻击载荷集合中的载荷注入到待检验的URL中,完成攻击过程的模拟。

3 实验结果分析

为了测试算法的检测率和检测性能,本文收集了XSSed、Wooyun等漏洞公布平台上发布的DOM XSS漏洞,搭建执行环境,构造了一个本地样本集,其中包含DOM XSS漏洞的网页分为两类:1)未对用户输入进行过滤的网站,样本数为106;2)虽然含有过滤方法,但过滤不完全,导致漏洞的产生,样本数为64。评价指标为检测到的样本数、检测率、平均样本检测时间。实验中将本文算法与应用较为广泛的DOM XSS检测工具DOMinator[14]进行了比较分析,比较实验结果如表1所示。

由实验结果分析可知:在检测未过滤样本时,本文算法的检测率略低于DOMinator。经过对未检测到页面的分析发现,本文算法实现中输出点集合不够完善,部分输出点函数未包含在内,导致漏报,可以在后续工作中改进输出点集合。在检测过滤样本时,本文算法和DOMinator的检测率基本持平,然而,本文算法的平均检测时间明显少于DOMinator,这是因为本文系统实现了自动化测试功能,检测效率明显提升。

为了评价算法的实际可用性,本文对真实的网页进行了测试验证。实验中,首先利用爬虫程序Heritrix搜集页面,共计27411个页面,并依次对其进行检测,检测结果如下:检测到可疑样本数为123,实际漏洞样本数为114,误报率为7.89%。因无法对所有真实样本进行手工分析,因而对于真实样本实验采用误报率来检验算法的可行性。经分析,产生误报率的原因是算法在生成和使用测试用例时匹配规则过于严格,也由于部分网站使用安全策略过滤,导致有些书写不完善的语句也被算法误报为DOM XSS漏洞。

4 结语

本文分析了DOM XSS漏洞的特点,提出了一种基于动态污点分析的DOM XSS检测算法。为了实现动态污点传播,对Firefox SpiderMonkey引擎进行修改,实现了动态的、基于bytecode的污点追踪。实验结果表明,本文算法具有较好的有效性与可行性。为了进一步提高算法的检测率并降低误报率,后续工作将利用fuzzing测试技术进一步完善污点数据集,实现DOM XSS漏洞的自动化检测。

参考文献:

[1]OWASP. CrossSite Scripting (XSS) [EB/OL]. [2014-04-22]. https://www.owasp.org/index.php/XSS.

[2]PIETRASZEK T,BERGHE C. Defending against injection attacks through contextsensitive string evaluation[C]// Proceedings of the 8th International Conference on Recent Advances in Intrusion Detection. Berlin: SpringerVerlag, 2006, 3858:124-145.

[3]VIKRAM K, PRATEEK A, LIVSHITS B. Ripley: automatically securing distributed Web applications through replicated execution[C]// Proceedings of the 16th ACM Conference on Computer and Communications Security. New York: ACM, 2009: 173-186.

[4]KLEIN A. Dom based cross site scripting or XSS of the third kind [EB/OL]. [2005-07-04]. http://www.webappsec.org/projects/articles/071105.html.

[5]SAXENA P, HANNA S, POOSANKAM P, SONG D. FLAX: systematic discovery of clientside validation vulnerabilities in rich Web applications[EB/OL].[2015-06-20].http://www.internetsociety.org/doc/flaxsystematicdiscoveryclientsidevalidationvulnerabilitiesrichwebapplications.

[6]LEKIES S, STOCK B, JOHNS M. 25 million flows laterlargescale detection of DOMbased XSS [C]// Proceedings of the 20th ACM Conference on Computer and Communications. New York: ACM, 2013: 1193-1204.

[7]贾文超, 汪永益, 施凡,等. 基于动态污点传播模型的DOM XSS漏洞检测[J]. 计算机应用研究, 2014, 31(7):2119-2122.(JIA W C,WANG Y Y, SHI F, et al. Detecting DOM based XSS vulnerability based on dynamic taint propagation model[J]. Application Research of Computers, 2014, 31(7): 2119-2122.)

[8]李沁蕾,王蕊,贾晓启.OSN中基于分类器和改进ngram模型的跨站脚本检测方法[J].计算机应用,2014,34(6):1661-1665. (LI Q L,WANG R,JIA X Q.Crosssite scripting detection in online social network based on classifiers and improved ngram model[J].Journal of Computer Applications,2014,34(6):1661-1665.)

[9]WEINBERGER J, SAXENA P, AKHAWE D, et al. A systematic analysis of XSS sanitization in Web application frameworks[C]// Proceedings of the 16th European Conference on Research in Computer Security. Berlin: SpringerVerlag, 2011:150-171.

[10]邱永华. XSS跨站脚本攻击剖析与防御[M].北京:人民邮电出版社, 2013:120-126. (QIU Y H. XSS Attack and Defense Analysis[M]. Beijing: Posts & Telecom Press, 2013:120-126.)

[11]朱贯淼,曾凡平,袁园,等.基于污点跟踪的黑盒fuzzing测试[J].小型微型计算机系统,2012,33(8):1736-1739.(ZHU G M,ZENG F P,YUAN Y, et al. Blackbox fuzzing testing based on taint check[J].Journal of Chinese Computer Systems,2012, 33(8):1736-1739.)

[12]吴世忠, 郭涛, 董国伟, 等. 软件漏洞分析技术进展[J].清华大学学报(自然科学版), 2012, 52(10):1309-1319. (WU S Z, GUO T, DONG G W, et al. Software vulnerability analyses: a road map [J]. Journal of Tsinghua University (Science & Technology), 2012, 52(10):1309-1319.)

[13]VIJAY G, TIM L, MARTIN R. Taintbased directed whitebox fuzzing[C]// Proceedings of the 31st International Conference on Software Engineering. Washington, DC: IEEE Computer Society, 2009:474-484.

[14]DOMINATOR. A full featured DOM XSS security suite[EB/OL].[2012-11-13].https://dominator.mindedsecurity.com.