type
status
date
slug
summary
tags
category
icon
password
 
 

漏洞说明

LaunchAnyWhere 顾名思义就是能够掉起任意未导出的Activity,突破进程间组件访问隔离的限制。这个漏洞影响2.3 ~ 4.3的安卓系统。
即在AppB返回BundleAppA时检查其中的Intent 指向组件的签名是否与AppB签名一致。这也就导致不能再从AppA通过Intent跳转到其他的组件,尤其是即使AppA为systemApp,也无法实现无视组件是否导出而进行跳转,现在只能跳转到AppB中的组件。
Android8.0.0中引入checkKeyIntent 用于检查Intent
Android8.0.0-r35中在checkKeyIntent 开头加入Flag的设置intent.setFlags(intent.getFlags() & ~(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION));
即如果传输的数据中含有Intent数据,将有关ContentProvider授权的标志位全部置为不允许,在一定程度上避免了将部分敏感的provider的操作权限授权给其他APP。
但是实际上在execStartActivity 中包含了intent.migrateExtraStreamToClipData(); 这样一个处理
在Android中,migrateExtraStreamToClipData是一个内部方法,用于处理Intent中的EXTRA_STREAM数据。这个方法会将EXTRA_STREAM中的数据迁移到ClipData中,以便可以通过剪贴板框架进行分享。
这个方法主要在处理ACTION_SENDACTION_SEND_MULTIPLE这两种Intent时使用,这两种Intent通常用于分享数据。当这些Intent包含EXTRA_STREAM数据时,migrateExtraStreamToClipData方法会被调用,以将数据迁移到ClipData中。在处理这两种Intent时会通过addFlags 添加provider授权的flags并且可以发现如果是isImageCaptureIntent,将会同时添加provider读写授权,这就相当于前面将两个flags置为不允许的做法失效了,从而能够使得不需要构造Bundle风水也能成功将provider外带并授权读写。

漏洞利用

漏洞影响:Android 9 10
先给出官方poc中关于该漏洞的利用,可以看到时通过将Action设置为Intent.ACTION_SEND_MULTIPLE 可以外带provider并且授权读权限。
再参考路师傅博客,直接MediaStore.ACTION_IMAGE_CAPTURE 设置为Action,同时获得读写权限的授权。
 

漏洞修复

如果getClipData为null则手动设置一个ClipData,这将会导致migrateExtraStreamToClipDatagetClipData() != null的条件不满足,从而无法走到后续的漏洞点。
💡
没想到除了Bundle风水还有这样一种优雅的利用方法,叹为观止
 

参考

  1. https://android.googlesource.com/platform/frameworks/base/+/6ebf410b818c6a525130d5fcb72381217fec8e7a^!/#F0
  1. https://wrlus.com/android-security/cve-2020-0338/
  1. https://cs.android.com/android/platform/superproject/main/+/main:cts/hostsidetests/securitybulletin/test-apps/CVE-2020-0338/src/android/security/cts/CVE_2020_0338/PocAuthenticator.java;bpv=0;bpt=0?hl=zh-cn
 
2023AVSS-SELinux题目Android抓包
  • Twikoo