【Android平台中的安全编程】の #01-限制app的敏感ContentProvider的可访问性
来源:互联网 发布:物流发布信息软件 编辑:程序博客网 时间:2024/05/23 19:06
本文翻译自https://www.securecoding.cert.org/confluence/display/java/DRD01-J.+Limit+the+accessibility+of+an+app%27s+sensitive+content+provider,有增删改。
ContentProvider类提供了与其他app管理和共享数据的机制。当与其他app共享provider的数据时,必须小心的实现访问控制,防止对敏感数据的非法访问。
限制ContentProvider的访问有三种方法:
Public
Private
Restricted access
[Public]
在AndroidManifest.xml文件中声明android:exported属性,ContentProvider就可以公开给其他app使用,Android API Level 16之前的版本,ContentProvider默认是public的,除非显式的声明android:exported=“false”,例如:
<provider android:exported="true" android:name="MyContentProvider" android:authorities="com.example.mycontentprovider" />
如果ContentProvider被设置为Public,那么存储在ContentProvider里面的数据就可以被其他app访问到。因此,设计上必须保证只公开了非保密的信息。
[Private]
在AndroidManifest.xml文件中声明android:exported属性,可以将ContentProvider设置为Private的。从Android API Level 17及之后的版本,ContentProvider默认是Private的,不需要显式声明,例如:
<provider android:exported="false" android:name="MyContentProvider" android:authorities="com.example.mycontentprovider" />
如果ContentProvider不需要与其他app共享数据,那么就在manifest文件中声明android:exported=“false”,需要注意的是,在API Level 8及之前的版本,即使你显式声明android:exported=“false”,对应的ContentProvider还是能够被其他app访问到。
[Restricted Access]
未完待续
[不符合安全要求的代码例子]
MovatwiTouch,一个Twitter客户端,使用ContentProvider来管理Twitter的用户的key,secret和access token,然而这个ContentProvider是Public的,这使得安装在同一台手机上的其他应用可以获取到这些敏感信息。
下面的AndroidManifest.xml文件中Provider声明没有指定android:exported属性,因此,在API Level 16之前,这个ContentProvider是公开的。
<provider android:name=".content.AccountProvider" android:authorities="jp.co.vulnerable.accountprovider" />
[概念验证]
下面的代码展示了Public的ContentProvider漏洞如何被利用
// check whether movatwi is installed.try { ApplicationInfo info = getPackageManager().getApplicationInfo("jp.co.vulnerable", 0);[cjl5]} catch (NameNotFoundException e) { Log.w(TAG, "the app is not installed."); return;}// extract account data through content providerUri uri = Uri.parse("content://jp.co.vulnerable.accountprovider");Cursor cur = getContentResolver().query(uri, null, null, null, null);[cjl6]StringBuilder sb = new StringBuilder();if (cur != null) { int ri = 0; while (cur.moveToNext()) { ++ri; Log.i(TAG, String.format("row[%d]:", ri)); sb.setLength(0); for (int i = 0; i < cur.getColumnCount(); ++i) { String column = cur.getColumnName(i); String value = cur.getString(i); if (value != null) { value = value.replaceAll("[\r\n]", ""); } Log.i(TAG, String.format("\t%s:\t%s", column, value)); } }} else { Log.i(TAG, "Can't get the app information.");}
[解决方案]
在AndroidManifest.xml文件中将ContentProvider显式声明为
android:exported=“false”<provider android:name=".content.AccountProvider" android:exported="false" android:authorities="jp.co.vulnerable.accountprovider" />
——欢迎转载,请注明出处 http://blog.csdn.net/asce1885 ,未经本人同意请勿用于商业用途,谢谢——
- 【Android平台中的安全编程】の #01-限制app的敏感ContentProvider的可访问性
- android限制app的敏感ContentProvider的可访问性
- 【Android平台中的安全编程】の #00-不要在外部存储(SD卡)中存放未加密的敏感信息
- 雷神的微软平台安全宝典:使用源端口访问规则来限制访问
- Android ContentProvider的线程安全(一)
- Android ContentProvider的线程安全(二)
- Android 中ContentProvider的用法及用ContentProvider访问联系人
- Android 中ContentProvider的用法及用ContentProvider访问联系人
- C#高手必须掌握的4个要点:访问修饰符/可访问性级别/可访问域/可访问性级别的使用限制
- Restricting Accessor Accessibility (C# Programming Guide)-属性访问操作符可访问性的限制
- Android中的ContentProvider的Uri的简介
- 关于通过IWebBrowser2访问IHTMLDocument2的安全限制的探索
- Android中的ContentProvider的学习笔记.
- ContentProvider提供者的使用,一个app访问另一个app的数据库
- contentProvider不是线程安全的
- 记平台可移植的matlab编程
- .net4.0的透明规则(派生类型必须与基类型的安全可访问性匹配或者比基类型的安全可访问性低) .
- Android设备可能受到Judy App弱点的限制,请遵循三点提示保证Android安全!
- 解决:System.Data.SqlClient.SqlError: FILESTREAM 功能被禁用
- 进程调度
- MySQL对SQL语句分组
- C++连接MySQL
- 网易新闻客户端IOS版用过的开源库
- 【Android平台中的安全编程】の #01-限制app的敏感ContentProvider的可访问性
- 指针与动态分配
- oj平台测试-重载运算符
- Linux命令之strings:打印文件中的可打印字符串
- SqlMap用户手册
- CMarkup之类成员函数说明
- jsp中forward和redirect的区别
- 解决标题过长问题
- linux 磁盘文件系统