App安全实战指南:Android和iOS App的安全攻防与合规
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.4 移动应用的运行

1.4.1 Android应用的运行

Android是基于Linux内核开发的操作系统,因此也继承了Linux的安全机制。如图1-24所示,Android系统进一步完善了Linux基于用户的识别和隔离应用资源的保护机制。Android系统中每个应用程序安装时都会被分配唯一的用户编号(UID),只要应用程序不被卸载,UID就不会变动。Android会依据应用的UID为每个应用设置一个独立的内核级应用沙盒,所有应用都在沙盒中独立运行。默认情况下应用之间不能交互,只能访问和使用自己沙盒内的资源。

图1-24 Android进程隔离

攻击者要想攻破Android系统,就必须突破沙盒的安全限制,Android为了保证应用沙盒机制的安全性,一直在不断增加各种安全措施。表1-7是Android各版本新增的安全机制情况。

表1-7 Android各版本新增的安全机制

为了保证应用沙盒的安全,除了上述不断增强的系统层面的防护措施外,Android还根据应用本身的可信度对其进行分类,共分为4类,即不可信应用、特权应用、平台应用和系统应用,如表1-8所示。

表1-8 Android应用类型及权限

如图1-25所示,应用程序启动时会根据应用的类型分配不同的访问权限。拥有系统权限的应用在访问系统资源时有很多特权,几乎不受沙盒策略的限制;非系统应用要访问系统资源则会受到严格的限制。

图1-25 不同类型的Android应用访问系统资源

虽然严格地应用隔离策略能大幅提高应用的安全性,但应用之间不可避免地会交互通信,严格的应用隔离策略会带来诸多不便。为保证运行在不同沙盒间的应用依然可以正常交互,Android提供了两种应用间数据共享机制:sharedUserId共享机制和基于Binder的IPC通信机制。

(1)sharedUserId共享机制

使用相同签名和相同sharedUserId属性的应用会被分配相同的UID,拥有相同UID的应用可以彼此访问其数据目录下的任意数据,还可以将应用配置到同一个进程中运行。开发者可以在应用的Manifest文件中添加sharedUserId属性进行设置,具体代码如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

  package="com.share.demo"

  android:versionCode="1"

  android:versionName="1.0"

  android:sharedUserId="demo">


注意

Android 10.0及以后的系统不再支持sharedUserId属性的设置。


(2)基于Binder的IPC通信机制

Binder实现了基于客户端/服务器(C/S)架构的进程间通信(IPC),它通过Android接口定义语言(AIDL)来定义通信接口及交换数据的格式,确保进程间传输的数据安全有效,避免数据溢出或越界。其本质就是通过共享内存方式实现进程通信,具体通信原理如图1-26所示。

图1-26 Android进程间通信

Binder在内核空间创建两个内存缓冲区,在两个内存缓冲区之间建立映射关系,同时在内核中的共享数据缓存区和接收进程的用户空间地址之间建立映射关系。发送方进程调用copy_from_user函数将共享数据复制到到内核中的内存缓冲区。由于内存缓冲区和接收进程的用户空间存在内存映射,接收进程便可直接读取共享数据。

1.4.2 iOS应用的运行

iOS系统是苹果基于Darwin研发的操作系统,而Darwin是基于FreeBSD研发的操作系统。iOS系统就顺理成章地继承了FreeBSD系统基于TrustedBSD框架的MAC机制,iOS以此机制为基础建立了一套严格限制应用访问的安全机制。如图1-27所示,应用安装时都会分配一个独立的存储空间,该存储空间也就是应用沙盒。沙盒之间相互独立,不能相互访问,应用只能访问自己空间内的资源。

图1-27 iOS进程隔离

1.2.2节提到iOS的应用沙盒由4个文件目录组成:Documents、Library、tmp及应用的安装目录AppName.app。文件目录所在位置和作用如表1-5所示。

安全沙盒机制保证应用与系统文件和资源处于隔离状态,如果应用要访问系统文件和资源,就需要取得系统的授权。而与Android系统有所不同,iOS系统中的大部分系统应用要访问系统文件和资源同样需要先获取相关授权,如图1-28所示。

图1-28 iOS应用访问系统资源

应用沙盒保证了每个应用程序在设备中都有自己独立的存储位置,从而确保了应用数据的安全。但有时为了实现某些应用的功能,要进行数据共享。在保证应用数据安全的前提下,iOS系统提供了3种数据共享方式:KeyChain、App Groups和剪贴板。

首先,如图1-29所示,KeyChain提供了两种访问区:私有区域和公共区域。私有区域仅限本应用进行访问,对其他应用不可见,也无法访问。公共区域可以被同一证书签名的其他应用访问,可以通过此方式实现不同应用间的数据共享。

图1-29 KeyChain数据共享

其次,如图1-30所示,App Groups是苹果在iOS 8版本中加入的功能,同一开发者的应用可以通过注册同一个App Groups进行数据共享。开发者在苹果的开发者中心注册一个对外共享的App Groups,然后通过Xcode对需要进行数据共享的应用都配置该App Groups。这样同一开发者的应用间就可以通过App Groups共享数据。

图1-30 App Groups数据共享

最后,如图1-31所示,剪贴板功能是一种便捷且高效的数据共享方式,使不同应用间能够轻松共享信息。iOS系统提供了两种剪贴板模式:generalPasteboard和pasteboardWithName。generalPasteboard作为一个全局剪贴板,允许系统中所有的应用进行数据共享。pasteboardWithName则相当于一个私有剪贴板,只有本应用或者使用同一证书签名的应用之间可以共享数据。

图1-31 剪贴板数据共享