浅入浅出 Android 安全:第五章 Android 应用层安全

第五章 Android 应用层安全

来源:Yury Zhauniarovich | Publications

译者:飞龙

协议:CC BY-NC-SA 4.0

虽然在这一节中我们描述了应用层的安全性,但是实际的安全实施通常出现在到目前为止描述的底层。 但是,在介绍应用层之后,我们更容易解释 Android 的一些安全功能。

5.1 应用组件

Android 应用以 Android 软件包(.apk)文件的形式分发。 一个包由 Dalvik 可执行文件,资源文件,清单文件和本地库组成,并由应用的开发人员使用自签名证书签名。 每个 Android 应用由四个组件类型的几个组件组成:活动(Activity),服务(Service),广播接收器(Boardcast Reciver)和内容供应器(Content Provider)。 将应用分离为组件有助于应用的一部分在应用之间重用。

活动。 活动是用户界面的元素之一。 一般来说,一个活动通常代表一个界面。

服务。 服务是 Android 中的后台工作装置。 服务可以无限期运行。 最知名的服务示例是在后台播放音乐的媒体播放器,即使用户离开已启动此服务的活动。

广播接收器。 广播接收器是应用的组件,它接收广播消息并根据所获得的消息启动工作流。

内容供应器。 内容供应器是为应用提供存储和检索数据的能力的组件。 它还可以与另一应用共享一组数据。

因此,Android 应用由不同的组件组成,没有中央入口点,不像 Java 程序和main方法那样。 由于没有入口点,所有组件(广播接收器除外,它也可以动态定义)需要由应用的开发人员在AndroidManifest.xml文件中声明。 分离成组件使得我们可以在其它应用中使用组件。 例如,在清单 5.1 中,显示了一个应用的AndroidManifest.xml文件的示例。 此应用包含第 21 行中声明的一个Activity。其他应用可能会调用此活动,将此组件的功能集成到其应用中。

 1 <?xml version="1.0" encoding="utf−8"?> 
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
 3   package="com.testpackage.testapp" 
 4   android:versionCode="1" 
 5   android:versionName="1.0" 
 6   android:sharedUserId="com.testpackage.shareduid" 
 7   android:sharedUserLabel="@string/sharedUserId" >
 8 
 9   <uses−sdk android:minSdkVersion="10" /> 
10 
11   <permission android:name="com.testpackage.permission.mypermission" 
12     android:label="@string/mypermission_string" 
13     android:description="@string/mypermission_descr_string" 
14     android:protectionLevel="dangerous" /> 
15 
16   <uses−permission android:name="android.permission.SEND_SMS"/> 
17 
18   <application 
19     android:icon="@drawable/ic_launcher" 
20     android:label="@string/app_name" > 
21     <activity android:name=".TestActivity" 
22       android:label="@string/app_name" 
23       android:permission="com.testpackage.permission.mypermission" > 
24       <intent−filter> 
25         <action android:name="android.intent.action.MAIN" /> 
26         <category android:name="android.intent.category.LAUNCHER" /> 
27       </intent−filter> 
28       <intent−filter> 
29         <action android:name="com.testpackage.testapp.MY_ACTION" /> 
30         <category android:name="android.intent.category.DEFAULT" /> 
31       </intent−filter> 
32     </activity> 
33   </application> 
34 </manifest>

代码 5.1:AndroidManifest.xml文件示例

Android 提供了各种方式来调用应用的组件。 我们可以通过使用方法startActivitystartActivityForResult启动新的活动。 服务通过startService方法启动。 在这种情况下,被调用的服务调用其方法onStart。 当开发人员要在组件和服务之间建立连接时,它调用bindService方法,并在被调用的服务中调用onBind方法。 当应用或系统组件使用sendBroadcastsendOrderedBroadcastsendStickyBroadcast方法发送特殊消息时,将启动广播接收器。

内容供应器由来自内容解析器的请求调用。所有其他组件类型通过Intent(意图)激活。 意图是 Android 中基于Binder框架的特殊通信手段。意图被传递给执行组件调用的方法。被调用的组件可以被两种不同类型的意图调用。为了显示这些类型的差异,让我们考虑一个例子。例如,用户想要在应用中选择图片。应用的开发人员可以使用显式意图或隐式意图来调用选择图片的组件。对于第一种意图类型,开发人员可以在他的应用的组件中实现挑选功能,并使用带有组件名称数据字段的显式意图调用此组件。当然,开发人员可以调用其他应用的组件,但是在这种情况下,他必须确保该应用安装在系统中。一般来说,从开发人员的角度来看,一个应用中的组件或不同应用的组件之间的交互不存在差异。对于第二种意图类型,开发人员将选择适当组件的权利转移给操作系统。 intent对象在其ActionDataCategory字段中包含一些信息。根据这个信息,使用意图过滤器,操作系统选择可以处理意图的适当组件。意图过滤器定义了组件可以处理的意图的“模板"。当然,相同的应用可以定义一个意图过滤器,它将处理来自其他组件的意图。

5.2 应用层的权限

权限不仅用于保护对系统资源的访问。 第三方应用的开发人员还可以使用自定义权限来保护对其应用的组件的访问。 自定义权限声明的示例如清单 5.1 中第 11 行所示。自定义权限的声明类似于系统权限之一。

为了说明自定义权限的用法,请参考图 5.1。由 3 个组件组成的应用 2 希望保护对其中两个的访问:C1 和 C2。为了实现这个目标,应用 2 的开发者必须声明两个权限标签p1p2,并相应地将它们分配给受保护的组件。如果应用 1 的开发者想要访问应用 2 的组件 C1 ,则他必须定义他的应用需要权限p1。在这种情况下,应用 1 就可以使用应用 2 的组件 C1。如果应用没有指定所需的权限,则禁止访问受此权限保护的组件(参见图 5.1 中组件 C2 的情况)。回头看看我们在代码 5.1 中的AndroidManifest.xml文件的例子,活动TestActivity被权限com.testpackage.permission.mypermission保护,它在同一个应用清单文件中声明。如果另一个应用想要使用TestActivity提供的功能,它必须请求使用此权限,类似于第 16 行中的操作。

图 5.1:保护第三方应用组件的权限实施

ActivityManagerService负责调用应用的组件。 为了保证应用组件的安全性,在用于调用组件的框架方法(例如,5.1 节中描述的startActivity)中,放置特殊的钩子。 这些钩子检查应用是否有权调用组件。 这些检查以PackageManagerServer类的CheckUidPermission方法结束(参见清单 4.6)。 因此,发生在 Android 框架层的实际的权限实施,可以看做 Android 操作系统的受信任部分。 因此,应用不能绕过检查。 有关如何调用组件和权限检查的更多信息,请参见[8]。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容