type
status
date
slug
summary
tags
category
icon
password
0x01 引言
LaunchAnyWhere
顾名思义就是能够掉起任意未导出的Activity,突破进程间组件访问隔离的限制。这个漏洞影响2.3 ~ 4.3
的安卓系统。以下攻击环境为Android4.2 (API 17)
。0x02 漏洞原理
从Android2.0开始,系统引入了
Account
管理机制。添加android.accounts.AccountManager
账户管理器类,这个类提供了对用户在线账户的集中注册和管理。普通应用(AppA)去请求添加某账户时,会调用AccountManager.addAccount
,该方法用于创建账户,然后AccountManager
会去查找提供账号的应用(AppB)的Authenticator
类,调用对应APP的Authenticator. addAccount
方法,AppB将返回一个Bundle
;AppA再根据AppB返回的Bundle
提取Intent
去调起AppB的账户登录界面。其中进行中间通信的AccountManagerService
同样也是系统服务之一,暴露给开发者的的接口是AccountManager
。AccountManagerService
在此过程中的作用是帮助AppA查找到AppB账号登陆页面,并唤起这个登陆页面。但是AppB可以指定任意Intent
,AppA将在不知情的情况下调用一个组件,如果AppA是一个system
权限的应用,例如Settings
,那么AppA可以唤起任意AppB指定的未导出的Activity
mRespone
是一个Binder
对象,当AuthenticationService
指定Intent
后,就是把intent
保存到这个respone
对象里对于
Response
类,其中的onResult(Bundle bundle)
方法用于处理账户管理操作的结果。它首先从bundle
中获取一个Intent
对象,该对象用于执行特定的操作。如果intent
不为空,并且mActivity
(一个活动对象)也不为空,那么它将通过mActivity.startActivity(intent)
方法启动该intent
。在
Android
中,System
用户拥有相当高的权限,在启动组件时将无视组件的导出属性而直接进行对应操作。所以假设AppA是系统应用
Settings
,AppB是攻击程序,只要能够让Settings
触发addAcount
操作即可让AppB启动任意的组件,因此通过调用com.android.settings.accounts.AddAccountSettings
并且附加特定的参数即可触发LaunchAnyWhere
漏洞。0x03 漏洞利用
上文提到假设AppA是系统应用Settings
,AppB是攻击程序,只要能够让Settings
触发addAcount
操作即可让AppB启动任意的组件,因此通过调用com.android.settings.accounts.AddAccountSettings
并且附加特定的参数即可触发LaunchAnyWhere
漏洞。
但是在这之前,需要完成一些其他工作,因为攻击APP
Demotest
在被安装进入系统后,需要能够添加账户,也就是说攻击APP需要扮演一个能够提供账户授权的APP,也即上文提到的AppB,而Settings
扮演AppA的角色。因此需要添加一个AuthenticationService
基于Service
然后需要在
res/xml
目录下创建authenticator.xml
,设置账户类型android:accountType="com.demo.launchanywhere"
除此之外还要在
AndroidManifest.xml
中注册Service
然后在
MainActivity
中使用Intent
触发添加账户的操作安装完成后就可以在
Settings
中的添加账户中看到攻击APP账户选项直接启动APP,就会使得未导出的Activity被启动
0x04 漏洞修复
Android4.4 对该漏洞进行修复:Diff - 5bab9da^! - platform/frameworks/base - Git at Google
即在AppB返回
Bundle
给AppA时检查其中的Intent
指向组件的签名是否与AppB签名一致但是实际上还可以配合
Android
反序列化漏洞继续利用LaunchAnyWhere
,例如通过Parcelable
反序列化漏洞的字节错位,通过精确的布局,使得system_server
在检查Intent
时找不到这个Intent
,而在错位后Settings
却刚好可以找到,这样就可以实现补丁的绕过并再次实现LaunchAnyWhere
,研究人员将发现的这种漏洞利用方式命名为Bundle mismatch
0x05 参考
- 作者:LLeaves
- 链接:https://lleavesg.top//article/LaunchAnyWhere
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章