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

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逃逸攻击的防御策略。

目录

4.2.2  寄存器符号化监测方法

4.2.3  SymJava 与 SymRegMonitor 设计与实现

4.2.4  源代码审计与 Java 测试用例构建

4.2.5  漏洞挖掘测试实验

4.3  漏洞挖掘研究成果展示与分析

4.3.1  Sun Toolkit 导致系统属性泄漏

4.3.2  SecuritySupport 导致系统属性泄漏

4.3.3  Mac OS X 本地文件探针漏洞

4.3.4  任意类对象获取漏洞

4.3.5  利用 JRE 原生层漏洞实现远程代码执行

4.3.6  其他JRE原生层安全问题

4.4  本章小结


4.2.2  寄存器符号化监测方法

首先给出寄存器符号化的定义:

假设有一段代码,函数foo有一个int类型的参数a,通过S2E的符号标记API,可以将其标记为符号值,记为x,然后编译该代码,拷贝进入Qemu加载的镜像中执行。在执行过程当中,遇到与x相关的任何运算时都记作一个算术表达式。执行到某处时,从Klee的指令解析模块中发现寄存器R的值等于bx+c(b和c为常量或其他符号值或其他算术表达式),就称符号x的扩展覆盖寄存器R,或称寄存器 R 符号化。

寄存器符号化证明存在一条 source-and-sink32路线:攻击者通过精心构造参数a覆盖ESP,可以让程序跳转到自己想要的位置,比如一段具备攻击性质的shellcode。针对这样的寄存器覆盖问题,本文提出寄存器符号化监控方法。

4.2.3  SymJava 与 SymRegMonitor 设计与实现

S2E 原生的符号标记 API 只能针对 Linux 下的 C代码,因此我们开发了插件SymJava,以JNI的方式标记Windows平台下Java代码中的变量。SymJava的工作原理如图4-2 所示。

SymJava可以标记的变量类型和API如表4-3所示。

通过调用表4-3 中的 API,可以得到相应类型的符号值。例如,要将一个 Java代码中的int型变量标记为符号值,伪代码如表4-4所示。

S2E 除了三大模块之外,还提供给开发者良好的扩展性,开发者基于 S2E 开发了一些用于程序分析的辅助插件【33】,例如用于监控Windows平台指定进程运行状态的WindowsFunctionMonitor,用于生成样本数据的TestcaseGenerator,用于驱动程序漏洞挖掘的SymDrivel341等等。为了实现寄存器符号化的监控,我们开发了SymRegMonitor。其架构如图4-3所示。

以寄存器EAX的监控为例, SymRegMonitor的伪代码如表4-5所示。

4.2.4  源代码审计与 Java 测试用例构建

使用符号执行平台进行漏洞挖掘工作之前,需要筛选出可以构建测试用例并符合S2E符号标记规则的Java Native API。本研究采取源代码人工审计的方法来进行该筛选工作,并选取 OpenJDK 7 作为源代码审计对象。

相对的,进行漏洞挖掘的目标API可分为以下两类:

第Ⅰ类,可以被直接调用的公有 Native API;

第II类,存在 API 调用链的可被外界干扰的私有 Native API。

在第 Ⅰ 类当中,static 关键字修饰的静态 Native API 调用起来更加简单,一旦存在漏洞,其利用就变得非常简单。所以在本项研究中,特别提出第1类(第I 类的子集,即I'CI:

第I'(I'cI)类,static 关键字修饰的公有 Native API.

本文的源代码审计工作基于寻找上述第Ⅰ'类与第II类目标 API而展开,由于Oracle JRE 并不开源,需要通过 jad 等 class 文件逆向工具进行反编译,工作量较大。本文进行的研究针对开源的OpenJDK(7-b147版本)源代码进行审计,确认发现第Ⅰ'类或第II类 API之后,再逐一对 Oracle JRE 的同一 class 文件进行反编译并作比对,最终确定所有进行漏洞挖掘的目标API,其类型和数量如表4-7所示。

 

本研究选取了:

