意网页是目前木马传播的一个主要途径,沙盒过滤技术是检测恶意网页的一个可行的方法,而且理论上检测率是很高的,但在现实实现这种检测方案时,检测程序内置的HTML以及JavaScript解析引擎有可能在功能上没有实现完整,或者一些行为与真实的浏览器有偏差,还有运行环境毕竟和真实的客户机是不同的,总之会与浏览器有或多或少这样或那样的不同,而这些不同却可以被恶意网页的编写者所利用来躲避检测程序的跟踪检查,本文对恶意网页可能使用的一些逃避检测程序的方法进行了介绍。
目前基于WEB的应用越来越普遍,与此同时恶意网页也成为了木马传播的重要途径,而且有越来越严重的趋势。据统计,目前有80%以上的木马是通过恶意网页进行传播的,微软最新发布会的“微软安全情报”报告指出,2007年期间,Windows用户机器中所感染的特洛伊(Trojan)木马病毒下载程序猛增300%;攻击者正逐渐放弃传统的电子邮件攻击手段,转而越来越多地使用网页攻击策略。可见阻止木马传播的有效方式就是对恶意网页进行封杀,目前各安全厂家都在不遗余力的加强这方面的研究。具体到网关级安全产品(如入侵保护系统,安全网关,UTM等)来说就是对被保护的内网用户访问的网页进行分析过滤,如果发现恶意网页就发出告警,在网关处阻止恶意网页进入内网用户的主机,从而保护内网用户。
网关级安全产品阻断恶意网页在技术上的一个主要问题就是如何判断一个网页是否是恶意网页。现在大多数恶意网页中的恶意代码是用JavaScript编写的,这些JavaScript通过HeapSpray技术触发本地ActiveX控件的漏洞而进行木马下载并运行,而且这些恶意的JavaScript代码为了躲避检测一般都进行了混淆加密处理,如下是一段真实的恶意网页中的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还是浏览器,例如:
|
在上面的例子中,第一个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://images.51cto.com/files/uploadimg/20090724/1859081.jpg来从网络上获取图片,当浏览器遇到这句话时,会向www.exist.com发出http请求,获取图片a.jpg,如果这个图片从www.exist.com成功获取,浏览器会调用img的onload()方法,如果这个图片在www.exist.com上不存在或者www.exist.com根本就不存在,浏览器会调用img的onerror()方法,恶意网页可以利用这些特性来来判断当前的运行环境是Sandbox还是浏览器,代码如下:
|
在以上代码中可以看到当在真实的浏览器中语句img.src=http://images.51cto.com/files/uploadimg/20090724/1859081.jpg会让浏览器去获取图片a.jpg,然后调用goodman()函数运行恶意代码,如果安全产品的沙盒对以上特性没有实现完整的话,就会可能被恶意网页利用逃过检测。
4.当javascript代码中出现语法错误或者函数的无穷递归调用的错误,浏览器会调用window.onerror(),恶意网页中通过故意引入语法错误或无穷递归调用的错误来判断当前的运行环境是Sandbox还是浏览器,代码如下:
|
从以上代码可以看出,如果安全产品的沙盒对错误处理的实现不完整的话,例如在遇到语法错误时可能停止解析了,而没有象真实的浏览器那样去调用window.onerror,那么就可能被恶意网页利用逃过检测。
最后,还有很多其它可以采用的方法如对Ajax的特性进行探测,对事件的处理顺序,对plug-in的测试,对同源策略的测试等都可以用来探测当前的运行环境是在浏览器里还是在沙盒里。
通过以上分析可以看出要利用沙盒检测的方式对恶意网页进行检测,很重要的一点就是对浏览器的一些关键特性要尽可能模拟。绿盟科技的安全产品对沙盒检测以及恶意网页的反检测技术进行了持续的研究,在设计之初便针对一些可能的逃避情况进行了关注,目前已有成熟的解决方案并已进入产品化。
【编辑推荐】