安卓序列化漏洞 —— CVE-2015-3525

在2014年,Jann Horn发现一个安卓的提权漏洞,该漏洞允许恶意应用从普通应用权限提权到system用户执行命令,漏洞信息与POC见(1]。漏洞的成因源于在安卓系统(<5.0)中,java.io.ObjectInputStream并未校验输入的java对象是否是实际可序列化的。攻击者因此可以构建一个不可序列化的java对象实例,恶意构建其成员变量,当该对象实例被ObjectInputStream反序列化时,将发生类型混淆,对象的Field被视为由本地代码处理的指针,使攻击者获得控制权。这就是CVE-2014-7911。在了解它的详细信息之前我们先了解以下基础知识:

Android IPC机制

Android应用之间使用沙盒进行隔离用以保障安全性。不过,它们之间可以通过Intent消息机制进行交互。交互时复杂数据类型的传递必须由发送方进行序列化,然后由接收方反序列化。为了方便开发者,Java为序列化提供了内置支持。

Java序列化

序列化Serializable的作用是将数据对象存入字节流当中,在需要时重新生成对象。Android中Intent中传递对象进行序列化有两种方法,一种是Bundle.putSerializable(Key,Object),另一种是Bundle.putParcelable(Key, Object)。前者是实现了Serializable接口,而后者是实现了Parcelable接口。Serializable使用IO读写存储在硬盘上,而Parcelable是直接在内存中读写,很明显内存的读写速度通常大于IO读写,所以在Android中通常优先选择Parcelable。但是Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable在外界有变化的情况下不能很好的保证数据的持续性。所以在这种情况下会使用Serializable。

implements Serializable接口的的作用就是给对象打了一个标记,系统会自动将其序列化。

例如,序列化(和其它)的对象可以通过以下形式添加到Intent的extras中:

1 SerializableTypeobj = …
2
3 Bundle b = intent.getExtras();
4
5 b.putString(“foo”, “some string”);
6
7 b.putSerializable(“bar”, obj);

接收数据的代码如下:

1 Bundle b = intent.getExtras();
2
3 String foo = (String)b.getString(“foo”);
4
5 SerializableTypeobj = (SerializableType)b.getSerializable(“bar”);

java垃圾回收机制(GC)

我们主要介绍一下java垃圾回收机制中的finalize()方法。

finalize()方法是所有实体对象都具有的方法,因为这个是Object类定义的,常被误认为是垃圾回收的方法或者叫做析构函数,其实并非如此。finalize在JVM内存回收前会被调用(但并非绝对),而即使不调用它,JVM回收机制通过后面所述的一些算法就可以定位哪些是垃圾内存,那么这个拿来干什么用呢?

finalize()其实是要做一些特殊的内存回收操作,如果对JAVA研究稍微多一点,大家会发现JAVA中有一种JNI的机制,即:Java native interface,这种属于JAVA本地接口调用,即调用本地的其它语言信息,JAVA虚拟机底层调用也是这样实现的,这部分调用中可能存在一些对C、C++语言的操作,在C和C++内部通过new、malloc、realloc等关键词创建的对象垃圾回收机制是无能为力的,因为这不是它要管理的范围,而平时这些对象可能被JAVA对应的实体所调用,那么需要在对应JAVA对象放弃时(并不代表回收,只是程序中不使用它了)去调用对应的C、C++提供的本地接口去释放这段内存信息,它们的释放同样需要通过free或delete去释放,所以我们一般情况下不要滥用finalize(),可能你会联想到另一类某些特殊引用对象的释放,如层数引用太多,JAVA虚拟机有些时候不知道这一线的对象是否都可能被回收,那么,你可以自己将finalize()重写,并将内置对象的句柄先释放掉,这样也是没有问题的,不过一般不要滥用。

了解了这些知识后,我们说下CVE-2014-7911的细节,大概是这样的:system_server是一个拥有system权限的关键系统进程,任意应用可向其发送可序列化对象,虽然system_server并不会主动调用该对象的方法,但是在系统GC该对象时会调用到其finalize方法。Jann Horn发现android.os.BinderProxy这个类在finalize方法里调用了一个native指针,而这个指针可被攻击者控制指向任意地址,因此在GC时有机会造成代码执行。

