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逃逸攻击的防御策略。
目录
1 绪论
1.1 背景介绍
1.2 研究意义
1.3 研究现状
1.4 本文所做工作
1.5 文章结构
在互联网技术飞速发展的现代社会,互联网的规模正在快速增长,接入互联网的计算机也越来越多。对于个人计算机用户乃至企业、政府计算机用户,其信息安全问题也逐渐成为计算机互联网领域中的研究热点。浏览器作为接入互联网的窗口应用,其本身安全问题及其插件安全问题也备受重视。Java Applet作为浏览器的一种插件,在丰富浏览器功能、提升用户体验的同时,也引入了一些值得关注的安全问题。本文着眼于JRE漏洞引发的安全攻防问题,针对几种特定类型的JRE漏洞展开分析、研究与挖掘。本章内容将简要介绍JVM逃逸技术, JRE漏洞研究背景、意义、现状,文章组织结构等等。
Java语言是世界上最为流行的面向对象编程语言之一,被广泛应用于Web开发、嵌入式设备、手机应用(如BlackBerry和Android)、个人计算机乃至大型服务器之中。作为Java开发人员会经常接触到JDK、JRE和JVM等概念。JDK是Java Development Kit的缩写,意为Java语言开发工具,作为Java程序的开发人员,是必须安装这个软件包的。而作为仅需要运行Java程序的用户,只需安装JRE (即Java Runtime Environment, Java运行时环境), JVM (Java Virtual Machine)代表 Java 虚拟机,是 JRE 的重要组成部件,主要用于解释和执行 Java字节码文件。JDK以及JRE几经变迁,目前的主流版本是由Oracle公司提供的。除了官方提供的之外,还有开源的OpenJDK项目1,以及Apple、 IBM等公司基于官方JRE开发的一些JRE程序。由于Java语言优越的跨平台特性,Windows、Linux/Unix、 Mac OS等几乎所有主流操作系统都可以找到适合的JRE版本。
在HTML语言中,有一个"applet"标签2,用于指定所要运行的Java Applet小程序,现在几乎所有常见的浏览器都会支持这个标签。Applet由Java语言编写,其main class需要继承java.applet.Applet类。由于Java语言功能上的丰富性,所编写的Java Applet程序可以极大地丰富Web页面的功能,提供更好的用户体验。不过,在Web技术飞速发展的现代, Adobe Flash, Microsoft Sliverlight等技术的出现,逐渐替代了Java Applet技术在Web页面中的应用。但大多数浏览器仍然支持 Java Applet扩展,在 html文件中写入如下代码:
用户访问这个页面的时候,会将Java Applet程序MyApplet.class下载到本地,由本地的 JVM 加载并执行。
这样以来,对于攻击者而言,便产生了一个攻击面(Attack Surface):攻击者利用JRE漏洞,编写恶意的Java Applet,挂载到Web页面中,将URL发送给受害者;若安装了JRE的受害者访问了恶意页面,便执行了Applet,触发本地JRE漏洞,发起了逃逸出本地JVM而针对操作系统的攻击,从而使受害者的计算机被恶意控制,造成远程代码执行、隐私信息泄露等安全问题。本文将这样一个过程称为“JVM逃逸”,其中利用的漏洞为“JRE漏洞”。
近年来,以浏览器及其插件作为攻击面的安全事件不断增多,典型的安全问题包括Internet Explorer, FireFox等浏览器本身的漏洞(如处理JavaSeript代码不当而产生的Use-After-Free漏洞21)、Adobe Flash的解析漏洞、JRE漏洞等等。在众多安全事件中,利用JRE漏洞发起的 Java Applet 攻击事件近年来占据了重要地位。2011年的调查数据显示, 37%的Windows操作系统攻击事件是由JRE漏洞引起的,如图1-1所示。
这些漏洞在利用手段上有着较大的相似性,然而在利用技术门槛上却有所不同。为了对抗漏洞利用技术,现如今的操作系统如Windows 7、 Windows 8都开启了ASLR和DEP等防御功能3.如图1-2所示,攻击者在挖掘到浏览器或其插件的漏洞之后,还需编写exploit代码绕过安全防护机制,这样就大大提升了攻击技术的门槛。
JRE中包含的原生API包括用Java语言编写的Java API和使用C/C++编写的原生层API (作为编译好的动态链接库而存在于JRE中)。对应的, JRE漏洞可分为Java API设计缺陷和Java原生层漏洞,其中Java API设计缺陷较其他类型漏洞更易于利用,利用代码更容易变种,同时可以绕过ASLR和DEP等底层防护手段。这就很好地解释了图1-1中出现的现象,也从侧面反映了JRE漏洞的分析与研究在近几年成为研究热点。
由上述内容可知, JRE漏洞由于其特殊的利用特性,成为无论攻击者还是安全研究人员所关注的热点问题。研究JRE漏洞的成因、特点, JVM逃逸技术中的攻防手段,以及从安全角度出发的JRE漏洞挖掘技术,显得十分有研究价值。
在本课题领域,国内外的研究方向更偏向于 JVM 逃逸手段也就是 JRE 漏洞的利用技术,例如2013年9月份的Syscan360安全会议上的议题【6】,就主要介绍了利用Java语言的特性配合JRE漏洞绕过Windows 7下ASLR以及DEP的一些方法。而对于JRE漏洞挖掘的研究,多集中于Java API设计缺陷的挖掘。波兰安全公司SE曾发布一份技术白皮书【7】,系统地介绍了JRE安全机制与Java API设计缺陷挖掘与利用技术。而Java原生层漏洞相对来说原理复杂,较难分析利用,一直是国内外Java安全研究的难点。再者,传统的JRE漏洞挖掘方法多采用静态源代码审计的白盒测试方法,颇费人力。对于Java原生层漏洞挖掘,一直缺乏一种自动化的挖掘方法。
针对上述研究现状,本文针对两种不同类型的JRE漏洞,分别制定漏洞挖掘方案,在针对Java原生层漏洞的挖掘工作中,本文引入符号执行技术,旨在提高漏洞挖掘的自动化程度,尽可能减少安全人员的分析工作,提高漏洞挖掘效率。在JVM逃逸手段的研究上,本文将集中于杀毒软件等防御工程的脆弱性,诸如ASLR和DEP这类操作系统级别的安全防护则不是本文讨论范围内的重点。
本文的主要研究内容包括 Java安全机制探究, JRE漏洞分析, JRE漏洞挖掘技术与实现,JRE 漏洞的利用与防范。本文所做的研究工作如下:
1.探究Java安全机制, JRE沙箱组成部件,总结各关键组件特性,挖掘其潜在脆弱点。
2.总结现有JRE漏洞类型并作分类,对每种分类中具备代表性的漏洞,基于公开的PoC源代码进行分析与调研。
3.针对不同类型的JRE漏洞,制定漏洞挖掘方案,选择对应的漏洞挖掘技术,结合源代码审计与基于符号执行的灰盒测试技术进行漏洞挖掘工作,最终发现数个JRE安全问题,并给出成果展示。
4.分别从攻击者和防御者两种视角,分析并总结现有的JVM逃逸攻击与防御手段,研究并发现主流杀毒软件的脆弱性,并给出多维防御方案。
本文共分为六章,各章标题及内容概要如下所示:
第一章:绪论。简要介绍本文内容相关的基本知识背景,解释JVM逃逸与JRE漏洞概念,给出JRE漏洞问题的研究意义与研究现状,并简要概括本文所做工作。
第二章:Java安全机制研究。根据Java安全机制的几大重要模块,分别深入剖析其安全逻辑设计的特点以及潜在安全问题,为后续内容提供知识背景。
第三章:JRE漏洞分析。针对第二章中的内容总结出JRE的潜在缺陷点,结合现有已知的JRE漏洞作分类研究,从Java API设计缺陷、Java原生层漏洞、类型混淆以及自签名问题等角度,深入分析对应漏洞类型的PoC代码,并分别总结其漏洞特征。
第四章:JRE漏洞挖掘研究。基于第三章的工作展开JRE漏洞挖掘工作,针对Java API设计缺陷型漏洞和Java原生层漏洞分别给出不同的漏洞挖掘解决方案,并通过白盒审计与灰盒测试实验发现数个JRE安全问题,最终给出分析。
第五章:JVM逃逸的利用与防范。分别从攻击者和防御者的角度,结合漏洞挖掘工作中的研究,指出当前杀毒软件防御策略的薄弱环节,总结漏洞利用技巧。最后分析和比对各软件厂商的防范措施,总结其优劣并提出防御策略。
第六章:总结与展望。总结本文出现的关键内容,根据当前研究形势提出未来的研究方向和策略。