Oracle out-of-band release for Java SE Vulnerability

二进制安全研究 rabit2013 阅读(2553) 0评论

Oracle out-of-band release for Java SE Vulnerability

0)漏洞简介

漏洞编号:CVE-2016-0636,此漏洞是安全研究员(Adam Gowdiak)于2013年报告给Oracle的漏洞(CVE-2013-5838)的变体。由于Oracle在部分代码分支中未对该漏洞进行修补,导致了此漏洞再现江湖,影响版本:java SE 7u97, 8u73, 8u74。

1)测试环境

2)漏洞分析

由于反射API的实现存在缺陷,当方法句柄(MethodHandles)处理目标类的成员函数时,因对函数参数的类型校验不严谨,可导致类型混淆。校验过程如下图所示:

 

其中clazz代表目标类,type代表clazz类的成员函数,具体验证代码如下图所示:

其中loadersAreRelated的实现代码如下:

该函数循环检查目标类的加载器或者父加载器是否与函数参数的加载器相等,如果相等直接返回true,表示验证通过。当目标类的加载器与其函数参数的加载器不一致,并且两个加载器存在父子关系时,就形成了类型混淆的漏洞。

3)漏洞利用

JAVA类加载规则:JVM在加载类时默认采用的是双亲委派机制,通俗的讲,就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成此类的加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才会自己去加载该类。如下图所示:

漏洞触发条件:定义void A.m(P p),A表示目标类、m表示函数、p表示参数;A由cl2加载;p由cl1加载,并且cl1 是cl2 的父加载器(其中p可以在cl1空间伪造,因为正常情况下p应该由cl2加载)

为了满足1、2条件,构造POC代码如下:

漏洞利用思路:伪造p来达到对象混淆的目的,通过合理的内存布局,读写目标对象的内存数据,将安全沙箱管理器设置为null,从而绕过安全沙箱限制,执行任意代码。

利用代码分析: 通过类型混淆,改写当前系统权限集为用户自定义的权限集,自定义的权限集会返回一个空集。当安全沙箱管理器被置为null时,会调用系统权限集合进行安全检查,但此时系统权限集已被篡改为用户自定义的权限集,所以返回空,安全权限检查通过,成功将安全管理器置为null,从而绕过安全沙箱的限制。

构造两个名称一样的类A作为p,一个在cl1空间,另一个在cl2空间,为类混淆做准备,代码如下:

用户自定义的MyAccessControlContext用于获取context,代码如下:

其中dummy为填充的数据,用于占位来控制内存布局。致使MyAccessControlContext.context恰好等于AccessControlContext.content。内存布局如下所示:

用户自定义的MyPermissions权限集合类,会返回一个空集合。代码如下:

将系统权限集合设置为自定义权限集合,代码实现如下:

逻辑实现步骤 1. 将cl1中的系统权限集设为用户自定义的权限集合; 2. 将cl2中的系统权限集设为用户自定义的权限集合; 3. 在cl2执行方法将安全管理器设置null。关键代码如下:

4)利用演示

利用该漏洞绕过了安全沙箱的限制,成功弹出计算器,如下图所示:

5)漏洞修补方案

保证目标类的加载器和函数参数类的加载器为同一加载器即可,修补代码如下:

首先获取参数类的名称,然后让目标类加载器尝试加载参数类。如果加载成功,并且判断两个类是否相等,如果相等,则验证通过,否则验证失败。这样就保证了目标类的加载器和函数参数类的加载器为同一加载器,成功修补漏洞。

6)exp下载地址

7)参考链接

  1. http://www.oracle.com/technetwork/topics/security/alert-cve-2016-0636-2949497.html
  2. http://www.security-explorations.com/materials/SE-2012-01-ORACLE-14.pdf

转载请注明:CloverSec Labs » Oracle out-of-band release for Java SE Vulnerability

喜欢 (9)or分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址