小研究 - JVM 逃逸技术与 JRE 漏洞挖掘研究(六)

news2024/11/15 12:18:53

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  JVM 逃逸的利用与防范

5.1  JVM 逃逸利用研究

5.1.1  字符串混淆

5.1.2  利用反射机制


5  JVM 逃逸的利用与防范

第一章中文本已经申明JRE漏洞的危害性,并且提到利用JVM逃逸发起的攻击事件于近年来逐渐增多。用户遭受JVM逃逸攻击的一般流程为:用户访问含有恶意 Java Applet 的 URL-—浏览器解析“applet”标签的内容, class 文件被下载到本地--调用本地JVM加载执行Applet--JRE漏洞触发,恶意代码成功执行,JVM 逃逸成功。然而,随着互联网用户安全意识的提高,或者政府、企业、各类机构安全规范的不断完善,相当数量的计算机都会安装杀毒软件,因此JVM逃逸攻击的流程会多一个环节:Java Applet class文件被下载到本地之后,需要经过杀毒软件的扫描,若扫描通过,才可调用本地JVM加载并执行该Applet。总结起来,本章研究的 JVM 逃逸攻击的流程基于以下5个步骤:

1. 用户访问恶意 URL;

2. 浏览器解析"applet”标签内容,所请求的class文件下载到本地;

3. 杀毒软件扫描下载的class 文件

4, 若第3步扫描通过,则调用本地JVM加载执行Applet;若不通过,杀毒软件报警并自动隔离或删除 class 文件;

5,恶意代码成功执行, JVM逃逸成功。

基于上述5 个步骤,一次成功的 JVM逃逸攻击包含5 个要素:用户、浏览器、杀毒软件、本地JRE、 exploit代码(漏洞利用代码),无论攻击者还是防御者,都要从上述5个要素作为切入点,思考攻击手段或者防御策略。本章5.1小节介绍本文对JVM逃逸利用的研究, 5.2小节则介绍JVM逃逸攻击的防范。

5.1  JVM 逃逸利用研究

JVM 逃逸攻击需考虑两种情况:第一种是利用 Oday JRE 漏洞发起攻击:第二种是利用1day JRE 漏洞发起攻击。Oday漏洞是指被攻击者掌握而软件厂商毫不知情且没有修复的漏洞,这类漏洞危害极大,难以做到有效的防御,不过攻击门槛较高,攻击者往往需要通过精湛的漏洞挖掘技术去挖掘Oday漏洞。而1day漏洞是指已经公开细节的漏洞,且在最新软件版本中已经修复了这类漏洞。然而,如果用户不及时更新JRE软件版本,还是会有遭受1day漏洞攻击的潜在威胁。知名杀毒软件厂商卡巴斯基在2013年10月的一份技术报告【37】中曾经指出,超过半数的用户仍在使用旧版本(也就是存在1day 漏洞的版本)的JRE的攻击门槛被大大降低。在此种情形之下,用户、浏览器、杀毒软件、本地JRE,exploit代码5要素中,起到关键性防御作用的就是杀毒软件。

目前主流的几款杀毒软件基本都是基于静态检测的思路,也就是当 class 文件或者 jar 文件下载到本地时,杀毒软件会进行一次静态扫描,检测文件中是否含有已知exploit代码的特征信息。Java源码编译为class文件后,其字符串变量、方法名、类名、包名都会以 UTF-8 字符串的形式保存在 class文件中。用十六进制编辑器打开class文件可以清楚地看到这些字符串,如图5-2所示。

经过对几款主流杀毒软件的测试发现,杀毒软件的静态检测机制主要是针对exploit程度中的特征字符串。如漏洞CVE-2012-4681中包含Java API设计缺陷的类名称“sun.awt.SunToolkit”,或者如漏洞 CVE-2012-5076 中调用的缺陷类名称“ManagedObjectManagerFactory”及其方法"getMethod”。这种静态检测机制存在不安全因素,可以通过 exploit 代码混淆技术绕过。关于此方面的研究将在5.1.1, 5.1.2,5.1.3 小节中展开。

在JVM逃逸攻击中,除去杀毒软件要素,用户的安全意识也起到了决定性作用。一次成功的攻击往往伴随着对用户行为的诱骗,如伪造诱惑、恐吓性质的邮件,诱骗用户点击恶意 URL。关于此方面的研究将在5.1.6 小节中展开。此外,针对JRE 7的安全策略和软件特性, 5.1.4和5.1.5小节也作了一定研究。

