开始
近日,Google修复一个组件安全的漏洞LaunchAnyWhere(Google Bug 7699048)。这个漏洞属于Intend Based提取漏洞,攻击者利用这个漏洞,可以突破了应用间的权限隔离,达到调用任意私有Activity(exported为false)的目的。
该漏洞影响Android 2.3至4.3固件。
漏洞分析
在分析这个漏洞之前,需要先介绍两个东西。
Account管理机制
从Android2.0开始,系统引入了Account管理机制,详细使用说明见Android官方文档。Account管理机制提供了集中化管理帐户API以及安全存储用户口令和令牌的功能。系统中,可以同时存在多个帐户(设置——添加帐户可以查看),比如Google、Miscrosoft Exchange、微信、支付宝、陌陌等等
Account机制涉及AuthenticationService和Client两个组成元素,它们之间的的通讯统一由AccountManagerService调度,AccountManagerService是Android上的一个系统服务。当Client首次使用时,会向AuthenticationService发起addAccount请求,示意图如下:
最后AuthenticationService会把指定的Intent返回给Client,Client则通过startActivityForResult对最终结果进行处理。这部分源码比较有趣,我们先看看AccountManager.addAccount的代码:
public AccountManagerFuture<Bundle> addAccount(final String accountType,
final String authTokenType, final String[] requiredFeatures,
final Bundle addAccountOptions,
final Activity activity, AccountManagerCallback<Bundle> callback, Handler handler) {
if (accountType == null) throw new IllegalArgumentException("accountType is null");
final Bundle optionsIn = new Bundle();
if (addAccountOptions != null) {
optionsIn.putAll(addAccountOptions);
}
optionsIn.putString(KEY_ANDROID_PACKAGE_NAME, mContext.getPackageName());
return new AmsTask(activity, handler, callback) {
public void doWork() throws RemoteException {
mService.addAccount(