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 许可协议,转载请注明出处。
相关文章






