意网页是目前木马传播的一个主要途径,沙盒 过滤技术是检测恶意网页 的一个可行的方法,而且理论上检测率是很高的,但在现实实现这种检测方案时,检测程序内置的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的成员。
恶意网页 可以利用这一点来检测自己是否运行在真实的浏览器中
例如网页代码中的function XX()是恶意网页 中包含恶意代码的地方,上面的代码中的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://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还是浏览器
可以看到当在真实的浏览器中语句img.src=http://www.exist.com/a.jpg会让浏览器去获取图片a.jpg,然后调用goodman()函数运行恶意代码,如果安全产品的沙盒 对以上特性没有实现完整的话,就会可能被恶意网页 利用逃过检测。
4.当JavaScript 代码中出现语法错误或者函数的无穷递归调用的错误,浏览器会调用window.onerror(),恶意网页 中通过故意引入语法错误或无穷递归调用的错误来判断当前的运行环境是Sandbox还是浏览器
如果安全产品的沙盒 对错误处理的实现不完整的话,例如在遇到语法错误时可能停止解析了,而没有象真实的浏览器那样去调用window.onerror,那么就可能被恶意网页 利用逃过检测。
最后,还有很多其它可以采用的方法如对Ajax的特性进行探测,对事件的处理顺序,对plug-in的测试,对同源策略的测试等都可以用来探测当前的运行环境是在浏览器里还是在沙盒 里。
通过以上分析可以看出要利用沙盒 检测的方式对恶意网页 进行检测,很重要的一点就是对浏览器的一些关键特性要尽可能模拟。