com.sun.org.apache.xalan.internal.utils.ObjectFactory.findProvideClass

这一缺陷 API。该 API 通过传入一个字符串类型的参数(指定要获取 class 的全限定名)可以获取任意包中的class对象,继而可以通过构造Expression表达式调用任意第1'类API,详细分析见4.3.4小节。该过程伪代码如表4-8所示。

4.2.5  漏洞挖掘测试实验

本实验使用了开源符号执行平台 S2E,基于插件 SymJava 和 SymRegMonitor对36个Native API构造的测试用例进行了测试。由于符号执行是计算资源密集型的方法,本实验选取了配置有12核24线程Intel Xeon处理器和72GB内存的计算机作为测试机器,系统环境为Ubuntu 12.04 Server。

4.3  漏洞挖掘研究成果展示与分析

本小节给出4.1 小节以及4.2小节中漏洞挖掘工作的研究成果,并作分析。

4.3.1  Sun Toolkit 导致系统属性泄漏

漏洞存在于 sun.awt.SunToolkit.getSystemProperty,在白盒审计版本 OpenJDK7-b147 时发现。该方法的源代码如表4-10 所示。

这个方法具备缺陷 API 的所有特征:存在信任调用链——可以构造表达式Expression 间接调用,参数可控——可以控制系统属性字符串参数,关键代码被doPrivileged 代码块包裹——获取系统参数的方法 System.getProperty,从而造成系统属性隐私信息泄露。利用方法也很简单,通过构造一个Expression来执行该方法,与 CVE-2012-4681 类似。不过在 Oracle JRE 7 中的 SunToolkit 类删除了这个方法,修补方式也跟 CVE-2012-4681 一样。

4.3.2  SecuritySupport 导致系统属性泄漏

漏洞存在于如下类中:

com.sun.org.apache.xalan.internal.utils.SecuritySupport.getSystemProperty

在审计版本Apple JRE 6u27时发现,该方法源码如表4-11所示(由Windows下的 jad 反编译得到)。

 

这里再补充一点,可以获取到的系统属性是 System.getProperty 所提供的,主要包括系统用户名、主目录、操作系统类型和版本、JRE版本、JRE安装路径、JVM 版本号等等,如表4-12所示。

 

4.3.3  Mac OS X 本地文件探针漏洞

漏洞存在于类 com.apple.eio.FileManager.moveToTrash 中,在审计版本 Apple JRE 6u27时发现。该方法的源代码如表4-13所示。

4.3.4  任意类对象获取漏洞

漏洞存在于如下类中:

com.sun.org.apache.xalan.intemal.utils.ObjectFactory. findProviderClass.

在审计版本Apple JRE 6u27时发现,该方法源码如表4-14所示(由Windows下的 jad 反编译得到)。

该方法的逻辑为:若securityManager不为null,就直接返回Class.forName的结果。通过控制字符串参数s,可以获取到任意类的class对象。假如获取的目标类含有public static的存在漏洞的API,就可以配合这个缺陷API构造一个Expression来调用这个存在漏洞的API.

4.3.5 小节将详细介绍这一漏洞利用思路。

4.3.5  利用 JRE 原生层漏洞实现远程代码执行

该原生层漏洞所在位置:

sun.java2d.DefaultDisposerRecord.invokeNativeDispose.

该方法声明如下所示:

public static native void invokeNativeDispose(long

disposerMethodPointer, long dataPointer);

通过查看OpenJDK的Native Code源码可知,这个native方法的具体实现为:将disposerMethodPointer和dataPointer两个长整型参数转化为指针,其中disposerMethodPointer被转化为函数入口指针(相当于call这个指针指向的地址),所以disposerMethodPointer的值可以覆盖EIP; dataPointer指向的是被“call"方法所需的参数,会覆盖EAX地址,这样以来,结合堆喷射技术,可以执行shellcode

由于这个类位于sun.包,是在访问限制列表中的。但通过4.3.4小节提到的Java API设计缺陷,可以得到该类的一个class对象,再通过构造Expression,可以调用到缺陷方法invokeNativeDispose。

