Android程序,Android开发平台
【安卓平台中的安全编程】 #01-限制应用的敏感内容提供器的可访问性_wx5dce75f541ce3的技术博客_博客
本文翻译自https://www。安全编码。证明合格的org/confluence/display/Java/drd 01-j。限制一个应用的敏感内容提供者的可访问性,有增删改。
内容提供器类提供了与其他应用管理和共享数据的机制。当与其他应用共享供应者的数据时,必须小心的实现访问控制,防止对敏感数据的非法访问。
限制内容提供器的访问有三种方法:
公共
私人的
受限访问
[公共]
在AndroidManifest.xml文件中声明安卓系统:已导出属性,内容提供者就可以公开给其他应用使用,安卓应用程序接口级之前的版本,内容提供者默认是公众的的,除非显式的声明android:exported="false ",例如:
提供者Android:exported= true Android:name=我的内容提供商 Android:authorities= com。举例。我的内容提供商/如果内容提供器被设置为公共的,那么存储在内容提供器里面的数据就可以被其他应用访问到。因此,设计上必须保证只公开了非保密的信息。
[私人]
在AndroidManifest.xml文件中声明安卓系统:已导出属性,可以将内容提供器设置为私人的的。从安卓帮助文档级及之后的版本,内容提供者默认是私人的的,不需要显式声明,例如:
提供者Android:exported= false Android:name=我的内容提供商 Android:authorities= com。举例。我的内容提供商/如果内容提供器不需要与其他应用共享数据,那么就在显示文件中声明android:exported="false ",需要注意的是,在应用程序接口级及之前的版本,即使你显式声明android:exported="false ",对应的内容提供器还是能够被其他应用访问到。
[受限访问]
未完待续
[不符合安全要求的代码例子]
MovatwiTouch,一个推特客户端,使用内容提供器来管理推特的用户的密钥,秘密和访问令牌,然而这个内容提供器是公共的,这使得安装在同一台手机上的其他应用可以获取到这些敏感信息。
下面的AndroidManifest.xml文件中供应者声明没有指定安卓系统:已导出属性,因此,在应用程序接口级之前,这个内容提供器是公开的。
提供者Android:name= content。帐户提供商 Android:authorities= jp。公司易受攻击。帐户提供商/
[概念验证]
下面的代码展示了公共的内容提供器漏洞如何被利用
//检查是否安装了莫瓦特维.
尝试{
应用程序信息info=getPackageManager().getApplicationInfo( jp。co . vulnerable ,0);[cjl5]
} catch(NameNotFoundException e){
Log.w(标签,应用未安装。);
返回;
}
//通过内容提供商提取帐户数据
uri uri=uri。parse( content://jp。公司易受攻击。帐户提供商’);
Cursor cur=getContentResolver().查询(uri,null,null,null,null);[cjl6]
StringBuilder sb=new StringBuilder();
如果(cur!=null) {
int ri=0;
while (cur.moveToNext()) {
ri;
Log.i(TAG,String.format(row[%d]:,ri));
某人(somebody的简写)setlength(0);
for(int I=0;我诅咒。get column count();i) {
字符串column=cur。获取列名(I);
字符串值=cur。getstring(I);
如果(值!=null) {
value=value.replaceAll([\r\n], );
}
Log.i(TAG,String.format(\t%s:\t%s ,列,值));
}
}
}否则{
Log.i(标签,无法获取应用信息。);
}
[解决方案]
在AndroidManifest.xml文件中将内容提供器显式声明为
android:exported="false "
provider Android:name= content。帐户提供商 Android:exported= false Android:authorities= jp。公司易受攻击。帐户提供商/
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。