Java 0day Jre远程代码执行分析测试(2)

测试了一下,这里记录一下结果:

1、使用网上的poc,在java6u23,java6b13, java7u6下分别测试。(为什么要测试java6u13,原因是SunToolkit.getField方法在低版本java6中也是public 的,所以测试看看在低版本是否也能重现java7的漏洞)

2、测试寻找是否有其他可以替代SunToolkit.getField方法的其他方法。

结果:

1、原始poc在java6里不行,java7里可以直接成功利用,弹出calc。

2、两个版本的java6都没法突破,原版poc,直接报错:在applet下根本不允许访问awt.SunToolkit包。

3、java7如果直接import这个包,也是同样的报错,jvm不允许加载此包。

4、尝试了其他函数,没有测试成功可以替换SunToolkit.getField方法的方法。

根据结果反馈的原理:

首先这个问题出在的重点有两个,一个是classFinder,一个是java 7的sun.awt.SunToolkit上。

1、限制了只能在java7上成功。

2、限制了后续是否能disableSecurityManager,也就是去掉java代码执行的沙盒限制。虽然说这个SunToolkit不是不可替 代的(field.setAccessible(true);找到这个类似代码就行),但是我找了一下午没有找到替代品。

因为需要加载2,所以必须要有1去用反射加载,就是因为java7的1这里存在问题,原本不能加载的SunToolkit可以被加载了,所以才引发一系列 后续内容。至于getField是不是public有没有影响,这里没有测试出来,因为1已经直接限制了即时是public的java6,也没法调用 SunToolkit。

作者:GaRY

以上是今天的阶段性测试结果,不保证原理完全正确,但是根据今天的测试结果看来是这样的。这里感谢@kxlzx和@tcpper


作者:shine

@GaRY

上面有这样一个问题:至于getField是不是public有没有影响?

我刚找到一个这样的例子,问题是:java反射的安全性控制机制好象没有起作用?

无论field.setAccessible(true);与否,都能调用GG类型name属性值,因为name是public;如果是private就会报java.lang.IllegalAccessException(安全权限异常) 。

其实在java里这是个很简单的安全机制,例如:子类无法访问父类的私有属性或方法 (只能通过父类的,如:public方法访问)。

所以反射机制的setAccessible(true);方法在这里确实有很大问题!

@f4tb0y 配置好java环境,保存上面的为.java文件,并编译为.class文件;创建一个.html

.html内容

把两个文件放在同一路径,运行一下.html文件就好了!


shine (shield) | 2012-08-28 18:53

@shine “都能调用GG类型name属性值”这句话要改一下—》“都能调用GG类的name属性值”


摘自:http://zone.wooyun.org/content/886

http://lcx.cc/?i=2831

参考文:《 Java 0day(CVE-2012-4681)分析及EXP下载

网络安全攻防研究室(www.91ri.org)信息安全小组收集整理。