作者:Sven Taute
译者:riusksk(泉哥:http://riusksk.blogbus.com)

由于JavaScript的动态特性,用它来混淆exploit代码很是容易。由于JavaScript是一种解释语言,网站也提供源代码给用户,因此,Javascript混淆代码的功能常常被用于保护源代码,以防止被复制粘贴,同时保护开发者的知识产权。在过去几年,用于混淆攻击代码的算法已经被大大改进了。再加上商业工具的运用,甚至已经开发出可伪装(隐含经空白字符格式化的payload)的混淆器。

检测恶意Javascript的问题
对于经动态混淆的代码,利用已知特征码的方法是检测不到的,因此经混淆处理后的代码就无法识别出是恶意代码。对此,反病毒扫描器需要有一个良好的仿真引擎,以识别出经解压后脚本的运行行为。既而,这也就引发了一场攻击者与安全软件厂商之间的争夺战。混淆代码是为了保护源代码的知识产权,同时也可用于更好地隐藏exploit特征码,它们似乎有许多共性:它们都被复杂化处理,以隐藏真实代码,防止被人们或检测软件识别。
基于特征码的检测方法一经失效,反病毒引擎就必须分析和仿真JavaScript,直到识别出脚本的真实功能,以达到检测恶意代码的目的。如上所述,JavaScript是一种可用多种方法来隐藏代码的语言,它支持各类元编程(metaprogramming)(译注:元编程是指某类计算机程序的编写,这类计算机程序编写或者操纵其它程序(或者自身)作为它们的数据,或者在运行时完成部分本应在编译时完成的工作。多数情况下,与手工编写全部代码相比,程序员可以获得更高的工作效率, 或者给与程序更大的灵活度去处理新的情形而无需重新编译),这意味着代码可实现自修改,并创建出新代码。先加密字符串,然后用eval()函数来执行也是一种众所周知的方法。由于代码必须能够自我运行,因此JavaScript混淆器集成了KEY和经大量混淆算法实现的解密程序。

JavaScript代码压缩器的不同功能和限制
从攻击者的角度来看,存在一个优势,那就是网站开发者在大多JavaScript压缩器中并未考虑到因素:时间因素。在正当网站上经混淆的代码必须执行得够快,即使是未经压缩的代码也应如此。然而,从攻击者的角度来看,我们确实还有一些时间可以拿来利用,但如果exploit的执行是在毫秒或2秒内完成的,这就无所谓了,因为大多受害者并不会注意到它,甚至不会在当时打开任务管理器杀死进程。然而反病毒扫描器必须像网站开发者一样以相同的方式来处理Javascript,它的执行不能比未扫描时花费明显过多的时间,最好是1秒的十分之一。

利用时间因素
为了利用时间因素,代码压缩器需要创建出不会在一定时间跨度(timespan)内被分析出来的代码。由于这技术不应过于复杂,因此它必须以某种方式来执行,并且这种方式要求在短时间内不会分析出代码,所以最好的解决方案就是加密payload。对比现在流行的代码压缩器,它们均没有满足加密payload的所有关键要求,自然而然地,也就不可能在合理的时间内进行解密。这不仅要求让反病毒扫描器无法查看payload,攻击者的浏览器也不能。如前所述,由于反病毒扫描器的快速分析,因此在攻击者浏览器上的执行时间相对比较紧迫。然而也并非都是如此,我们可以创建一个加载器,用于暴力搜索访问payload的KEY,然后选用一个在数秒内可破解的KEY。最后导致反病毒引擎超时,但此时payload已经在浏览器中运行了。在当今浏览器里都拥有高优化的JavaScript引擎,运行暴破算法的速度很快,这给我们提供了很大的优势。
……
具体内容参见附件!

上传的附件 利用强迫超时规避JavaScript Exploit 特征码检测.doc