第五章 Android 应用层安全

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

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

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

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

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

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

    代码 5.1:AndroidManifest.xml文件示例

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

    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)中,放置特殊的钩子。 这些钩子检查应用是否有权调用组件。 这些检查以类的CheckUidPermission方法结束(参见清单 4.6)。 因此,发生在 Android 框架层的实际的权限实施,可以看做 Android 操作系统的受信任部分。 因此,应用不能绕过检查。 有关如何调用组件和权限检查的更多信息,请参见[8]。