点击上方“凌天实验室”,“星标或置顶公众号”

漏洞、技术还是其他,我都想第一时间和你分享

【历史】已连载更新全部内容:【菜单栏】-【JAVA SEC】

sun.misc.Unsafe是Java底层API(仅限Java内部使用,反射可调用)提供的一个神奇的Java类,Unsafe提供了非常底层的内存、CAS、线程调度、类、对象等操作、Unsafe正如它的名字一样它提供的几乎所有的方法都是不安全的,本节只讲解如何使用Unsafe定义Java类、创建类实例。

如何获取Unsafe对象

Unsafe是Java内部API,外部是禁止调用的,在编译Java类时如果检测到引用了Unsafe类也会有禁止使用的警告:Unsafe是内部专用 API, 可能会在未来发行版中删除

sun.misc.Unsafe代码片段:

import sun.reflect.CallerSensitive;import sun.reflect.Reflection;

public final class Unsafe {

private static final Unsafe theUnsafe;

static {        theUnsafe = new Unsafe();        省去其他代码......    }

private Unsafe() {    }

@CallerSensitivepublic static Unsafe getUnsafe() {        Class var0 = Reflection.getCallerClass();if (var0.getClassLoader() != null) {throw new SecurityException("Unsafe");        } else {return theUnsafe;        }    }

    省去其他代码......}

由上代码片段可以看到,Unsafe类是一个不能被继承的类且不能直接通过new的方式创建Unsafe类实例,如果通过getUnsafe方法获取Unsafe实例还会检查类加载器,默认只允许Bootstrap Classloader调用。

既然无法直接通过Unsafe.getUnsafe()的方式调用,那么可以使用反射的方式去获取Unsafe类实例。

反射获取Unsafe类实例代码片段:

// 反射获取Unsafe的theUnsafe成员变量

当然我们也可以用反射创建Unsafe类实例的方式去获取Unsafe对象:

// 获取Unsafe无参构造方法Constructor constructor = Unsafe.class.getDeclaredConstructor();

// 修改构造方法访问权限constructor.setAccessible(true);

// 反射创建Unsafe类实例,等价于 Unsafe unsafe1 = new Unsafe();Unsafe unsafe1 = (Unsafe) constructor.newInstance();

获取到了Unsafe对象我们就可以调用内部的方法了。

allocateInstance无视构造方法创建类实例

假设我们有一个叫com.anbai.sec.unsafe.UnSafeTest的类,因为某种原因我们不能直接通过反射的方式去创建UnSafeTest类实例,那么这个时候使用UnsafeallocateInstance方法就可以绕过这个限制了。

UnSafeTest代码片段:

public class UnSafeTest {

private UnSafeTest() {// 假设RASP在这个构造方法中插入了Hook代码,我们可以利用Unsafe来创建类实例      System.out.println("init...");   }

}

使用Unsafe创建UnSafeTest对象:

// 使用Unsafe创建UnSafeTest类实例UnSafeTest test = (UnSafeTest) unsafe1.allocateInstance(UnSafeTest.class);

Google的GSON库在JSON反序列化的时候就使用这个方式来创建类实例,在渗透测试中也会经常遇到这样的限制,比如RASP限制了java.io.FileInputStream类的构造方法导致我们无法读文件或者限制了UNIXProcess/ProcessImpl类的构造方法导致我们无法执行本地命令等。

defineClass直接调用JVM创建类对象

ClassLoader章节我们讲了通过ClassLoader类的defineClass0/1/2方法我们可以直接向JVM中注册一个类,如果ClassLoader被限制的情况下我们还可以使用UnsafedefineClass方法来实现同样的功能。

Unsafe提供了一个通过传入类名、类字节码的方式就可以定义类的defineClass方法:

public native Class defineClass(String var1, byte[] var2, int var3, int var4);

public native Class> defineClass(String var1, byte[] var2, int var3, int var4, ClassLoader var5, ProtectionDomain var6);

使用Unsafe创建TestHelloWorld对象:

// 使用Unsafe向JVM中注册com.anbai.sec.classloader.TestHelloWorld类Class helloWorldClass = unsafe1.defineClass(TEST_CLASS_NAME, TEST_CLASS_BYTES, 0, TEST_CLASS_BYTES.length);

或调用需要传入类加载器和保护域的方法:

// 获取系统的类加载器ClassLoader classLoader = ClassLoader.getSystemClassLoader();

// 创建默认的保护域ProtectionDomain domain = new ProtectionDomain(new CodeSource(null, (Certificate[]) null), null, classLoader, null);

// 使用Unsafe向JVM中注册com.anbai.sec.classloader.TestHelloWorld类Class helloWorldClass = unsafe1.defineClass(    TEST_CLASS_NAME, TEST_CLASS_BYTES, 0, TEST_CLASS_BYTES.length, classLoader, domain);

Unsafe还可以通过defineAnonymousClass方法创建内部类,这里不再多做测试。

注意:

这个实例仅适用于Java 8以前的版本如果在Java 8中应该使用应该调用需要传类加载器和保护域的那个方法。Java 11开始Unsafe类已经把defineClass方法移除了(defineAnonymousClass方法还在),虽然可以使用java.lang.invoke.MethodHandles.Lookup.defineClass来代替,但是MethodHandles只是间接的调用了ClassLoaderdefineClass,所以一切也就回到了ClassLoader

**如果您在阅读文章的时候发现任何问题都可以通过Vchat与我们联系,也欢迎大家加入javasec微信群一起交流。

Vchat获取方式:对话框发送“javasec”

凌天实验室

凌天实验室,是安百科技旗下针对应用安全领域进行攻防研究的专业技术团队,其核心成员来自原乌云创始团队及社区知名白帽子,团队专业性强、技术层次高且富有实战经验。实验室成立于2016年,发展至今团队成员已达35人,在应用安全领域深耕不辍,向网络安全行业顶尖水平攻防技术团队的方向夯实迈进。

字体对话框java实验_Java Web安全 || Java基础 sun.misc.Unsafe相关推荐