4.3.6  其他JRE原生层安全问题

SymRegMonitor发现的6个安全问题所在的API、寄存器符号化情况以及可造成的影响如表4-15所示。

4.4  本章小结

本章申明JRE漏洞挖掘研究的背景和意义,针对Java API设计缺陷和Java原生层漏洞分别制定不同的漏洞挖掘方案:通过白盒审计和历史漏洞规则制定相结合审计了若干版本的JRE,发现了数个Java API设计缺陷;而针对原生层漏洞的挖掘工作,则引入符号执行理论,基于开源框架S2E开发了用于检测寄存器符号化的插件SymJava和SymRegMonitor,结合白盒审计、测试用例构建,最终通过实验发现了数个Java原生层安全问题。在本章4.3 小节,对本研究中的漏洞挖掘工作发现的安全问题作了总结和分析。

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

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

相关文章

Compose - 基本使用

一、概念 1.1 Compose优势 由一个个可以组合的Composable函数拼成界面,方便维护和复用。布局模型不允许多次测量,提升了性能。Compose可以和View互操作(相互包含对方)。 1.2 声明式UI APP展示的数据绝大多数不是静态数据而是会…

[论文分享]TSPTM-survey:时间序列预训练模型研究综述

目录 1 概要 1.1 贡献点 2 背景 2.1 时序挖掘(TSM)任务 2.2 时间序列的深度学习模型 2.3 预训练模型优势 3 TS-PTMS 概述 3.1 监督预训练 3.1.1 基于分类的预训练 3.1.1.1 通用编码器 3.1.1.2 对齐编码器 3.1.1.3 模型重编程 3.1.1.4 总结 3.1.2 基于预测的预训练…

MySQL数据库中间件Mycat介绍及下载安装(教程)

一,介绍 MyCat是开源的、活跃的、基于Java语言编写的MySQL数据库中间件。可以像使用MySQL一样来使用MyCat,对于开发人员来说根本感觉不到MyCat的存在。 开发人员只需要连接MyCat即可,而具体底层用到几台数据库,每一台数据库服务器…

Linux TCP协议

传输层的协议主要有三个:TCP协议(可靠)、UDP协议(不可靠)和SCPT协议(不可靠)。 一、TCP协议的概念 TCP协议也称传输控制协议,是一种可靠的、面向连接的、基于字节流的传输层通信协…

缓存最佳实践

目录 前言 一、Cache Aside(旁路缓存)策略 二、不一致解决场景及解决方案 一、数据库主从不一致 二、缓存与数据库不一致 三、问题分析 三、缓存误用 一、多服务共用缓存实例 二、调用方缓存数据 三、缓存作为服务与服务之间传递数据的媒介 四…

二叉搜索树-----红黑树

✅<1>主页&#xff1a;我的代码爱吃辣&#x1f4c3;<2>知识讲解&#xff1a;数据结构——红黑树☂️<3>开发环境&#xff1a;Visual Studio 2022&#x1f4ac;<4>前言&#xff1a;红黑树也是一颗二叉搜索树&#xff0c;其作为map&#xff0c;set的底层…

[PyTorch][chapter 51][Auto-Encoder -1]

目录&#xff1a; 简介 损失函数 自动编码器的类型 一 AutoEncoder 简介&#xff1a; 自动编码器是一种神经网络&#xff0c;用于无监督学习任务.(没有标签或标记数据), 例如降维,特征提取和数据压缩. 主要任务&#xff1a; 1&#xff1a; 输入数据 …

功能强大的网站检测工具Web-Check

什么是 Web-Check &#xff1f; Web-Check是一款功能强大的一体化工具&#xff0c;用于查找有关网站/主机的信息。目前仪表版上可以显示&#xff1a;IP 信息、SSL 信息、DNS 记录、cookie、请求头、域信息、搜索爬虫规则、页面地图、服务器位置、开放端口、跟踪路由、DNS 安全扩…

设计模式之抽象工厂

