您当前的位置:安全博客 > 安全漏洞 > Content Provider文件目录遍历漏洞浅析

Content Provider文件目录遍历漏洞浅析

阿里无线安全团队发表于2015年03月11日
作者:行里

1. 文件目录遍历安全漏洞描述

      Android Content Provider存在文件目录遍历安全漏洞,该漏洞源于对外暴露Content Provider组件的应用,没有对Content Provider组件的访问进行权限控制和对访问的目标文件的Content Query Uri进行有效判断,攻击者利用该应用暴露的Content Provider的openFile()接口进行文件目录遍历以达到访问任意可读文件的目的; 
      在不少漏洞平台上,存在大量由于Content Provider文件目录遍历而导致信息泄露的漏洞,如猎豹浏览器(Android版)任意私有文件数据可被本地第三方窃取漏洞[1]、赶集网Android客户端Content Provider组件任意文件读取漏洞[2]、58同城Android客户端远程文件写入漏洞[3]、Path traversal vulnerability on Adobe Reader (Android) Application[4]、Kaseya Browser Android Path Traversal[5]。 

2. 文件目录遍历安全漏洞影响范围

      Android所有系统

3.文件目录遍历安全漏洞详情

1) 漏洞位置:

ContentProvider.openFile(Uri uri, String mode) 

2) 漏洞触发前提条件:

      对外暴露的Content Provider组件实现了openFile()接口;
      没有对所访问的目标文件Uri进行有效判断,如没有过滤限制如“../”可实现任意可读文件的访问的Content Query Uri;

3) 漏洞原理:

      对外暴露的Content Provider实现了openFile()接口,因此其他有相应调用该Content Provider权限的应用即可调用Content Provider的openFile()接口进行文件数据访问。但是如果没有进行Content Provider访问权限控制和对访问的目标文件的Uri进行有效判断,攻击者利用文件目录遍历访问任意可读文件。 

4. 文件目录遍历安全漏洞证明

利用已注册的对外提供的ContentProvider的接口openFile进行任意可读文件的读取。

      在我们这个Content Provider应用的AndroidManifest.xml文件中,注册一个对外公开访问的Content Provider,比如,我们的Content Provider的类名是com.alibaba.pathtraversal.FileContentProvider: 

      Content Provider应用实现openFile接口的Java代码片段: 

      使用恶意应用调用Content Provider的openFile接口,用来读取任意可读文件的Java代码片段:  

      (1) 读取设备hosts文件”/system/etc/hosts”或系统属性文件”/system/build.prop”:

      URI代码片段:

      攻击结果显示:
 
      (2) 读取Content Provider应用私有文件如“databases/webview.db”:
      URI代码片段:
 
      攻击结果显示:
    
      (3) 读取sdcard中的可读文件,如“/mnt/sdcard/Log.txt”:
      URI代码片段:
 
      攻击结果显示:
 

5. 文件目录遍历安全漏洞修复建议

1. 将不必要导出的Content Provider设置为不导出[6]

      由于Android组件Content Provider无法在Android 2.2(即API Level 8)系统上设为不导出,因此如果应用的Content Provider不必要导出,阿里聚安全建议声明最低SDK版本为8以上版本;
      由于API level 在17以下的所有应用的“android:exported”属性默认值都为true.,因此如果应用的Content Provider不必要导出,阿里聚安全建议显示设置注册的Content Provider组件的“android:exported”属性为false;

2. 去除没有必要的openFile()接口

    如果应用的Content Provider组件没有必要实现openFile()接口,阿里聚安全建议移除该Content Provider的不必要的openFile()接口。

3. 过滤限制跨域访问,对访问的目标文件的路径进行有效判断[7] 

      使用Uri.decode()先对Content Query Uri进行解码后,再过滤如可通过“../”实现任意可读文件的访问的Uri字符串;

4. 设置权限来进行内部应用通过Content Provider的数据共享[6] 

      使用签名验证来控制Content Provider共享数据的访问权限:设置protectionLevel=”signature”;

引用

[1] http://www.wooyun.org/bugs/wooyun-2013-047098
[2] http://www.wooyun.org/bugs/wooyun-2013-044407
[3] http://www.wooyun.org/bugs/wooyun-2013-044411 
[4] http://blog.seguesec.com/2012/09/path-traversal-vulnerability-on-adobe-reader-android-application
[5] http://seclists.org/fulldisclosure/2015/Jan/127
[6] http://developer.android.com/training/articles/security-tips.html
[7] http://drops.wooyun.org/tips/4314




安全漏洞