1. 问题说明

Android 中 Content Provider 可能存在文件目录遍历安全漏洞,该漏洞源于对外暴露 Content Provider 组件的应用没有对 Content Provider 组件的访问进行权限控制和对访问的目标文件的 Content Query Uri 进行有效判断,攻击者利用该应用暴露的 Content Provider 的 openFile() 接口进行文件目录遍历以达到访问任意可读文件的目的。在使用 Content Provider 时,将组件导出提供了 query 接口,由于 query 接口传入的参数直接或间接由接口调用者传入,攻击者构造 SQL Injection 语句,造成信息的泄漏甚至是应用私有数据的恶意改写和删除。攻击者利用文件目录遍历访问任意可读文件、查看本地数据库内容等。

2. 测试步骤

检查 AndroidManifest.xml 文件中注册的 Content Provider(MobSF),Content Provider 组件在 API-17(android4.2) 及以上版本由以前的 exported 属性默认 ture 改为默认 false。

使用 drozer 命令如下:

  1. run scanner.provider.injection -a APP包名
  2. # 测试 Content Provider,检测是否存在 SQL 注入

Content Provider - 图1

使用 drozer 命令

  1. run scanner.provider.traversal -a APP包名
  2. # 测试 Content Provider,检测是否存在目录遍历

Content Provider - 图2

3. 修复建议

  1. minSdkVersion 不低于 9;
  2. 不向外部 APP 提供的数据的私有 content provider 设置 exported=”false” 避免组件暴露(编译 api 小于 17 时更应注意此点);
  3. 使用参数化查询避免注入;
  4. 内部 APP 通过 content provid 交换数据设置 protectionLevel=”signature” 验证签名;
  5. 公开的 content provider 确保不存储敏感数据;
  6. Uri.decode() before use ContentProvider.openFile();
  7. 提供 asset 文件时注意权限保护。