【Android平台中的安全编程】の #01-限制app的敏感ContentProvider的可访问性

本文翻译自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 provider
Uri 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的可访问性

时间: 2024-08-04 20:35:46

【Android平台中的安全编程】の #01-限制app的敏感ContentProvider的可访问性的相关文章

【Android平台中的安全编程】の #00-不要在外部存储(SD卡)中存放未加密的敏感信息

本文翻译自https://www.securecoding.cert.org/confluence/display/java/DRD00-J.+Do+not+store+sensitive+information+on+external+storage+%28SD+card%29+unless+encrypted+first,有增删改. Android提供了几种保存持久化应用数据的选择,其中之一就是外部存储(/sdcard, /mnt/sdcard).外部存储包括设备内部的微型或标准大小的SD卡

Android平台中关于音频播放

Android平台中关于音频播放有以下三种方式: 1.SoundPool ---- 适合短促且对反应速度比较高的情况(游戏音效或按键声等) 2.MediaPlayer ---- 适合比较长且时间要求不高的情况 3.AudioTrack ---- 播放解码后的PCM码流 方法一:SoundPool 1)SoundPool简介 SoundPool类是Android用于管理和播放应用程序的音频资源的类.一个SoundPool对象可以看作是一个可以从APK中导入资源或者从文件系统中载入文件的样本集合.它

Android平台中实现翻页特效

Android平台中的二种翻页效果实现.第一种翻页效果如下: 实现原理:当前手指触摸点为a,则 a点坐标为(ax,ay), 由三角形acb与三角形cmb为对称三角形并且直线cp为am垂直平分线,则 B点坐标为(ax/2,ay/2).作gf垂直于om且cb垂直于am, 三角形cfg与gfm相似,则 cf:gf = gf:mf cf=(gf * gf) / mf gf长度为g点纵坐标 mf长度为g点横坐标cf长度可求 c点坐标可求 由c点.g点可确定过两点间的直线, 当该直线中x=0时求出与y足交点

Android平台中常用的可视化控件

一. TextView 二. ImageView 1.结构 java.lang.Object android.view.View android.widget.ImageView 已知直接子类: ImageButton, QuickContactBadge 已知间接子类: ZoomButton 2.类概述 显示任意图像,例如图标.ImageView类可以加载各种来源的图片(如资源或图片库),需要计算图像的尺寸,比便它可以在其他布局中使用,并提供例如缩放和着色(渲染)各种显示选项. 3.XML属性

[Java] 继承中,父类被覆盖的成员变量、方法的可访问性

在 Java 的继承机制里,在子类内部,可以访问父类被覆盖的变量和方法:在子类外部,可以访问父类的被覆盖变量,但是不能访问父类的被覆盖方法. 父类中被覆盖的方法不能在外部被方法,这是出于封装的考虑. 例子: Super, 父类,拥有一个成员变量 x ,和成员方法 doSomething(). Point,继承 Super, 但覆盖了 Super 的 x 和 doSomething(),拥有自己的同名成员成员 x 和 doSomething(). StaticDemo1, 演示在继承中,在内部,可

Android平台的音乐资源管理与播放

Android平台基于Linux和开放手机联盟(OHA)系统,经过中国移动的创新研发,设计出拥有新颖独特的用户操作界面,增强了浏览器能力和WAP 兼容性,优化了多媒体领域的OpenCORE.浏览器领域的WebKit等业内众多知名引擎,增加了包括游戏.Widget.Java ME等在内的先进平台中间件.本文主要介绍如何利用OPhone平台提供的多媒体编程环境进行音乐资源的管理与播放. MediaScanner与音乐信息扫描    Android系统在SD卡插入后,MediaScanner服务会在后

关于Android工程中的主要文件夹存放的文件种类

Android工程中的文件类型包括以下几种: 一.jar包:是为了解决软件的兼容问题.如果在低版本Android平台上开发一个应用程序,而应用程序又想使用高版本才拥有的功能,就需要使用Support库.Android private libraries 和 Android 4.2.2  .Referenced libraries 等.其实 Android private libraries 和Referenced libraries 两个文件夹中的都是通过configure build  pat

android开发中的5种存储数据方式

数据存储在开发中是使用最频繁的,根据不同的情况选择不同的存储数据方式对于提高开发效率很有帮助.下面笔者在主要介绍Android平台中实现数据存储的5种方式. 1.使用SharedPreferences存储数据 SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比如窗口状态,一般在Activity中 重载窗口状态onSaveInstance State保存一般使用SharedPreferences完成,它提供了Android平台常规的Long长 整

Android开发中几种有用的的日历控件实现

我们大家都知道,在Android平台3.0中才新增了日历视图控件,可以显示网格状的日历内容,那么对于3.0以下的版本要使用日历控件只能借助第三方,目前用的最多的是CalendarView. 先简单介绍下CalendarView日历控件的使用. android.widget.CalendarView是从android.widget.FrameLayout中继承. CalendarView 类提供了基本的日历设置方法: long getDate() 获取从1970年,1月1日,0点0分0秒到现在的毫