鲍泽民,王根英,李 娟
(1.北京交通大学 通信与信息系统北京市重点实验室,北京 100044;2.中国信息安全测评中心,北京 100085)
跨站脚本攻击客户端防御技术研究
鲍泽民1,王根英1,李 娟2
(1.北京交通大学 通信与信息系统北京市重点实验室,北京 100044;2.中国信息安全测评中心,北京 100085)
跨站脚本攻击是当今Web应用领域危害最严重、最常见的威胁之一,本文设计了全新的跨站攻击防御方法,该方法以动态污点追踪为主,辅以静态污点分析,可有效阻止客户端敏感信息的泄露,实现了对跨站攻击的有效拦截。并通过对Javascript引擎Spidermonkey的扩展,在开源的Firefox上实现了基于该方法的插件xssCleaner,验证了防御方法的有效性。
跨站脚本攻击;浏览器安全;动态污点追踪;静态分析
跨站脚本攻击是一种针对Web客户端的重量级攻击。XSS漏洞广泛存在于PHP、Java、.NET等语言编写的、未严格过滤用户输入的Web应用程序中[1]。攻击者利用该服务器端漏洞,在客户端浏览器从服务器端得到的HTML响应页面中“注入”恶意Javascript脚本。恶意脚本在客户端浏览器执行,避开同源策略限制,实施恶意操作。跨站脚本攻击根源于Web应用安全机制的薄弱环节:对用户输入缺乏足够的过滤处理。虽然在服务器端修复Web应用中的跨站漏洞可以根本性解决该问题,由于安全补丁的更新速度慢,系统运维人员的安全意识薄弱等各种原因,仍有很多Web应用不能及时修复漏洞,导致用户在使用这些应用时处于遭受跨站攻击的风险下。为了提高用户面对跨站脚本攻击的主动防御能力,研究客户端的跨站攻击防御措施显得很有必要。
自2000年开始着手研究跨站攻击的防御机制,安全专家们已经提出多种不同的客户端防御机制。文献[2]提出的客户端恶意脚本检测系统由一个处理审计日志的入侵检测系统和一个浏览器内嵌的脚本审计器构成,通过对比审计日志和已知恶意脚本行为来发现攻击,并阻止恶意脚本执行。该系统不仅可以检测跨站攻击,同时可以发现其他攻击。不足之处是,该系统不能防御未知行为特征的新型攻击。文献[3]可以不受必须已知攻击行为特征的限制,通过在客户端部署个人Web防火墙,依据访问规则对恶意的URL进行阻止。合理访问规则的设置对用户要求较高,而且发现攻击后需要用户干预方可解决。
本文提出的跨站脚本防御方法是一种新型的纯客户端的XSS防御方法,可以在客户端形成一道应对跨站攻击的有效屏障,增强了客户端的主动防御能力。它以动态污点追踪为主,辅以静态污点追踪,综合了动态标记的高效性和静态分析的精确性的特点。防御方法整体框架如图1所示。
图1 防御方法整体框架
Javascript代码的一般处理流程:源代码通过词法、语法分析生成抽象语法树(AST,abstract syntax tree),抽象语法树再编译为字节码,字节码随后交由解释器翻译执行。本文的防御方法会对客户端Javascript引擎进行扩展后,语法分析阶段,会添加对敏感信息源(即源污点)的污点标记,通过基于信息流的污点传播分析,实时追踪、监测污点的传播。必要时在抽象语法树阶段调用静态污点分析,本文引入约束分析方法用于静态分析。
2.1 动态追踪
为了追踪监测Javascript程序对敏感信息的使用,需要扩展Javascript引擎的功能,具体表现在扩展字节码指令的语义,污点信息可以有效扩散。Javascript字节码指令可分为4种操作:赋值操作、算数和逻辑操作(+,-)、控制和循环语句(if,while,switch)、函数调用和eval。当一条指令被执行时,它的操作数可能是污点数据。因而需要定义规则,规定针对不同的操作指令,其指令结果是否应被标记为污点数据,确保污点数据的有效传递与扩散。
以赋值操作为例。赋值操作就是把一个常量或表达式的值赋给一个左值(等号左边的数值,左值为变量)。如果该常量或表达式的值(即右值)已被标记为污点数据,则左值在赋值操作结束后也会被标记为污点数据。Javascript引擎对单个变量、函数变量、数据、数组元素和对象属性的赋值分别分配了不同指令。需要注意的是,个别情况下,当污点数据赋值给一个变量后,除了该变量需要被污点标记,该变量的其它相关属性也需做污点标记。比如,为了确保对数组整体上的操作的函数或方法(如arr. length)的返回值为污点数据,必须规定当一个数组array中的一个元素被标记为污点数据后,整个数组的元素都应被标记为污点数据。通过图2的例子可以说明该规则的必要性。
图2 数组元素赋值
如图2,在第1行,一个初始长度为0的数组被建立;当cookie的第一个字符为字符“a”时,数组的第一个元素会被赋值为数值“1”;第5行,当数组的长度arr.length为“1”时,变量y会赋值为“a”。同样的方法测试所有可能的字符(eg,“a”~“z”,“A”~“Z”,“0”~“9”),攻击者可将cookie的首字符赋值给一个新的变量。如果在第3行的赋值操作后,仅仅对数组的第一个元素进行污点标记,则第5行的新变量便会避开污点追踪,从而在用户不知情的情况下泄露cookie信息。采用本节提出的规则,不仅数组的第一个元素被标记为污点数据,数组的属性(包括arr.length)也会被污点标记。第5行的变量“y”会在赋值后标记为污点数据,因而敏感信息可被追踪。
2.2 静态分析
动态污点追踪可以有效监测数据依赖关系和直接控制依赖关系,从而高效地追踪敏感信息流。但是动态污点追踪技术并不能处理所有的控制依赖关系[4]。作为动态追踪的补充,静态分析可以解决这个问题。当动态追踪不能有效监测,信息流有泄露敏感信息的风险时,静态分析方法被调用。动态污点追踪具有高效的特点,但是无法监测所有类型的控制依赖关系;静态分析使防御更加完善、可靠,然而会带来更多的资源消耗。二者的综合利用充分发挥各自的优势,使用户远离跨站脚本攻击的侵扰。本文应用了约束分析方法[5],在信息流模型(Information flow model)基础上,设计实现了Javascript脚本的约束系统,通过约束分析,实现污点扩散。约束分析方法包含约束系统建立和约束系统求解两个步骤。
2.2.1 约束分析系统建立
本文的约束分析系统是建立在信息流模型基础上的。信息流模型[6]中,数据被保存在相互独立的、按照安全级别定义的分隔区间上。Bell-Lapadula模型是用于提供机密性的信息流模型,关心不同安全级别间的数据流动问题。借鉴Bell-Lapadula和Biba经典的安全模型[7],本文建立如下污点规则:
机密性F-NR:污点信息不被泄露(x,☒);
完整性F-NW:污点信息不能被篡改(☒,x);
需要说明的是,(x,y)表示x的值流向y, y=x。(x,☒)就是说任何非可信数据都不能读取x。本文中非可信数据部分指的是从不同源的域中加载的脚本。
建立约束分析系统的具体过程是在Javascript的抽象语法树阶段,根据约束分析规则遍历抽象语法树上的每一个语法元素。Javascript的语法元素分为语句和表达式。多个表达式e可以组成一个语句s,设xe为表达式e的约束变量。
其中,k为当前上下文对象的标示符;e为当前接受约束分析的表达式; xi表示当前表达式e接收到的间接信息流。不同语法元素的具体约束分析规则不同,如控制语句的分析规则如下:
多个语句顺序执行时,依次对每个语句进行约束分析,如式2所示。条件控制语句、循环控制语句的约束分析规则分别是式(3)和式(4)。
2.2.2 约束求解
污点规则对其求解,以实现污点监测。若污点信息x⊆F-NR,调用NR(x)可以从约束系统得到x的相关信息流x1→xn,且x1→xn上的信息节点均被标记为污点信息,即 xi⊆F-NR(1≤i≤n ),同理,若x⊆F-NW,则求解的 xi⊆F-NW(1≤i≤n ),从而实现污点扩散。
为测试本文提出的防御方法的有效性,本文依据新型的跨站脚本防御方法对开源的Spidermonkey进行扩展,完成了跨站脚本攻击客户端防御工具xssCleaner的开发。xssCleaner作为Firefox的插件,具有部署快速、跨平台等特点。本文搭建了一个博客网站系统用于演示xssCleaner对跨站攻击的有效防御。攻击者在博客网站的登陆界面嵌入恶意脚本,恶意脚本在客户端浏览器执行后,会将用户名及密码等敏感信息发送给攻击者。客户端部署xssCleaner插件后,xssCleaner插件拦截该脚本的执行,并向用户发出跨站攻击警告,如图3所示。为方便用户,同时提高效率,插件提供了黑白名单机制,白名单中的脚本将被定为可信任域,黑名单中的脚本将始终被禁止执行。
图3 xssCleaner对跨站脚本拦截
为了验证xssCleaner的检测准确率,收集了19种网上常见的跨站攻击脚本,并搭建了存在跨站漏洞并且访问敏感信息的网站。为了验证误报率,通过网上下载大量网页测试,并对插件xssCleaner检测结果进行人工分析。针对这些网站的正确的检测率和误报率如表1所示。
表1 xssCleaner检测率和误报率
由上表可知,扩展后的浏览器可以有效检测出所有跨站攻击,然而应用中xssCleaner也会发出误报。
本文提出了一种新型的跨站脚本防御方法,介绍该新型防御方法的框架,该方法以动态污点追踪为主,辅以静态污点分析,兼顾了效率和精确性。分别阐述了动态、静态追踪的详细实现策略,二者实质都是实现污点的有效扩散,在静态污点追踪中应用了约束分析算法。为验证方法的有效性,开发了基于该方法的Firefox插件xssCleaner,其核心是对Javascript引擎Spidermonkey的扩展。经验证,xssCleaner可有效防御跨站脚本攻击。
[1]Seixas N, Fonseca J, Vieira M, et al. Looking at web security vulnerabilities from the programming language perspective: a field study[C]. Software Reliability Engineering, 2009. ISSRE'09. 20th International Symposium on. IEEE, 2009: 129-135.
[2]Hallaraker O, Vigna G. Detecting malicious javascript code in mozilla[C]. Engineering of Complex Computer Systems, 2005. ICECCS 2005. Proceedings. 10th IEEE International Conference on. IEEE, 2005: 85-94.
[3]Kirda E, Kruegel C, Vigna G, et al. Noxes: a client-side solution for mitigating cross-site scripting attacks[C]. Proceedings of the 2006 ACM symposium on Applied computing. ACM, 2006: 330-337.
[4]Denning D E. A lattice model of secure information flow[J]. Communications of the ACM, 1976, 19(5): 236-243.
[5]Kodumal J, Aiken A. Banshee: A scalable constraint-based analysis toolkit[M]. Static Analysis. Springer Berlin Heidelberg, 2005: 218-234.
[6]Huang Y W, Yu F, Hang C, et al. Securing web application code by static analysis and runtime protection[C]. Proceedings of the 13th international conference on World Wide Web. ACM, 2004: 40-52.
[7]Shon Harris. CISSP All-in-One Exam Guide, Fifth Edition[M]. McGraw-Hill Osborne Media, 2010.
责任编辑 徐侃春
Client-side defense techniques of cross-site scripting attack
BAO Zemin1, WANG Genying1, LI Juan2
( 1.Key Laboratory of Communication & Information System, Beijing Municipal Commission of Education, Beijing Jiaotong University, Beijing 100044, China; 2.China Information Technology Security Evaluation Center, Beijing 100085, China )
Cross-site scripting(XSS) attack was the most serious and common threat in Web applications today. This paper proposed a novel client-side approach, which combined the dynamic taint tracking with static analysis, to prevent XSS attacks. Based on this method, through extending Spidermonkey of Javascript, the plugin xssCleaner was implemented in open-source Firefox.
cross-site scripting attack; browser security; dynamic taint tracking; static analysis
U29∶TP39
A
1005-8451(2015)07-0017-04
2014-11-28
鲍泽民,在读硕士研究生;王根英,副教授。