但android.os.BinderProxy是一个不能被序列化的类,因此理论上我们并不能通过发送它的实例来控制将要攻击的目标进程代码执行,但由于java.io.InputStream没有检查接收到的对象是否可序列化,因此我们可以通过特殊方法构造一个被序列化了的伪android.os.BinderProxy来达到目的。值得注意的是,尽管Android采用了ASLR机制,但为了获得正确的地址,可以基于这样一个事实:system_server和攻击者app都是从同一个进程-Zygote fork而来,具有相同的基址,攻击者通过分析自己进程的map文件(位于/proc/maps)就可以知道system_server以及所加载模块的内存布局。Google发布的补丁为java.io.InputStream添加了序列化检查来阻止攻击者发送android.os.BinderProxy,但通过这个漏洞我们可以发现一个可序列化的类只要满足以下条件就能代替android.os.BinderProxy实现代码执行的目的:

(1)实现了finalize方法;

(2)在finalize方法里调用了一个native指针;

(3)该native指针是攻击者可控的(没有被声明为transient和static);

(4)implements了Serializible接口(可序列化);

(5)没有重载readObject和readResolve方法来阻止我们控制native指针。

IBM Security在安卓原生框架中找到了一个这样的类OpenSSLX509Certificate(CVE-2015-3525),在Google Play Services APK中就使用了OpenSSLX509Certificate类。另外还发现了6 个存在漏洞的第三方SDK:

  • Jumio (CVE-2015-2000)
  • MetaIO (CVE-2015-2001)
  • PJSIP PJSUA2 (CVE-2015-2003)
  • GraceNote GNSDK (CVE-2015-2004)
  • MyScript (CVE-2015-2020)
  • esriArcGis (CVE-2015-2002)

那么这些SDK是否存在某些相似之处呢?经过分析发现前5个都使用了SWIG,这是一种连接C/C++与Java等各种高级语言的互操作性工具。在某些开发者提供的配置中,SWIG可以产生以下漏洞代码:

因为Bar能够被序列化,所以Foo可以被序列化,因此,攻击者可以控制swigCPtr(和swigCMemOwn),而swigCPtr被用于native代码中。因而这是一个高度符合条件可被利用的场景,特别是当原始的C++类有虚拟析构函数的时候。

通过分析这个漏洞我们可以知道,CVE-2014-7911的补丁只是紧缩了攻击界面,而没有真正解决问题。Google随后发布了CVE-2015-3525的补丁,将存在于OpenSSLX509Certificate类中的native指针声明为transient,使该指针不可被序列化。然而,即使安卓的原生世界修复了所有危险的可序列化类,如果第三方SDK中存在这样的类依然可被用于序列化攻击。IBM Security建议将Bundle的解析内部资源修改为懒行为,并修改readObject、readResolve等读取方法来阻止攻击者控制危险变量。

参考文章:

https://github.com/retme7/CVE-2014-7911_poc

http://researchcenter.paloaltonetworks.com/2015/01/cve-2014-7911-deep-dive-analysis-android-system-service-vulnerability-exploitation/

http://www.freebuf.com/news/74676.html

时间: 2024-11-08 22:31:59

安卓序列化漏洞 —— CVE-2015-3525的相关文章

阿里安全称发现安卓WiFi漏洞:黑客可远程攻击

近日,阿里安全研究实验室发现了安卓系统的一个重大漏洞,主要影响安卓WiFi功能组件wpa_supplicant.通过该漏洞,黑客可对开启了WiFi的安卓手机发动远程攻击,甚至可窃取手机内的照片.通讯录等重要信息,因此该漏洞被称为 “WiFi杀手”.据悉,谷歌在接到阿里安全提交的漏洞细节后,及时告知了安卓系统wpa_supplicant组件的开发厂商.今日凌晨,该组件开发者公告称漏洞已修复.阿里安全研究实验室建议受影响的安卓用户尽快安装更新补丁. 阿里安全发现安卓WiFi漏洞 黑客可远程攻击 安卓

安卓APP漏洞有哪些?在线免费App漏洞检测!

       针对智能手机的恶意软件早在几年前就已经出现了,不过直到2012年,手机安全问题才忽然成为了大众谈论的焦点.作为专业的移动互联网APP安全服务提供商爱加密来说,很早就开始着手于APP安全领域,为开发者们提供安全检测.应用保护.渠道检测等专业服务,全方位的保护APP安全,防止盗版.山寨.二次打包.注入恶意代码等现象的出现. 据了解,打包党通过APP应用存在的漏洞进行破解打包,形成山寨产品,流入市场给用户和开发者造成利益损害.我们所了解的Android应用程序存在的漏洞主要有:源代码存在

