type
status
date
slug
summary
tags
category
icon
password
 
 

一、漏洞APP分析

1. AndroidManifest.xml

AndroidManifest.xml 声明了四个组件,两个Activitycom.bytectf.babydroid.MainActivity com.bytectf.babydroid.Vulnerable 一个Receivercom.bytectf.babydroid.FlagReceiver 还有一个provider androidx.core.content.FileProvider 其中MainActivity导出,Vulnerable 可以通过action com.bytectf.TEST触发
notion image

2. Vulnerable

Vulnerable Activity 通过getParcelableExtra 获取intent并且进行跳转
 

3. FlagReceiver

 

4.FileProvider

android:name
Android 提供的 FileProvider 的实现类
android:exported
建议指定为 false,表示该 FileProvider 只能本应用使用,不是 public
android:authorities
相当于一个用于认证的暗号,在分享文件生成 Uri 时,会通过它的值生成对应的 Uri,该值是一个域名,一般格式为 packagename.fileprovider
android:grantUriPermissions
值为true,表示允许赋予临时权限,即设置为共享
meta-data
指定配置共享目录的配置文件
 
Intent 可以提供对内容提供程序的间接访问。即使应用没有访问权限,您也可通过以下方式允许用户访问提供程序中的数据:从拥有权限的应用中返回结果 Intent,或者激活拥有权限的应用并允许用户使用该应用。
即使没有适当的访问权限,您也可通过以下方式访问内容提供程序中的数据:将 Intent 发送至拥有权限的应用,然后接收包含URI权限的结果 Intent。这些是特定内容 URI 的权限,将持续至接收该权限的 Activity 结束拥有永久权限的应用会在结果 Intent 中设置标记,从而授予临时权限
  • 读取权限: FLAG_GRANT_READ_URI_PERMISSION
  • 写入权限: FLAG_GRANT_WRITE_URI_PERMISSION
💡
注意:如果内容 URI 中包含提供程序的授权,这些标记不提供对提供程序的常规读取或写入访问权限。访问权限仅适用于 URI 本身。
提供程序通过使用 <provider> 元素的 android:grantUriPermission 属性和 <provider> 元素的 <grant-uri-permission> 子元素,在其清单文件中定义内容 URI 的 URI 权限
 

5. file_paths.xml

子节点
含义
root-path
代表设备的根目录 /
files-path
代表 APP 内部存储空间私有目录下的 files/ 目录,等同于 Context.getFilesDir() 所获取的目录路径
cache-path
代表内部存储的 cache 目录,与 Context.getCacheDir() 获取的路径对应
external-path
代表外部存储 (sdcard) 的根目录,与 Environment.getExternalStorageDirectory() 获取的路径对应。
external-files-path
代表外部存储空间 APP 私有目录下的 files/ 目录,与 Context.getExternalFilesDir(null)获取的路径对应
external-cache-path
外部存储空间 APP 私有目录下的 cache/ 目录,等同于 Context.getExternalCacheDir()
external-media-path
代表 app 外部存储媒体区域的根目录,与Context.getExternalMediaDirs()获取的路径对应

二、攻击APP构造

1. 攻击方案

由于Provider中设置了android:grantUriPermissions="true" 那么就可以通过被攻击APP授予攻击者暂时的权限来读取文件,而file_paths.xml中又指明共享根目录,则可以读取被攻击APP的私密文件flag
我们构造的Uri:content://androidx.core.content.FileProvider/root/data/data/com.bytectf.babydroid/files/flag实际就对应了file:///data/data/com.bytectf.babydroid/files/flag
因为file provider必须设置为非导出,也就意味着外部无法访问。当需要进行文件共享的时候,需要在Intent中加入下面这些中Grant相关的flags ,在这里使用前两个就可以
  • FLAG_GRANT_READ_URI_PERMISSION:允许接收者读取 URI 的内容,即读取 URI 的数据,并在权限授予期间保持该权限。
  • FLAG_GRANT_WRITE_URI_PERMISSION:允许接收者写入 URI 的内容,即修改 URI 的数据,并在权限授予期间保持该权限。
  • FLAG_GRANT_PERSISTABLE_URI_PERMISSION:与 FLAG_GRANT_READ_URI_PERMISSION FLAG_GRANT_WRITE_URI_PERMISSION 一起使用,表示允许接收者在授予许可后持久保存该权限。这意味着即使应用程序被关闭,权限也会保持有效,并且对 URI 的访问仍然是允许的。
  • FLAG_GRANT_PREFIX_URI_PERMISSION:允许接收者读取或写入指定 URI 的所有后代 URI,而不必单独为每个 URI 授予权限。
MainActivity源码
HttpGetAsyncTask 源码
Android11 攻击效果
notion image
 
 

三、总结

notion image
notion image
 

四、参考

  1. ‍‬⁢‍‬‌⁢‌‬⁤⁣‬⁣⁢⁢⁣⁡⁣⁣⁡‌‬⁡⁣‍‍⁡⁣⁣‍⁣⁤‍​‍‌ByteCTF2021 writeup for Android challenges - 飞书云文档 (feishu.cn)
  1. [原创]Android APP漏洞之战(4)——Content Provider漏洞详解-Android安全-看雪-安全社区|安全招聘|kanxue.com
  1. Android 组件逻辑漏洞漫谈-腾讯云开发者社区-腾讯云 (tencent.com)
  1. (72条消息) Android FileProvider特性与Intent重定向漏洞_android bad fileprovider_Tr0e的博客-CSDN博客
  1. 内容提供程序基础知识  |  Android 开发者  |  Android Developers (google.cn)
 
ByteCTF2021 EasyDroid复现IDA动调SO流程及问题
  • Twikoo