文章目录 一、介绍二、基本组件三、演示案例1. 定义抽象工厂2. 定义抽象产品3. 定义具体工厂4. 定义具体产品5. 代码演示6. 代码改造 四、总结 一、介绍 抽象工厂模式(Abstract Factory Pattern)属于创建型设计模式。用于解决比工厂方法设计模式更加复杂的问题。 复杂到哪里了…

3.Redis 单线程模型

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

【JVM 内存结构丨栈】

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

探索Java集合框架—数据结构、ArrayList集合

一、背景介绍 Java集合的使用相信大家都已经非常得心应手&#xff0c;但是我们怎么做到知其然&#xff0c;更知其所以然这种出神入化的境界呢&#xff1f;我们揭开集合框架底层神秘面纱来一探究竟 目录 一、背景介绍 二、思路&方案 数据结构是什么&#xff1f; 数据结…

Aspose.Tasks for .NET V23Crack

Aspose.Tasks for .NET V23Crack 改进了大型项目的内存占用。 添加了API&#xff0c;允许您在应用程序无法访问系统字体文件夹时指定用户的字体文件夹。 Aspose.Tasksfor.NET是处理MicrosoftProject文件的可靠的项目管理API。API支持在不依赖Microsoft Project的情况下读取、写…

【C++】list

list 1. 简单了解list2. list的常见接口3. 简单实现list4. vector和list比较 1. 简单了解list list的底层是带头双向循环列表。因此list支持任意位置的插入和删除&#xff0c;且效率较高。但其缺陷也很明显&#xff0c;由于各节点在物理空间是不连续的&#xff0c;所以不支持对…

ElasticSearch简介、安装、使用

一、什么是ElasticSearch&#xff1f; Elasticsearch 是 Elastic Stack 核心的分布式搜索和分析引擎。 Logstash 和 Beats 有助于收集、聚合和丰富您的数据并将其存储在 Elasticsearch 中。 Kibana 使您能够以交互方式探索、可视化和分享对数据的见解&#xff0c;并管理和监…

如何搭建智能家居系统并通过内网穿透实现远程控制家中设备

文章目录 前言1. 安装Home Assistant2. 配置Home Assistant3. 安装cpolar内网穿透3.1 windows系统3.2 Linux系统3.3 macOS系统 4. 映射Home Assistant端口5. 公网访问Home Assistant6. 固定公网地址6.1 保留一个固定二级子域名6.2 配置固定二级子域名 前言 Home Assistant&…

stm32基于HAL库驱动外部SPI flash制作虚拟U盘

stm32基于HAL库驱动外部SPI flash制作虚拟U盘 &#x1f4cc;参考文章&#xff1a;https://xiaozhuanlan.com/topic/6058234791&#x1f39e;实现效果演示&#xff1a; &#x1f516;上图中的读到的FLASH_ID所指的是针对不同容量&#xff0c;所对应的ID。 //W25X/Q不同容量对应…

【面试】线上 CPU 100% 问题排查

回答套路一般为&#xff1a;线上服务器没有排查过&#xff0c;线上服务器只有运维才有操作权限。在平时开发的时候&#xff0c;在测试服务器上排查过。 一、复现代码 public class Test {public static void main( String[] args ){int a 0;while (a < 100) {a * 10;}} }…

Redis知识点总结

概述 Redis诞生于2009年&#xff0c;全称是Remote Dictionarty Server(远程词典服务器) 只支持单线程 非关联&#xff1a;主要指的是表中没有主外键等概念 Redis是一款内存数据库&#xff0c;主要存储键值对类型的数据 基本用法 注意&#xff1a;该操作是在cli中进行的 首…

windows安装多个版本node

1.下载nvm-setup版本 安装过程会检测到你当前使用的node版本 提示 Node v12.14.0 is already installed. Do you want NVM to control this version? 翻译&#xff1a;已安装节点v12.14.0。你想让NVM控制这个版本吗? 选择 是(Y)。 nvm默认为我们增添了环境变量&#xff0c;…