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

目录

1  绪论

1.1  背景介绍

1.2  研究意义

1.3  研究现状

1.4  本文所做工作

1.5  文章结构


1  绪论

在互联网技术飞速发展的现代社会,互联网的规模正在快速增长,接入互联网的计算机也越来越多。对于个人计算机用户乃至企业、政府计算机用户,其信息安全问题也逐渐成为计算机互联网领域中的研究热点。浏览器作为接入互联网的窗口应用,其本身安全问题及其插件安全问题也备受重视。Java Applet作为浏览器的一种插件,在丰富浏览器功能、提升用户体验的同时,也引入了一些值得关注的安全问题。本文着眼于JRE漏洞引发的安全攻防问题,针对几种特定类型的JRE漏洞展开分析、研究与挖掘。本章内容将简要介绍JVM逃逸技术, JRE漏洞研究背景、意义、现状,文章组织结构等等。

1.1  背景介绍

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文件中写入如下代码:

<applet code=”MyApplet.class”></applet>

用户访问这个页面的时候,会将Java Applet程序MyApplet.class下载到本地,由本地的 JVM 加载并执行。

这样以来,对于攻击者而言,便产生了一个攻击面(Attack Surface):攻击者利用JRE漏洞,编写恶意的Java Applet,挂载到Web页面中,将URL发送给受害者;若安装了JRE的受害者访问了恶意页面,便执行了Applet,触发本地JRE漏洞,发起了逃逸出本地JVM而针对操作系统的攻击,从而使受害者的计算机被恶意控制,造成远程代码执行、隐私信息泄露等安全问题。本文将这样一个过程称为“JVM逃逸”,其中利用的漏洞为“JRE漏洞”。

1.2  研究意义

近年来,以浏览器及其插件作为攻击面的安全事件不断增多,典型的安全问题包括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漏洞挖掘技术,显得十分有研究价值。

1.3  研究现状

在本课题领域,国内外的研究方向更偏向于 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这类操作系统级别的安全防护则不是本文讨论范围内的重点。

1.4  本文所做工作

本文的主要研究内容包括 Java安全机制探究, JRE漏洞分析, JRE漏洞挖掘技术与实现,JRE 漏洞的利用与防范。本文所做的研究工作如下:

1.探究Java安全机制, JRE沙箱组成部件,总结各关键组件特性,挖掘其潜在脆弱点。

2.总结现有JRE漏洞类型并作分类,对每种分类中具备代表性的漏洞,基于公开的PoC源代码进行分析与调研。

3.针对不同类型的JRE漏洞,制定漏洞挖掘方案,选择对应的漏洞挖掘技术,结合源代码审计与基于符号执行的灰盒测试技术进行漏洞挖掘工作,最终发现数个JRE安全问题,并给出成果展示。

4.分别从攻击者和防御者两种视角,分析并总结现有的JVM逃逸攻击与防御手段,研究并发现主流杀毒软件的脆弱性,并给出多维防御方案。

1.5  文章结构

本文共分为六章,各章标题及内容概要如下所示:

第一章:绪论。简要介绍本文内容相关的基本知识背景,解释JVM逃逸与JRE漏洞概念,给出JRE漏洞问题的研究意义与研究现状,并简要概括本文所做工作。

第二章:Java安全机制研究。根据Java安全机制的几大重要模块,分别深入剖析其安全逻辑设计的特点以及潜在安全问题,为后续内容提供知识背景。

第三章:JRE漏洞分析。针对第二章中的内容总结出JRE的潜在缺陷点,结合现有已知的JRE漏洞作分类研究,从Java API设计缺陷、Java原生层漏洞、类型混淆以及自签名问题等角度,深入分析对应漏洞类型的PoC代码,并分别总结其漏洞特征。

第四章:JRE漏洞挖掘研究。基于第三章的工作展开JRE漏洞挖掘工作,针对Java API设计缺陷型漏洞和Java原生层漏洞分别给出不同的漏洞挖掘解决方案,并通过白盒审计与灰盒测试实验发现数个JRE安全问题,最终给出分析。