Typecho-反序列化漏洞学习

目录 Typecho-反序列化漏洞学习 0x00 前言 0x01 分析过程 0x02 调试 0x03 总结 0xFF 参考 Typecho-反序列化漏洞学习 0x00 前言 补丁: https://github.com/typecho/typecho/commit/e277141c974cd740702c5ce73f7e9f382c18d84e#diff-3b7de2cf163f18aa521c050bb543084f 这里我下了1.0版本: git clone https://github.c

zergRush (CVE-2011-3874) 安卓内核漏洞成因分析

部分内容参考自http://www.cnblogs.com/daishuo/p/4002963.html zergRush是我接触的第一个CVE漏洞,该漏洞影响安卓2.2-2.3.6版本系统.CVE-2011-3874描述得很明白,这个漏洞的本质是"use after free". 漏洞存在于/system/bin/vold这个root身份的系统程序.具体地,vold调用了libsysutils.so,真正有问题的是这个 so.对应源码在/system/core/libsysutils

安卓拒绝服务漏洞分析及漏洞检测

"超级拒绝服务漏洞"是一个安卓通用型拒绝服务漏洞,恶意攻击者可能利用此漏洞让手机中的任意应用崩溃无法正常工作,几乎影响目前市面上所有的安卓APP应用. 漏洞分析: 0xr0ot和Xbalien交流所有可能导致应用拒绝服务的异常类型时,发现了一处通用的本地拒绝服务漏洞.该通用型本地拒绝服务可以造成大面积的app拒绝服务. 针对序列化对象而出现的拒绝服务主要是由于应用中使用了getSerializableExtra() 的API,由于应用开发者没有对传入的数据做异常判断,恶意应用可以通过传

JAVA Apache-CommonsCollections 序列化漏洞分析以及漏洞高级利用

作者: 随风 漏洞原理分析 该漏洞的出现的根源在CommonsCollections组件中对于集合的操作存在可以进行反射调用的方法,并且该方法在相关对象反序列化时并未进行任何校验,新版本的修复方案对相关反射调用进行了限制. 问题函数主要出现在org.apache.commons.collections.Transformer接口上,我们可以看到该接口值定义了一个方法 我们可以看到该方法的作用是给定一个Object对象经过转换后同时也返回一个Object,我们来看看该接口有哪些实现类 这些tran

Linux 幽灵漏洞CVE 2015-0235 (glibc修补方案)

漏洞的危害: [CVE 2015-0235: GNU glibc gethostbyname 缓冲区溢出漏洞 ]全面爆发,该漏洞的产生是Qualys公司在进行内部代码审核时,发现了一个在GNU C库(glibc)中存在的__nss_hostname_digits_dots函数导致的缓冲区溢出漏洞.这个bug可以通过gethostbyname *()函数来触发,本地和远程均可行.该漏洞(幽灵漏洞)造成了远程代码执行,攻击者可以利用此漏洞获取系统的完全控制权. 检查系统是否存储幽灵漏洞: 将下面的代

独家分析:安卓“Janus”漏洞的产生原理及利用过程

近日,Google在12月发布的安卓系统安全公告中披露了一个名为"Janus"安卓漏洞(漏洞编号:CVE-2017-13156).该漏洞可以让攻击者绕过安卓系统的signature scheme V1签名机制,进而直接对App进行篡改.而且由于安卓系统的其他安全机制也是建立在签名和校验基础之上,该漏洞相当于绕过了安卓系统的整个安全机制. 一旦攻击者将植入恶意代码的仿冒的App投放到安卓商店等第三方应用市场,就可替代原有的App做下载.更新.网友安装这些仿冒App后,不仅会泄露个人账号.

CVE-2014-1767 漏洞分析(2015.1)

CVE-2014-1767 漏洞分析 1. 简介 该漏洞是由于Windows的afd.sys驱动在对系统内存的管理操作中,存在着悬垂指针的问题.在特定情况下攻击者可以通过该悬垂指针造成内存的double free漏洞. 实现对漏洞的有效利用,攻击者利用成功可导致权限提升.afd.sys是内核用来管理socket的模块. 影响的系统包括(32bit & 64 bit):  Windows Server 2003 Windows Vista Windows Server 2008 Windows 7