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将返回一个BundleAppA再根据AppB返回的Bundle提取Intent去调起AppB的账户登录界面。其中进行中间通信的AccountManagerService同样也是系统服务之一,暴露给开发者的的接口是AccountManager
notion image
AccountManagerService 在此过程中的作用是帮助AppA查找到AppB账号登陆页面,并唤起这个登陆页面。但是AppB可以指定任意Intent ,AppA将在不知情的情况下调用一个组件,如果AppA是一个system权限的应用,例如Settings,那么AppA可以唤起任意AppB指定的未导出的Activity
notion image
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账户选项
notion image
 
直接启动APP,就会使得未导出的Activity被启动

0x04 漏洞修复

即在AppB返回BundleAppA时检查其中的Intent 指向组件的签名是否与AppB签名一致
但是实际上还可以配合Android反序列化漏洞继续利用LaunchAnyWhere ,例如通过Parcelable反序列化漏洞的字节错位,通过精确的布局,使得system_server在检查Intent时找不到这个Intent,而在错位后Settings却刚好可以找到,这样就可以实现补丁的绕过并再次实现LaunchAnyWhere,研究人员将发现的这种漏洞利用方式命名为Bundle mismatch

0x05 参考

  1. Android LaunchAnyWhere (Google Bug 7699048)漏洞详解及防御措施
  1. launchAnyWhere: Activity组件权限绕过漏洞解析
  1. AccountManager  |  Android Developers
 
Android反序列化漏洞-Bundle风水CVE-2022-20338
  • Twikoo