5.1.1  字符串混淆

针对杀毒软件的特征字符串检查,只需将字符串混淆即可绕过,常见的混淆方法有十六进制转换、base64 混淆、异或混淆等等。在实际测试中发现,部分杀毒软件还是会查杀十六进制混淆过的class文件。使用自定义key的异或加密方法简单有效,而且可以绕过多数基于静态检查的主流杀毒软件。实现异或加密的方法如表5-1 所示。

把字符串“sun.awt.SunToolkit”进行异或加密的代码如表5-2 所示。执行这段代码的Java控制台输出如图5-3所示。

 

若要得到原来的字符串,只需要再对混淆后的字符串执行一次 encrypt 操作即可。注意图5-3中的字符串,第一行与第二行之间有一个换行符“r”,第二行的结尾有个制表符“tab”,第二行和第三行之间有一个换行符“n”。参考第三章中列举出的 CVE-2012-4681 利用代码,可以进行字符串加密改写,改写后的代码如图5-4 所示。

5.1.2  利用反射机制

在杀毒软件绕过的测试实验中发现,对于某些杀毒软件,只作字符串变量混淆是不够的,杀毒软件仍然会发出警报。例如CVE-2013-1493,其漏洞触发代码为:"coo.filter(sbi,dbi)"。其中cco是ColorConvertOp类的一个对象,其filter方法触发了漏洞。在测试中发现,完全不经过任何混淆的exploit class会被杀毒软件查杀,而注释掉如上代码再编译、运行、测试就发现不会被查杀,所以杀毒软件静态检测的关键就在于检测filter这个方法,也就是通过解析 class文件格式,在方法定义区域中查找“filter”关键字。本研究发现,针对这种检测方法名称、类名称或者包名称的静态检测手段,可以用反射加字符串混淆的方式绕过。使用反射 API 加字符串混淆的 exploit 关键代码如图5-4 所示。图中红色标记的反射API "forName"、 "getMethod"、"invoke”分别可以实现任意类对象获取、任意方法对象获取、激活方法对象执行的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/931769.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ToolAI–全球最完整最全面的AI人工智能工具集合

ToolAI是一个全球最完整最全面的AI人工智能工具集合网站,收集了全球最完整的数千个AI网站、工具、app,包含文案写作、邮件助手、聊天机器人、社交媒体等等各种行业类型的AI工具,可以按照地区或者分类进行查找浏览,目前收集6800 人…

CMake3.27+OpenCV4.8+VS2019+CUDA配置

1、准备工作 CMake3.27+OpenCV4.8+opencv_contrib-4.8.0+CUDA+CUDNN+TensorRT下载好并安装cuda 2、正式开始安装 启动CMake开始配置 打开刚解压的cmake文件夹中找到bin目录下的cmake-gui.exe 点击cmake中左下角的 Configure进行第一次配置,会弹出选择环境对话框 …

MyBatis与Spring整合以及AOP和PageHelper分页插件整合

目录 前言 一、MyBatis与Spring整合的好处以及两者之间的关系 1.好处 2.关系 二、MyBatis和Spring集成 1.导入pom.xml 2.编写配置文件 3.利用mybatis逆向工程生成模型层代码 三、常用注解 四、AOP整合pageHelper分页插件 创建一个切面 测试 前言 MyBatis是一个开源的…

容器镜像生成记

概述 容器docker/k8s发布已有一段时间,不少小伙伴开始上手实践。下面以一个简单的应用为例。来说明如何生成镜像并推送至镜像仓库。 准备工作 镜像仓库注册 以最常见的aliyun镜像仓库为例: 支付宝登录aliyun官网,搜索容器镜像服务&#x…

盘点 2023 十大免费开源 WAF

WAF 是 Web Application Firewall 的缩写,也被称为 Web 应用防火墙。区别于传统防火墙,WAF 工作在应用层,对基于 HTTP/HTTPS 协议的 Web 系统有着更好的防护效果,使其免于受到黑客的攻击。 近几年经济增速开始放缓,科…

快速了解;Mybatis-Plus

一、Mybatis-Plus介绍 MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高 效率而生。 官网:https://mybatis.plus/ 或 https://mp.baomidou.com/ 文档地址&…