  1. 【Java报错】记录一次 sun.misc.Unsafe.park(Native Method) Conflicting setter definitions for property 导致的内存泄露

    1. 报错信息 2021-10-29 08:44:56 WARN [,,,] [main] o.a.c.loader.WebappClassLoaderBase - The web applicati ...

  2. java unsafe park_在sun.misc.Unsafe.park(本机方法)中等待

    我的一个应用程序在负载下运行一段时间后挂起,有人知道是什么会导致jstack中的此类输出: "scheduler-5" prio=10 tid=0x00007f49481d0000 ...

  3. java unsafe park_java – WAITING at sun.misc.Unsafe.park(Native Method)

    我的一个应用程序在一段负载运行的时间内挂起,有谁知道在jstack中可能会导致这样的输出: "scheduler-5" prio=10 tid=0x00007f49481d0000 ...

  4. java实验2总结心得,java实验的心得体会

    java实验的心得体会 java实验心得体会篇一:java实验总结 1. 设计一个Person类,包含:姓名,年龄,性别.要求:该类至多只能创建一男.一女两个对象! 2. 设计一个测试类Test,创建 ...

  5. Java实验报告一:Java环境使用配置

    Java实验报告一:Java开发环境的安装与配置 一. 实验目的 1.熟练掌握Java开发环境的安装配置和程序调试过程. 二. 实验内容 1.实验步骤: ⑴. 在Windows操作系统下安装JDK6. ...

  6. 云南大学软件学院java实验九_云南大学java实验9

    java实验 (9) 6页 2下载券 Java实验9 4页 2下载券 JAVA实验9 7页 1下载券 java 实验9 暂无评价 1页 免费 Java上机实验9 4页 免费 云大JAVA 实验9图形. ...

  7. 聊聊高并发(十七)解析java.util.concurrent各个组件(一) 了解sun.misc.Unsafe类

    了解了并发编程中锁的基本原理之后,接下来看看Java是如何利用这些原理来实现各种锁,原子变量,同步组件的.在开始分析java.util.concurrent的源代码直接,首先要了解的就是sun.mis ...

  8. 在Java 9中使用sun.misc.Unsafe

    Java 9 EA版本已经发布,现在我们可以看到如何使用sun.misc.Unsafe. 我领导了公开运动,以保留对Java 9的访问,该访问最终成功,从而导致对JEP 260的修订. 那么,事情如何 ...

  9. JVM 的 Finalization Delay 引起的 OOM(java.lang.OutOfMemoryError:null at sun.misc.Unsafe.allocateMemory.)

    今天在压力测试环境某一个服务出现crash了,经过一番检查,终于发现是由于JVM的Finalization Delay引起的,这个问题比较特殊,这里记录一下. 这个服务是用Java写的,主要完成的功能 ...

最新文章

  1. java界面设计素材_9.java图形用户界面设计.ppt
  2. 基于 python + WebDriverAgent 的“跳一跳”小程序高分教程
  3. numpy.arange详解
  4. android 如何重载函数,android - 如何在Frida中使用“ int”重载函数 - 堆栈内存溢出...
  5. 注意力机制可视化_Attention isn’t all you need!BERT的力量之源远不止注意力
  6. Linux基础——操作系统框架
  7. 拖得太久了 美运营商ATT取消三星折叠手机Galaxy Fold预购订单
  8. 天猫标的就是虚价,果然败家节啊
  9. 网页布局02 盒子模型
  10. wamp环境下php命令运行时出现错误:无法启动此程序,因为计算机中丢失OCI.dll。尝试重新安装该程序以解决此问题...
  11. 4.2 录制第一个jmeter性能测试脚本(http协议)
  12. Python unrar解压rar压缩文件
  13. 商业调查——您可以下载 16 个免费问卷模板
  14. Codeforces Round #429 (Div. 2) B. Godsend
  15. 归档命令(5)——shar
  16. 2023北方民族大学计算机考研信息汇总
  17. 激光通过散射介质的聚焦
  18. 什么叫分销商_分销是什么意思「详细介绍」带你秒懂
  19. 超详细c语言简化tcp通信接口(多线程实现一个服务端处理多个客户端服务)
  20. antd_Ant Design Pro_Vue打包问题:使用静态本地文件路径访问

热门文章

  1. How is an SAP OData Batch request handled in the backend
  2. different color in Chrome Development Tool
  3. 从bsp redirect到ui5_ui5
  4. 代码改动和配置文件相分离
  5. ABAP Decimal byte
  6. Kubernetes pod状态出现CrashLoopBackOff 的原因
  7. SAPGUI系统登录页面配置的SAProuter有什么用 2
  8. 系统接口对接的进度工作应该谁来干_第三方分账系统开发的那些坑,给你节省几十万...
  9. uniapp 定时执行_ftp上传,完成ftp定时上传、下载只需3步
  10. 怎么获取php文件,学习猿地-php怎么获取文件修改时间?