扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
来源:CSDN 2009年7月26日
关键字: 沙盒技术 沙盒 JavaScript 恶意网页
意网页是目前木马传播的一个主要途径,沙盒过滤技术是检测恶意网页的一个可行的方法,而且理论上检测率是很高的,但在现实实现这种检测方案时,检测程序内置的HTML以及JavaScript解析引擎有可能在功能上没有实现完整,或者一些行为与真实的浏览器有偏差,还有运行环境毕竟和真实的客户机是不同的,总之会与浏览器有或多或少这样或那样的不同,而这些不同却可以被恶意网页的编写者所利用来躲避检测程序的跟踪检查,本文对恶意网页可能使用的一些逃避检测程序的方法进行了介绍。
目前基于WEB的应用越来越普遍,与此同时恶意网页也成为了木马传播的重要途径,而且有越来越严重的趋势。据统计,目前有80%以上的木马是通过恶意网页进行传播的,微软最新发布会的“微软安全情报”报告指出,2007年期间,Windows用户机器中所感染的特洛伊(Trojan)木马病毒下载程序猛增300%;攻击者正逐渐放弃传统的电子邮件攻击手段,转而越来越多地使用网页攻击策略。可见阻止木马传播的有效方式就是对恶意网页进行封杀,目前各安全厂家都在不遗余力的加强这方面的研究。具体到网关级安全产品(如入侵保护系统,安全网关,UTM等)来说就是对被保护的内网用户访问的网页进行分析过滤,如果发现恶意网页就发出告警,在网关处阻止恶意网页进入内网用户的主机,从而保护内网用户。
网关级安全产品阻断恶意网页在技术上的一个主要问题就是如何判断一个网页是否是恶意网页。现在大多数恶意网页中的恶意代码是用JavaScript编写的,这些JavaScript通过HeapSpray技术触发本地ActiveX控件的漏洞而进行木马下载并运行,而且这些恶意的JavaScript代码为了躲避检测一般都进行了混淆加密处理,如下是一段真实的恶意网页中的JavaScript代码:
在面对混淆加密后的JavaScript代码,单纯的通过关键字搜索来识别恶意网页的办法将会失效,在这种情况下最有效的办法就是通过内置的HTML以及JavaScript解析引擎在一个虚拟环境中对网页中的JavaScript进行实际的解析执行,并在解析执行过程中跟踪JavaScript代码的行为,例如创建ActiveX控件并集中大量的申请内存等,从而准确识别恶意网页。这种检测方式称为沙盒检测(Sandbox),通过这种方法理论上检测率是很高的,但在现实实现这种检测方案时,检测程序内置的HTML以及JavaScript解析引擎有可能在功能上没有实现完整,或者一些行为与真实的浏览器有偏差,还有运行环境毕竟和真实的客户机是不同的,总之会与浏览器有或多或少这样或那样的不同,而这些不同却可以被恶意网页的编写者所利用来躲避检测程序的跟踪检查,也就是说恶意网页在运行恶意代码之前首先检查看自己是否运行在真实的浏览器中,如果不是,那它会什么都不做,这样检测程序内置的HTML以及JavaScript解析引擎将无法察觉这是一个恶意网页,因为恶意代码根本没有运行。相反,当恶意网页检查发现自己是运行在真实的浏览器中时,它便会运行恶意代码了。所以在对检测程序内置的HTML以及JavaScript解析引擎进行设计开发前,首先就要了解恶意网页可能会采用的逃避沙盒检测的方法,从而作到知己知彼。下面就具体介绍几种可能的方式。
1.在DOM中,一些对象有许多别名,如:
document.location ,window.location,document.URL是等价的。
window,window.window,window.self,window.parent,window.self.self.self.self是等价的。
任一个全局变量都自动成为window的成员。
恶意网页可以利用这一点来检测自己是否运行在真实的浏览器中,例如:
var spi = 5;
if(window.parent.window.spi ==5){
//“haha in browser”
do_evil();
} else{
//“oh I’m now maybe in sandbox”
Return;
}
在上面的这个网页代码中的do_evil()是这个恶意网页中包含恶意代码的地方,上面的代码中的if语句判断自己当前的运行环境中对DOM别名的特性是否支持,如果安全产品中自己实现的JavaScript解析引擎对DOM别名的特性实现不完整的话,那么很有可能会认为window.parent.window.spi 不等于5,从而让恶意网页逃过检测。
2.通过使用 HTML tag 的一些功能进行测试,已判断当前的运行环境是Sandbox还是浏览器,例如:
if(document.cookie == “c2=V2; c1=V1”){
//“oh I’m now maybe in sandbox”;
return;
}else{
//“haha in browser”;
do_evil();
}
在上面的例子中,第一个meta在设定的Set-Cookie时,使用了HttpOnly属性,HTML协议规定在使用了HttpOnly属性后,这个meta设定的Cookie也就是”c2=v2”将不能被页面中的脚本访问到,也就是说在下面的Javascript代码中document.cookie的值在真实的浏览器中为” c1=V1”,如果安全产品的JavaScript解析引擎对meta的一些特性实现不完整的话,就会可能被恶意网页利用逃过检测。
3.Image对象是JavaScript的内建对象,可以通过语句var img = new Image()来创建对象,在创建Image对象后可以通过语句img.src=http://www.exist.com/a.jpg来从网络上获取图片,当浏览器遇到这句话时,会向www.exist.com发出http请求,获取图片a.jpg,如果这个图片从www.exist.com成功获取,浏览器会调用img的onload()方法,如果这个图片在www.exist.com上不存在或者www.exist.com根本就不存在,浏览器会调用img的onerror()方法,恶意网页可以利用这些特性来来判断当前的运行环境是Sandbox还是浏览器,代码如下:
Function goodman(){
do_evil();
}
var img = new Image();
img.onload = goodman;
img.src=http://www.exist.com/a.jpg//一个存在的站点和图片
在以上代码中可以看到当在真实的浏览器中语句img.src=http://www.exist.com/a.jpg会让浏览器去获取图片a.jpg,然后调用goodman()函数运行恶意代码,如果安全产品的沙盒对以上特性没有实现完整的话,就会可能被恶意网页利用逃过检测。
4.当javascript代码中出现语法错误或者函数的无穷递归调用的错误,浏览器会调用window.onerror(),恶意网页中通过故意引入语法错误或无穷递归调用的错误来判断当前的运行环境是Sandbox还是浏览器,代码如下:
window.onerror = function() {
do_evil();
}
Lolz &nd B00m$; //语法错误
从以上代码可以看出,如果安全产品的沙盒对错误处理的实现不完整的话,例如在遇到语法错误时可能停止解析了,而没有象真实的浏览器那样去调用window.onerror,那么就可能被恶意网页利用逃过检测。
最后,还有很多其它可以采用的方法如对Ajax的特性进行探测,对事件的处理顺序,对plug-in的测试,对同源策略的测试等都可以用来探测当前的运行环境是在浏览器里还是在沙盒里。
通过以上分析可以看出要利用沙盒检测的方式对恶意网页进行检测,很重要的一点就是对浏览器的一些关键特性要尽可能模拟。绿盟科技的安全产品对沙盒检测以及恶意网页的反检测技术进行了持续的研究,在设计之初便针对一些可能的逃避情况进行了关注,目前已有成熟的解决方案并已进入产品化。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者