arm体系结构:汇编指令

前言 本文主要介绍ARM RISC 32位体系结构下的相关知识,主要理解寄存器和相关指令,主要读懂汇编。ARM汇编指令集汇总 指令集介绍 ARM微处理器的指令集是加载/存储型的,也即指令集仅能处理寄存器中的数据,而且处理结果都要放回寄…

科大讯飞笔试编程第二题(处理Scanner不能先输入数字再输入字符串问题)

问题: 在使用scanner的时候如果先读取一个数字,在读取一行带有空格的字符串,势必会出错或者字符串读不到 public static void main(String[] args) {Scanner scanner new Scanner(System.in);int x scanner.nextInt();String s scanner.n…

RabbitMQ-常用命令

RabbitMQ常用命令 3.1 启动停止rabbitMQ命令 # 前台启动Erlang VM 和 RabbitMQ 当窗口关闭或者ctrlc时,使退出了。 rabbitmq-server# 使用系统命令启动 systemctl start rabbitmq-server# 后台启动 rabbitmq-server -detached# 停止rabbitMQ和Erlang VM rabbitmq-…

锁的相关策略

乐观锁vs悲观锁 指的不是具体的锁,是一个抽象的概念,描述的是锁的特性,描述的是一类锁 乐观锁 假设数据一般情况下不会产生并发冲突,所以在数据进行提交更新的时候,才会正式对数据是否产生并发冲突进行检测,如果发现并发冲突了,就让返回用户错误的信息,让用户决定如何去做.(…

3dsMax软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 3dsMax是一款由Autodesk公司开发的著名的三维计算机图形软件,广泛应用于动画、游戏、建筑和产品设计等领域。它以强大的建模、动画、渲染和特效功能而闻名,为用户提供了一个完整的制作流程,从…

Java设计模式-职责链模式

1 概述 在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同。例如,公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同…

【JVM 内存结构丨栈】

栈 -- 虚拟机栈 简介定义压栈出栈局部变量表操作数栈方法调用特点作用 本地方法栈(C栈)定义栈帧变化作用对比 主页传送门:📀 传送 简介 栈是用于执行线程的内存区域,它包括局部变量和操作数栈。 Java 虚拟机栈会为每…

Python 支付宝红包二维码制作步骤分享

<table><tr><td bgcolororange>本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰&#xff0c;更不会影响计算机信息系统的正常运行。不得将代码用于非法用途&#xff0c;如侵立删&#xff01; 支付宝红包二维码制作…

三方接口调用设计方案

在为第三方系统提供接口的时候&#xff0c;肯定要考虑接口数据的安全问题&#xff0c;比如数据是否被篡改&#xff0c;数据是否已经过时&#xff0c;数据是否可以重复提交等问题 在设计三方接口调用的方案时&#xff0c;需要考虑到安全性和可用性。以下是一种设计方案的概述&a…

go语言中的切片

切片底层 切片&#xff08;Slice&#xff09;是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活&#xff0c;支持自动扩容。 切片是一个引用类型&#xff0c;它的内部结构包含地址、长度和容量。切片一般用于快速地操作一块数据集合。 切片…

eclipse中怎么将空白字符显示出来、各种空白字符显示出来是什么样子

空白字符如space、Tab、Ideographic sapce&#xff08;表意空格&#xff0c;就是表意文字中使用的全角空格&#xff09;、回车、换行。 编程规范一般都会要求不用Tab。如果代码中哪个地方用了&#xff0c;但肉眼又看不出来&#xff0c;可以将空白字符暂时显示出来看看。 通过…

知虾shopee数据分析工具:shopee运营选品助手

在如今竞争激烈的电商领域&#xff0c;Shopee商家为了在市场中脱颖而出&#xff0c;必须精准地选品和定价&#xff0c;以满足消费者需求并提升销售。而知虾Shopee数据分析工具作为一款强大的商业助手&#xff0c;为商家提供了丰富的数据分析功能&#xff0c;从而帮助他们更好地…

3.Redis 单线程模型

redis 单线程模型 redis 只使用一个线程来处理所有的命令请求&#xff0c;并不是说一个 redis 服务器进程内部真的就只有一个线程&#xff0c;其实也有多个线程&#xff0c;多个线程是再处理网络 IO。 那么在多线程中&#xff0c;针对类似于这样的场景两个线程尝试同时对一个…