Java语言是最为流行的面向对象编程语言之一, Java运行时环境(JRE)拥有着非常大的用户群,其安全问题十分重要。近年来,由JRE漏洞引发的JVM逃逸攻击事件不断增多,对个人计算机安全造成了极大的威胁。研究JRE安全机制、JRE漏洞及其挖掘、JVM逃逸攻防技术逐渐成为软件安全领域的热门研究方向。
针对Java层API与原生层API, JRE安全机制分别包括JRE沙箱与JVM 类型安全机制。本文针对JRE沙箱组件及其工作原理进行剖析,总结其脆弱点;分析调研JVM安全机制,提出其脆弱点在于Java原生层漏洞,为JRE漏洞挖掘工作提供理论基础。
对于JRE漏洞,本文进行漏洞分类研究,提取Java API设计缺陷、Java原生层漏洞两种JRE漏洞类型的典型漏洞进行分析,总结漏洞特征,为漏洞挖掘工作建立漏洞模型。
根据JRE漏洞分析中建立的漏洞模型,本文采用源代码审计的方法开展Java API设计缺陷类型的漏洞挖掘工作,发现了数个Oracle JRE、OpenJDK和Apple JRE 的 Java API 设计缺陷问题。在 Java原生层漏洞挖掘工作中,出于Java原生层漏洞的特殊性,本文基于程序分析领域的符号执行技术提出一种寄存器符号化监控方法,选取开源符号执行平台S2E作为漏洞挖掘工具,并且基于其实现了针对JRE原生层漏洞挖掘的辅助插件 SymJava 和 SymRegMonitor,基于 OpenJDK 和 Oracle JRE逆向代码进行源代码白盒审计并构建了用于进行漏洞挖掘的 Java 测试用例,最后对36个调用Java原生层API的Java测试用例进行实际测试发现了共计6 个 JRE原生层安全隐患,其中2 个可被攻击者恶意利用,并给出漏洞分析和 PoC。
针对 JVM 逃逸攻防问题,本文分别从攻击和防御角度,提出 JVM逃逸攻击的5 个关键元素,针对每个元素进行攻防技术研究,并通过绕过杀毒软件静态检测的实验证明了本文提出的 JVM 逃逸攻击技术。最后,本文从多角度给出JVM逃逸攻击的防御策略。
目录
5.1.3 杀毒软件静态检测绕过测试
针对5.1.1 小节与5.1.2小节提出的杀毒软件静态检测绕过策略,本文选取了Microsoft Security Essential, Symantec Endpoint Protection, McAfee Total Protection, Avira Antivirus Premium四款杀毒软件进行测试,测试方法包括两种:针对exploit class文件的静态扫描(以下简称本地扫描),和远程访问包含exploit Applet的html页面(以下简称远程加载)。其中,本地扫描测试分别选用了十六进制加密和异或加密两种字符串混淆方法,远程加载则全部采用异或加密的方法。本实验选取的1day漏洞为CVE-2012-4681和CVE-2012-5076,实验环境为Windows 7 x64 Professional中文版, Oracle JRE 7 update 6,浏览器为Internet Explorer 8.本地扫描的测试结果如表5-3所示,远程加载的测试结果如表5-4所示。
5.1.4 序列化与反序列化
在Oracle JRE 7 update 10及其之后的版本中, JRE的主要提供商Oracle公司采取了一种click-and-play策略,也就是在执行Applet之前弹出安全警告对话框,把安全的决定权问题抛给了用户,也相应降低了JRE漏洞exploit的成功率。但国外的安全研究人员发现,这种click-and-play策略很快被发现存在漏洞,可以绕过这种click-and-play策略,绕过的关键技术在于Java的序列化与反序列化
Java程序在运行时会产生很多对象,不过这些对象的生命周期很短,随着程序的退出它们会消失掉,长时间不使用也会被JVM的垃圾回收机制回收掉。Java语言提供了序列化(Serialization)这样一种机制,用于将对象在JVM中的状态以字节码的形式保存在文件中,供长期使用。同样作为Java程序的Applet同样可以序列化,并且可以由浏览器加载。假设创建一个叫TestApplet的Applet类,将之序列化为本地文件的方法如表5-5所示。
新创建的TestApplet类的对象b将会被保存在文件TestApplet.ser中,而ser文件是可以由浏览器直接加载的,加载的 html 语句为:
<applet object='TestApplet.ser'><applet>
若用户访问该html页, ser文件会被下载到本地,由JVM自动反序列化(Deserialization)并作为一个对象执行。经过实际测试发现,以该种形式加载Applet,在Oracle JRE 7 update 10和update 11两个版本下,安全警告对话框不会弹出,而Applet可以直接执行。也就是说绕过了Oracle的click-and-play策略,不过之后的版本Oracle修补了这一安全问题。
5.1.5 JRE Rootkit
随着JVM逃逸攻击研究变得越来越热门,各种安全防护措施也不断地升级,这自然会让攻击者动了在 JRE 中植入 Rootkit 的想法。appsec-labs 的一篇博文讲解了如何在rt.jar包中植入恶意class,并提供了DEMO。文中提到了通过植入恶意class实施DNS欺骗,但是在测试过程中发现每次update都会将旧的rt.jar替换为新的,那么植入的Rootkit也随之被删除。因此本文提出劫持JRE update程序这一思路,来实现JRE Rootkit.
5.1.6 社会工程学
社会工程学主要体现在两个利用场景:一是利用JRE漏洞,二是不利用JRE漏洞而利用3.1.4中提到的自签名Applet.5.1.4小节提到,现在最新的JRE7版本都是有Applet 安全警告的类似click-and-play的策略,即使利用漏洞发起攻击,也要欺骗目标点击“运行”按钮。利用签名Applet的方式亦是如此。若要提高欺骗成功率,需要事先对Applet的应用场景进行统计调查。可基于如下两个目标进行调研:
1. 调查哪些类型的网站使用了 Applet 技术,其作用是什么:
2. 调查哪些网站是使用 Java语言编写的,其主要业务是什么。
5.2 JVM 逃逸攻击的防范
由前文内容可知,JVM 逃逸攻击已经成为国内外安全领域比较关注的一个问题,需要得到广泛关注。为了应对利用 JRE 漏洞发起的攻击,各大厂商纷纷提出自己的应对措施。针对JVM逃逸攻击的5要素:用户、浏览器、杀毒软件、本地 JRE、exploit 程序,本小节将分别介绍一些防御策略。
5.2.1 杀毒软件厂商角度
由5.1.3 中的杀毒软件绕过测试可知,对于Java API设计缺陷型漏洞,多数杀毒软件仍然是基于特征匹配的静态检测方法,而5.1.3小节也同时证明这种方法是可以被完美绕过的。针对这一点,本小节提出一种动态检测机制:即通过动态扫描JVM进程,找到方法调用栈,并监控是否有例如如下不安全的API被调用:
1. setSecurity Manager;
2. loadLibrary;
3. getSystemProperty/getSystemProperties.
其中第1 条是最为重要的,经过第三章中的 JRE 漏洞分析可知,Java API 设计缺陷的利用代码最终都需要调用setSecurityManager方法来关闭安全管理器,该方法是exploit代码逻辑的必经之路。若检测到这些不安全API执行时,由杀毒软件弹出警告对话框,提示用户正在遭受JVM 逃逸攻击。
5.2.2 浏览器厂商角度
浏览器是 JVM 逃逸攻击的重要环节, 目前多数主流浏览器厂商对于JRE 漏洞都采取了积极的防御措施,主要分为以下几种:
1.默认关闭Java Applet支持,若用户需要执行Applet需要进入浏览器的设置面板中自行开启,如 FireFox 浏览器等;
2. 加载 Java Applet时,检测当前系统中安装的JRE版本,若不是最新版,则弹出提示信息,建议用户更新 JRE,如 Internet Explorer 7;
3. 加载Java Applet时,检测当前系统中安装的JRE版本,若不是最新版,则弹出警告对话框,提示用户存在风险,如FireFox浏览器(图5-5所示);
4. 加载Java Applet时,检测当前系统中安装的JRE版本,若不是最新版,拒绝执行该Applet,弹出对话框建议用户去Java官方网站下载最新的JRE安装包来更新,如 Google 的Chrome 浏览器;
5.停止对Java Applet的支持,如Apple的Safari浏览器(最新版本又重新支持 Java Applet,并采取警告策略)。
5.2.3 JRE 提供商角度
本文调研的JRE提供商主要有开源项目OpenJDK、 Oracle和Apple三个,而Apple在最新的Mac OS x版本中移除了Apple JRE,若用户需要使用Java,则需要去Oracle官方网站下载对应版本的Oracle JRE。同时, Oracle对于Linux系统的JRE支持也做的比较完善,可见, Oracle提供的JRE是最为流行的JRE软件。作为JRE漏洞的根源, Oracle也逐渐重视起JRE的安全问题。在7update 10及其之后的版本, Oracle采取了以下两点安全策略:
1. 提高了安全等级的默认设置,将以往版本的“中”提升为“高”,也就是仅允许签名 Java Applet 执行
2.采用click-and-play策略。
5.2.4 用户角度
用户是JVM逃逸攻击中最重要的元素之一,考虑到Oracle JRE具备相当数量的装机量,其用户数目不容小视。除了软件安全策略如在操作系统中安装杀毒软件、使用安全性较高的浏览器如Chrome等之外,作为普通用户,要尽量做到以下的防御策略:
1. 提高安全意识,不要随便点击不可信的URL,看到签名Applet警告对话框,要注意识别证书内容,辨认证书是否是受信任机构颁发的;
2. 对于经常使用 Java 用户,要及时升级 JRE:
3. 对于不常用到Java的用户,由于Applet技术在Web中极少被用到,可以考虑在浏览器中关闭JRE插件,或者直接卸载JRE.
5.3 本章小结
本章分别从攻击和防御的角度,阐述了JVM逃逸攻击的利用技巧和防御策略。首先,本章提出JVM逃逸攻击的5个环节,和对应的5个重要元素:用户、浏览器、杀毒软件、本地 JRE、exploit 代码。在 JVM 逃逸攻击利用一节:本文提出一种绕过杀毒软件静态检测的exploit编写方法,通过对4款市场上流行的杀毒软件的测试,证明其静态检测策略的脆弱性;此外,本文还针对Java对象序列化与反序列化、JRE Rootkit、社会工程学方面展开讨论。在 JVM 逃逸攻击防御一节中,针对 JVM 逃逸攻击的5 个重要元素,本章分别从杀毒软件、浏览器、JRE 提供商和用户4 个角度,讨论研究其相应的防御措施,并给出自己的防御策略。
6 总结与展望
6.1 本文总结
Java语言作为一门非常流行的面向对象编程语言,被广泛应用于各领域的软件开发当中,相当数量的计算机都安装了JRE,其安全问题不言而喻。利用JRE漏洞发起的JVM逃逸攻击事件也在近年来不断增多。本文从安全角度出发,对JRE沙箱和JVM类型安全机制进行了调研,并对现有JRE漏洞进行了分类研究和PoC代码分析,总结出Java API设计缺陷(包括类型混淆)、Java原生层漏洞、自签名问题等JRE安全问题。针对Java API设计缺陷和Java原生层漏洞两种类型的漏洞,本文分别提出不同的漏洞挖掘方案,通过源代码白盒审计和基于符号执行的灰盒测试,发现了数个JRE安全问题。最后,本文从攻击和防御角度,提出JVM逃逸攻击的5个关键元素,针对每个元素进行攻防技术研究,并通过绕过杀毒软件静态检测的实验证明了本文提出的 JVM 逃逸攻击技术。本文所做研究工作列举如下:
1. 研究总结 JRE 沙箱机制和 JVM 类型安全机制,指出其脆弱点;
2. 分析不同类型JRE漏洞的特征,选取三类漏洞:Java API设计缺陷、Java原生层漏洞、类型混淆的典型CVE漏洞,对其PoC代码进行分析研究;指出Oracle JRE 存在的 Applet 自签名问题
3.针对Java API设计缺陷和Java原生层漏洞,分别提出不同的漏洞挖掘方案,结合源代码审计、逆向工程和基于符号执行的灰盒测试等技术,通过研究和实验发现数个JRE安全问题,其中有多个可以被攻击者恶意利用;
4. 提出JVM逃逸攻击的5个关键元素,从攻击和防御的角度,提出JVM逃逸技术和防御策略。
6.2 研究展望
随着Java API设计缺陷的不断修复, Java原生层漏洞挖掘与利用正在成为未来新的热门研究方向。在未来对JRE安全问题的研究中,我们也会把工作重心放在Native Code的漏洞挖掘上。