Android BroadcastAnyWhere(Google Bug 17356824)漏洞详细分析

Android BroadcastAnyWhere(Google Bug 17356824)漏洞详细分析

作者:简行(又名 低端码农)

继上次Android的LaunchAnyWhere组件安全漏洞后,最近Google在Android 5.0的源码上又修复了一个高危漏洞,该漏洞简直是LaunchAnyWhere的姊妹版——BroadcastAnyWhere。通过这个漏洞,攻击者可以以system用户的身份发送广播,这意味着攻击者可以无视一切的BroadcastReceiver组件访问限制。而且该漏洞影响范围极广,Android 2.0+至4.4.x都受影响。

漏洞分析

修复前后代码对比

BroadcastAnyWhere跟LaunchAnyWhere的利用原理非常类似,两者都利用了Setting的uid是system进程高权限操作。

漏洞同样发生在Setting的添加帐户的流程上,该流程详细见《Android LaunchAnyWhere (Google Bug 7699048)漏洞详解及防御措施》一文。而BroadcastAnyWhere漏洞则发生在这个流程之前。在分析漏洞之前, 我们先来看看漏洞修复的前后对比,具体代码在AddAccountSetting的addAccount方法。

修复前代码中下:

 ...
 private static final String KEY_CALLER_IDENTITY = "pendingIntent";
 ...

 private void addAccount(String accountType) {
        Bundle addAccountOptions = new Bundle();
        mPendingIntent = PendingIntent.getBroadcast(this, 0, new Intent(), 0);
        addAccountOptions.putParcelable(KEY_CALLER_IDENTITY, mPendingIntent);
        addAccountOptions.putBoolean(EXTRA_HAS_MULTIPLE_USERS, Utils.hasMultipleUsers(this));
        AccountManager.get(this).addAccount(
                accountType,
                null, /* authTokenType */
                null, /* requiredFeatures */
                addAccountOptions,
                null,
                mCallback,
                null /* handler */);
        mAddAccountCalled  = true;
    }

修复后代码如下

...
private static final String KEY_CALLER_IDENTITY = "pendingIntent";
private static final String SHOULD_NOT_RESOLVE = "SHOULDN'T RESOLVE!";
...

private void addAccount(String accountType) {

    Bundle addAccountOptions = new Bundle();

    /*
     * The identityIntent is for the purposes of establishing the identity
     * of the caller and isn't intended for launching activities, services
     * or broadcasts.
     *
     * Unfortunately for legacy reasons we still need to support this. But
     * we can cripple the intent so that 3rd party authenticators can't
     * fill in addressing information and launch arbitrary actions.
     */
    Intent identityIntent = new Intent();
    identityIntent.setComponent(new ComponentName(SHOULD_NOT_RESOLVE, SHOULD_NOT_RESOLVE));
    identityIntent.setAction(SHOULD_NOT_RESOLVE);
    identityIntent.addCategory(SHOULD_NOT_RESOLVE);

    mPendingIntent = PendingIntent.getBroadcast(this, 0, identityIntent, 0);
    addAccountOptions.putParcelable(KEY_CALLER_IDENTITY, mPendingIntent);
    addAccountOptions.putBoolean(EXTRA_HAS_MULTIPLE_USERS, Utils.hasMultipleUsers(this));
    AccountManager.get(this).addAccountAsUser(
            acc
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
针对Android的冻屏bug处理,您可以尝试以下几个方法来解决问题: 1. 检查设备设置:首先,确保您的设备没有启用任何特定的冻屏设置。有些设备有自动冻屏或定时冻屏功能,可能会导致应用程序在一段时间后自动冻结。检查设置菜单中的“显示”或“锁屏”选项,调整对应的设置。 2. 检查应用程序代码:检查您的应用程序代码,尤其是与屏幕状态相关的部分。确保您正确地处理了屏幕冻结和解冻事件。您可以使用Android的生命周期方法(如onPause()和onResume())来处理这些事件,以确保应用程序在冻屏和解冻时正确地执行所需的操作。 3. 使用WakeLock:如果您的应用程序需要在屏幕关闭时继续运行(例如后台音乐播放器),您可以使用WakeLock来保持设备唤醒状态。这样可以防止设备进入休眠模式并导致应用程序被冻结。但是,请注意使用WakeLock可能会对设备电池寿命产生一定影响,因此请明智地使用。 4. 更新设备驱动程序和固件:有时,冻屏问题可能是由设备驱动程序或固件问题引起的。确保您的设备上运行的Android版本和相关驱动程序是最新的。可以通过检查设备制造商的官方网站或系统更新功能来获取最新的更新。 5. 联系开发者社区:如果以上方法都无法解决问题,可以尝试在开发者社区寻求帮助。在Android开发者论坛、Stack Overflow或GitHub等平台上,可能有其他开发者遇到类似的问题并提供了解决方案或建议。 请注意,以上方法仅为一般建议,具体解决方案可能因设备、应用程序和操作系统版本而异。根据实际情况进行调试和排除故障是解决冻屏bug的关键。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值