虚拟机逃逸是什么,深入理解jvm原理之逃逸分析

最近一直在学习Java虚拟机原理,觉得有意思的地方就写个文章记录下来虚拟机逃逸是什么。优胜劣汰是自然界的发展,适用到Java虚拟机也不为过,jvm过了生存下去,一直在自我进化,Java虚拟机也在不停的进化和优化,有的是基于执行代码的优化,例如指令重排序等等;有的是基于分析技术,例如关系分析或者逃逸分析等等,今天就重点介绍一下jvm中的分析技术优化---逃逸分析;内容大部分源自于《深入理解Java虚拟机》;

逃逸分析一般分为两种:一种基本行为就是分析对象的动态作用域,当一个对象在方法中定义后,它可能被外部的方法所引用,例如作为调用参数传入了其他对象中,称为方法逃逸;甚至被外部线程所引用,例如赋值给变量或可以在其他线程中访问的变量,这种优化行为称为线程逃逸;

概念归概念,最终效果怎么样,肯定还需要是骡子是马拉出来遛遛,总牛的理论需要落地检验,说程序员的话,也就是一个对象不会逃逸到方法或者线程之外后,这个变量会进行一些高效的优化;实现方式一般有下面几种;

栈上分配:无论是C#还是Java的程序员,大家都知道,对象会创建在Java堆上,而Java堆中的对象对线程(Java线程)是共享和可见的,而虚拟机的垃圾回收就是回收对象不再适用的对象,无论哪种垃圾回收器,都需要需要筛选和整理可回收的对象,回收和整理要耗费很长时间,如果确定一个方法不会逃逸出方法之外,那就让这个对象直接分配在栈上,而对象所占用的空间也会随着帧栈的出栈而销毁,垃圾回收系统的压力会就变的小了;

消除同步:线程同步本身就是一个相对耗时的过程(至于为什么耗时,可以查询用户线程和内核线程相关知识),如果确认一个对象不会被其他线程访问;那么变量的读写就不会和其他线程竞争,对于这种变量实施的同步可以消除;

标量替换:标量又称scalar是指一个数据已经无法再分解成更小的数据来表示了,Java虚拟机中的原始数据例如int,long,等值类型以及reference类型,都不能再进一步分解,他们就可以称为标量,相对的,它们如果可以继续分解,那就是称为聚合量又称Aggregate,Java对象就是典型的聚合量,如果把一个对象拆散,根据程序访问情况,将其使用到的成员变量类型变成基本类型代替,如果jvm逃逸分析中发现这个对象不会外部对象使用,那程序执行的就不会创建该对象,为改为创建它的若干个被这个方法使用的成员变量来代替(栈上创建的数据,又很大的概率会被jvm分配至物理机的高速寄存器中存储),这个也为后续进一步的优化创造了条件;

逃逸分析很多优势还在陆陆续续发现,Java8已经默认开启了逃逸分析,-XX:+DoEscapeAnalysis开启或者关闭这个选项;都是干活,后续上带么和截图来验证一下;

日前,第八届互联网安全大会ISC 2020线上拉开帷幕,作为全球首场网络安全万人云峰会,在“数字孪生时代下的新安全”主题下,8月13日上线的漏洞管理与研究论坛,成为技术日最火爆的论坛之一。

虚拟机逃逸是什么,深入理解jvm原理之逃逸分析

众所周知,素有网络“军火”之称的漏洞,一直是网络安全圈的焦点。此次论坛上,360 Vulcan Team漏洞挖掘与利用高级专家虚拟化安全研究员肖伟就通过一篇题为《Qemu-kvm和ESXi虚拟机逃逸实例分享》的演讲,向与会嘉宾及一众技术爱好者分享了东半球最强白帽团队的独家挖“洞”锦囊。

虚拟机逃逸是什么,深入理解jvm原理之逃逸分析

分享Qemu-kvm漏洞实例时,肖伟介绍称,首先Qemu作为一款开源的虚拟化软件,是通过代码模拟网卡、显卡、声卡等硬件设备的常用软件,而qemu-kvm指的是虚拟机服务。该漏洞,是360 VulcanTeam于2019天府杯中,用时13秒即刻破解的经典0day漏洞。

肖伟强调,该漏洞一旦被成功利用,可以实现越界读、越界写、相对偏移越界写等操作,最终在宿主机中执行任意代码,造成较为严重的信息泄露。早在2019年天府杯中,360 VulcanTeam就是利用该0day漏洞完成破解,用时13秒实现虚拟机逃逸,率先锁定天府杯冠军宝座。

现场分享Qemu-kvm漏洞实例时后,肖伟在演讲中继续介绍了ESXi虚拟机逃逸实例。众所周知,ESXi是Vmware Vsphere产品的hypervisor组件。相比于前文提到的Qemu,ESXi是一个直接安装在裸机上,类似linux的系统,。通常情况下,ESXi里面默认运行着web、slpd等多个服务。

肖伟表示,Slpd服务是Open SLP(Service Location Protocol)协议的具体实现,默认在427端口监听,在虚拟机里可以访问到。而要分享的这个漏洞cve-2019-5544就在Slpd服务里面。该漏洞一旦被成功利用,即可实现任意地址写任意数据的情况发生。具体来看,通过发起多个tcp连接,并且保持连接不关闭可以实现堆喷。随后利用堆风水溢出一个SLPBuffer结构体,改写它的 start和curpos字段,下一次使用该结构体的时候可以实现任意地址写入任意数据,并最终泄露栈地址和控制rip。

网络安全进入新常态的大背景下,网络漏洞不仅是避不开的“新型军火”,更酝酿着“高危漏洞+网络武器”成为未来攻击的新标配的潜在趋势。ISC作为网络安全风向标级的行业盛会,创办至今一直高度聚焦漏洞研究,而漏洞管理与研究论坛的创立,就是立足技术高度为行业专家学者打造的交流空间。更多精彩,尽可关注ISC 2020 技术日漏洞管理与研究论坛(://isc.360.com/2020/detail.html?vid=193&id=17)。

2022-06-10

2022-06-10