第五章:JVM逃逸的利用与防范。分别从攻击者和防御者的角度,结合漏洞挖掘工作中的研究,指出当前杀毒软件防御策略的薄弱环节,总结漏洞利用技巧。最后分析和比对各软件厂商的防范措施,总结其优劣并提出防御策略。

第六章:总结与展望。总结本文出现的关键内容,根据当前研究形势提出未来的研究方向和策略。

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

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

相关文章

如何使用Wireshark进行网络流量分析?

如何使用Wireshark进行网络流量分析。Wireshark是一款强大的网络协议分析工具&#xff0c;可以帮助我们深入了解网络通信和数据流动。 1. 什么是Wireshark&#xff1f; Wireshark是一个开源的网络协议分析工具&#xff0c;它可以捕获并分析网络数据包&#xff0c;帮助用户深入…

Spring Security

简介 Spring Security是一个专注于为Java程序提供身份认证和授权的框架&#xff0c;他可以轻松扩展以满足自定义的需求 特征 对身份的认证和授权提供全面的、可扩展的支持防止各种攻击&#xff0c;如回话固定攻击、点击劫持、csrf攻击等支持与Servlet API、Spring MVC等Web技…

生成模型 -- GAN

文章目录 1. 生成模型与判别模型1.1 生成模型 2. VAE3. GAN3.1 GAN-生成对抗网络3.2 GAN-生成对抗网络的训练3.2.1 判别模型的训练&#xff1a;3.2.2 生成网络的训练&#xff1a; 4. LeakyReLU5. GAN代码实例 1. 生成模型与判别模型 生成模型与判别模型 我们前面几章主要介绍了…

C语言日常刷题 3

文章目录 题目答案与解析1234、5、6、 题目 1.已知函数的原型是&#xff1a; int fun(char b[10], int *a); &#xff0c;设定义&#xff1a; char c[10];int d; &#xff0c;正确的调用语句是&#xff08; &#xff09; A: fun(c,&d); B: fun(c,d); C: fun(&c,&d…

ARM开发,stm32mp157a-A7核(UART总线实验)

1.目标&#xff1a;键盘输入一个字符a,串口工具显示b&#xff1b; 键盘输入一个字符串"nihao",串口工具显示"nihao"&#xff1b; 2.框图分析&#xff1a; 3.代码&#xff1a; ---.h头文件--- #ifndef __UART4_H__ #define __UART4_H__#include "st…

时序预测 | MATLAB实现基于TSO-XGBoost金枪鱼算法优化XGBoost的时间序列预测(多指标评价)

时序预测 | MATLAB实现基于TSO-XGBoost金枪鱼算法优化XGBoost的时间序列预测(多指标评价) 目录 时序预测 | MATLAB实现基于TSO-XGBoost金枪鱼算法优化XGBoost的时间序列预测(多指标评价)预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现基于TSO-XGBoost金枪鱼算…

设计模式三原则

1.1单一职责原则 C 面向对象三大特性之一的封装指的就是将单一事物抽象出来组合成一个类&#xff0c;所以我们在设计类的时候每个类中处理的是单一事物而不是某些事物的集合。 设计模式中所谓的单一职责原则&#xff0c;就是对一个类而言&#xff0c;应该仅有一个引起它变化的原…

【MYSQL8.0从入门到精通】

文章目录 MySQL 8.0一.MySQL的多表操作1.外键约束&#xff08;一对多&#xff09;2.外键约束&#xff08;多对多&#xff09; MySQL 8.0 一.MySQL的多表操作 1.外键约束&#xff08;一对多&#xff09; 方式1 在创建表的同时创建外键约束 -- 1.创建主表 create table if no…

十大排序算法

一、冒泡排序 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单直观的排序算法。它重复地走访要排序的数列&#xff0c;一次比 较两个元素&#xff0c;如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换&#xff0c;也就是说该数列已经…

