漏洞预警 | Android系统序列化、反序列化不匹配漏洞

前言

近期我们在Android序列化对象中发现了多个安全漏洞,序列化是android系统中很常用也很重要的一个过程,此类漏洞正是利用序列化过程前后数据不匹配导致的越权操作,可以让攻击者重置手机pin码、安装或卸载用户应用,部分漏洞已经在2018年四月份的Android安全公告中披露并分配CVE:CVE-2017-13286, CVE-2017-13288, CVE-2017-13289。

利用漏洞可以使用外观完全相同的恶意应用替换金融APP、聊天APP等重要应用,受害者将面临账号被盗、财产损失的危险。这些漏洞可以实现在低权限应用中越权操作其他应用,并且操作过程中不需要界面交互,因此只要找准发动时机,完全可以在受害者毫不知情的情况下完成攻击。

本文首先对漏洞成因做一个简单的介绍,然后详细说明此类漏洞会造成的影响,如何缓解修复此类漏洞,最后列出用户应该怎么避免此类漏洞的攻击。

 

漏洞细节

Parcelable是Android中实现序列化的一个接口。需要实现序列化的类只需要实现Parcelable接口和它的几个方法即可。其中writeToParcel、createFromParcel两个方法最为关键。这两个方法提供了序列化和反序列化的能力。writeToParcel中写入需要保存的数据,createFromParcel中按相同的顺序和类型读出。不对称的写入、读出会导致严重的安全问题。以CVE-2017-13286为例:

WriteToParcel中写入了一个32位的mIsShared,但是在createFromParcel中少读了一个32位的数据。导致在读写内存时错位,在处理错位的内存数据时会造成类型混淆。当攻击者精心构造一组序列化的数据之后,这组恶意序列化数据可以稳定绕过Android系统几年前的一个漏洞补丁Android-bug-7699048。

 

漏洞利用

Android-bug-7699048是存在于Android 2.3至4.3中的调用任意私有Activity漏洞。但是这次发现的漏洞却可以影响Android6.0甚至8.0以上版本,通过漏洞绕过补丁后,攻击者可以实施重置pin码、安装、卸载应用等操作。

  1. 替换应用

这批漏洞导致的最直接后果就是在不需要用户交互的情况下,攻击者可以利用漏洞任意卸载安装用户应用。

Android-bug-7699048又叫LaunchAnyWhere,顾名思义就是可以任意调用私有Activity,而这批漏洞恰好可以绕过Android-bug-7699048补丁,此外还可以影响更高版本Android系统。相较于Android-bug-7699048,这批漏洞影响范围更广。

在此条件基础上,攻击者就可以很轻松的绕过安装和卸载过程中需要用户交互的界面,直接进行安装或是卸载。若是针对普通应用,这些应用将变成钓鱼程序,若是针对金融APP或是常用聊天软件,将直接造成账号财产损失。

以下演示启动攻击程序后,静默替换用户聊天软件:

通过精心的构造或是重打包,伪造出的应用迷惑性非常强,用户仅从外观上很难分辨真假。

  1. 重置pin码

设置pin码后,手机需要输入pin码解锁。利用此漏洞绕过pin码验证,可以做到直接重置手机pin码。如下图,启动攻击程序后将弹出pin码重置界面:

图 弹出重置pin码窗口

漏洞危害

攻击者可以利用这类漏洞强制卸载用户手机中的安全软件,以此绕过安全软件对手机系统的保护,从而增大用户手机的安全隐患。攻击者在卸载安全软件之后,可以进一步攻击系统来获取更高的权限、更持久稳定的控制。因为没有了安全软件的保护,用户的手机系统完全暴露在了攻击者的“屠刀”下。攻击者同样可以利用这类漏洞来替换正常应用,用钓鱼的方式获取用户的敏感信息。

 

受影响版本

CVE-2017-13286:8.0, 8.1

CVE-2017-13288:8.0, 8.1

CVE-2017-13289:6.0, 6.0.1, 7.0, 7.1.1, 7.1.2, 8.0, 8.1

 

修复方案

对于这类漏洞的修复非常简单,只需要保持写入读出的顺序和类型一致即可。

对于用户来说,想要避免此类攻击,应该尽快更新系统版本。

(完)