Content Provider组件暴露 - exported属性 一、android:exported 该属性指示了content provider是否可以被其他应用程序使用 1. true 代表该content provider可以被其他应用程序使用,其他所有的应用程序都可以通过该content provider提供的URI访问由该content provider提供的数据,在访问的时候,只需要遵循相应的权限就行 2. false 代表该content provider对其他应用程序来说是不可见的,将android:exported设置为false,用于限制其他应用程序来访问由该content provider提供的数据,只有当应用程序的UID和该content provider的UID相同时,才可以访问 3. 默认值 当minSdkVersion或者targetSdkVersion小于16时该属性的默认值是true;当大于17时,该属性默认值为false 4. 权限控制 【1】可以通过设置该属性的值为false或者通过访问权限来控制该content provider是否可以被其他应用程序使用 【2】android:permission 指定读写该content provider数据的权限名称 5. 参考链接 http://blog.youkuaiyun.com/peng_cao/article/details/50747694#androidexported 二、触发条件 1. 定位AndroidManifest.xml文件中的content provider组件 【1】对应的特征:<provider 2. exported属性的判断 【1】android:permission 如果设置权限控制,就认为不存在安全风险 【2】android:exported="true" 未设置权限控制的情况下,exported属性设置为true (默认也是true) 三、漏洞原理 【1】导出的Content Provider组件可以被第三方app任意调用,导致敏感信息泄露,并可能受到目录遍历、SQL注入等攻击风险 【2】详细的原理&POC http://www.droidsec.cn/android-content-provider-security/ 四、修复建议 【1】如果应用的Content Provider组件不必要导出,建议显式设置组件的“android:exported”属性为false 【2】如果必须要有数据提供给外部应用使用,建议对组件进行权限控制