13. Docker实战之安装MySQL

目录 1、前言 2、部署MySQL 2.1、Docker仓库查看镜像 2.2、拉取MySQL镜像 2.3、创建持久化目录 2.4、启动MySQL容器 2.5、查看宿主机上的MySQL目录 2.6、本地MySQL测试 2.7、新建MySQL用户&#xff0c;配置远程访问 2.8、本地Navicat连接测试 3、为什么数据库不适合D…

NoSQL数据库介绍+Redis部署

目录 一、NoSQL概述 1、数据的高并发读写 2、海量数据的高效率存储和访问 3、数据库的高扩展和高可用 二、NoSQL的类别 1、键值存储数据库 2、列存储数据库 3、文档型数据库 4、图形化数据库 三、分布式数据库中的CAP原理 1、传统的ACID 1&#xff09;、A--原子性 …

Spring boot 集成单元测试

1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency> 2. 3.编写测试类 package com.enterprise;import com.enterpr…

Java接收前端请求体方式

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 文章目录 RequestBodyPathVariableRequestParamValidated方法参数校验方法返回值校验 RequestHeaderHttpServletRequest ## Java接收前端请求体的方式 请求体&#xf…

统计动力学笔记(三)整波滤波器(自留用)

整波滤波器 1. 整波滤波器推导2. 线性动态系统输出端的随机信号的方差 整波滤波器是一类能够整合具有任意频谱密度的静定随机信号的滤波器。其输入信号往往是白噪声。 1. 整波滤波器推导 由统计动力学笔记&#xff08;二&#xff09;频谱密度与线性随机系统的动态准确性&…

sklearn 笔记: neighbors.BallTree

球树结构 1 基本使用方法 sklearn.neighbors.BallTree(X, leaf_size40, metricminkowski, **kwargs) 2 主要参数说明 X 输入数据&#xff0c;维度为 (n_samples, n_features) n_samples 是数据集中点的数量n_features 是参数空间的维数leaf_size 点数少于多少时&#xff0c…

Mysql-索引

文章目录 索引实现原理最左匹配原则Explain重要字段索引类型数据库的NULL存储索引下推filesort原理参考 索引实现原理 MySQL索引实现解析 最左匹配原则 MySQL索引最左匹配原则是什么 创建一个表格 CREATE TABLE test ( a int NOT NULL AUTO_INCREMENT, b int DEFAULT NU…

数据结构,线性表有哪些

线性表是一种常见的数据结构&#xff0c;它的特点是数据元素之间存在一对一的线性关系。根据线性表的存储方式和实现方式&#xff0c;线性表主要有以下几种&#xff1a; 1. 顺序表&#xff08;Sequential List&#xff09;: - 通常使用数组实现。 - 元素在内存中是连续…

VR智慧校园资中控管理平台综合提升了课堂教学质量

随着越来越多高校在课堂中引进VR虚拟仿真实训系统&#xff0c;为了方便老师对全班同学进行高效率地管理&#xff0c;VR中控平台应运而生。下面为您详细介绍VR中控平台在课堂教学中的应用优势。 VR中控系统安装在教师总控端&#xff0c;融合了课件、视频、3D动画等丰富的教学资源…

顺序表链表OJ题(1)——【LeetCode】

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 前言&#xff1a; 今天我们来回顾一下顺序表与链表&#xff0c;针对这一块我们也有许多OJ题目供大家参考。当我们学习完顺序表链表后避免不了一些习题的练习&#xff0c;这样才能巩固我们学习的内容。 话不多说&#xf…

c++ 中new的用法

当你使用 C 中的 new 操作符时&#xff0c;你实际上在堆内存中分配了一块空间&#xff0c;用于存储一个或多个对象。这与栈内存不同&#xff0c;栈内存的分配和释放是自动管理的&#xff0c;而堆内存需要手动管理。下面我将详细解释如何使用 new 操作符来创建单个对象和对象数组…