Android的安全设计与架构外文翻译资料

 2022-08-10 04:08

英语原文共 32 页,剩余内容已隐藏,支付完成后下载完整资料


Android的安全设计与架构

Android由几个在安全检查和执行中发挥作用的机制组成。与任何现代操作系统一样,这些机制中的许多机制相互作用,交换有关信息(应用程序/用户)、对象(其他应用程序、文件、设备)和要执行的操作(读、写、删除等)的信息。通常情况下,强制执行不会发生意外;但有时,事情会出现以外,为错误的行为提供机会。本章讨论了Android的安全设计和体系结构,为分析Android平台的整体攻击面奠定了基础。

了解Android系统架构

般的Android体系结构有时被描述为“Linux上的Java”,然而,这有点用词不当,并不能完全公正地解释平台的复杂性和体系结构。总体架构由分为五个主要层的组件组成,包括Android应用程序、Android框架、Dalvik虚拟机、用户空间本机代码和Linux内核。图2-1显示了这些层是如何组成Android软件栈的

Android应用程序允许开发人员在不改变较低级别的情况下扩展和改进设备的功能。反过来,Android框架为开发人员提供了一个丰富的API,它可以访问Android设备必须提供的应用程序和Dalvik虚拟机之间的“粘合剂”的所有各种功能。这包括使开发人员能够执行常见任务的构建块,例如管理用户界面(UI)元素、访问共享数据存储和在应用程序组件之间传递消息。

Android应用程序和Android框架都是用Java编程语言开发的,并在Dalvik虚拟机(DalvikVM)中执行。这个虚拟机(VM)是专门为底层操作系统提供高效抽象层的。Dalvik VM是一个基于寄存器的VM,它解释Dalvik可执行(DEX)字节码格式。反过来,DalvikVM依赖于许多支持本机代码库提供的功能。

Android的用户空间本机代码组件包括系统服务,例如vold和DBus;网络服务,例如dhcpd和wpa_supplicant;和库,例如仿生libc,WebKit和OpenSSL。这些服务和库中的某些与内核级服务和驱动程序进行通信,而其他服务和库仅促进托管代码的低级本机操作

Android的基础是Linus内核。Android对内核源代码树做了大量的增加和修改,其中一些有自己的安全分支。我们将在第3、10和12章更详细地讨论这些问题。内核级驱动程序还提供了其他功能,如摄像头访问、Wi-Fi和其他网络设备访问。特别需要注意的是绑定器驱动程序,它实现进程间通信(IPC)。

本章后面的“仔细查看各个层”一节将更详细地检查每个层的关键组件。

理解安全边界和实施

安全边界,有时称为信任边界,是系统中双方信任程度不同的特定位置。内核空间和用户空间之间的边界就是一个很好的例子。内核空间中的代码被信任用于在硬件上执行低级操作并访问所有虚拟和物理内存。然而,由于中央处理器(CPU)强制的边界,用户空间代码不能访问所有内存。

Android操作系统利用两个独立但相互协作的权限模型。在较低级别,Linux内核使用用户和组实施权限。此权限模型继承自Linux,并强制访问文件系统条目以及其他Android特定资源。这通常被称为Android的沙盒。Android运行时通过DalvikVM和Android框架实施第二种模型。该模型在用户安装应用程序时向用户公开,定义了限制Android应用程序功能的应用程序权限。第二个模型中的某些权限实际上直接映射到底层操作系统(OS)上的特定用户、组和功能。

Android的沙箱

Android的Linux基础带来了类似Unix的进程隔离和最小特权原则的广为人知的传统。具体来说,作为独立用户运行的进程的概念不能互相干扰,例如发送信号或访问彼此的内存空间。因此,Android的大部分沙箱都基于以下几个关键概念:标准Linux进程隔离,大多数进程的唯一用户ID(UID),以及严格限制的文件系统权限。

Android共享Linux的UID /组ID(GID)范例,但是没有传统的密码和组文件作为其用户和组凭据的来源。取而代之的是,Android定义了名称映射到称为Android ID(AID)的唯一标识符。初始AID映射包含特权的保留静态条目和系统关键用户,例如系统用户/组。Android还保留用于预配置应用程序UID的AID范围。 4.1之后的Android版本为多个用户配置文件和孤立的流程用户添加了附加的AID范围(例如,用于Chrome的进一步沙箱)。您可以在Android Open Source Project(AOSP)树中的system / core / include / private / android_filesystem_config.h中找到有关AID的定义。下面显示了为简短起见而编辑的摘录。

#define AID_ROOT 0 /* traditional unix root user */

#define AID_SYSTEM 1000 /* system server */

#define AID_RADIO 1001 /* telephony subsystem, RIL */

#define AID_BLUETOOTH 1002 /* bluetooth subsystem */

...

#define AID_SHELL 2000 /* adb and debug shell user */

#define AID_CACHE 2001 /* cache access */

#define AID_DIAG 2002 /* access to diagnostic resources */

/* The 3000 series are intended for use as supplemental group ids only.

* They indicate special Android capabilities that the kernel is aware of. */

#define AID_NET_BT_ADMIN 3001 /* bluetooth: create any socket */

#define AID_NET_BT 3002 /* bluetooth: create sco,

rfcomm or l2cap sockets */

#define AID_INET 3003 /* can create AF_INET and

AF_INET6 sockets */

#define AID_NET_RAW 3004 /* can create raw INET sockets */

...

#define AID_APP 10000 /* first app user */

#define AID_ISOLATED_START 99000 /* start of uids for fully

isolated sandboxed processes */

#define AID_ISOLATED_END 99999 /* end of uids for fully

isolated sandboxed processes */

#define AID_USER 100000 /* offset for uid ranges for each user */

除了AID,Android还使用补充组来使进程能够访问共享或受保护的资源。例如,sdcard_rw组的成员资格允许进程同时读取和写入/ sdcard目录,因为其安装选项限制了可以读取和写入的组。这类似于在许多Linux发行版中使用补充组的方式。

注意:尽管所有AID条目都映射到UID和GID,但是不一定要使用UID代表系统上的用户。例如,AID_SDCARD_RW映射到sdcard_rw,但仅用作补充组,而不用作系统上的UID。

除了强制执行文件系统访问权限之外,还可以使用补充组来授予进程其他权限。例如,AID_INET组允许用户打开AF_INET和AF_INET6套接字。在某些情况下,权限也可能以Linux功能的形式出现。例如,AID_INET_ADMIN组中的成员资格授予CAP_NET_ADMIN功能,从而允许用户配置网络接口和路由表。其他类似的,与网络相关的组稍后会在“ Paranoid网络”部分中引用。

在4.3版及更高版本中,Android增加了对Linux功能的使用。例如,Android 4.3将/ system / bin / run-as二进制文件从set-UID根目录更改为使用Linux功能来访问特权资源。在此,此功能有助于访问packages.list文件。

注意:有关Linux功能的完整讨论不在本章范围之内。您可以分别在Linux内核的Documentation / security / credentials.txt和功能手册页中找到有关Linux进程安全性和Linux功能的更多信息。

应用程序执行时,其UID,GID和补充组将分配给新创建的进程。在唯一的UID和GID下运行,使操作系统可以在内核中实施较低级别的限制,并允许运行时控制应用程序间的交互。这是Android沙箱的症结所在。

以下代码段显示了HTC One V上ps命令的输出。请注意,最左边的拥有UID,每个应用程序进程中的每个UID都是唯一的:

app_16 4089 1451 304080 31724 ... S com.htc.bgp

app_35 4119 1451 309712 30164 ... S com.google.android.calendar

app_155 4145 1451 318276 39096 ... S com.google.android.apps.plus

app_24 4159 1451 307736 32920 ... S android.process.media

app_151 4247 1451 303172 28032 ... S com.htc.lockscreen

app_49 4260 1451 303696 28132 ... S com.htc.weather.bg

app_13 4277 1451 453248 68260 ... S com.android.browser

应用程序还可以通过应用程序包中的特殊指令来共享UID。在“主要应用程序组件”部分中将进一步讨论。

在后台,为该过程显示的用户名和组名实际上是由POSIX函数的Android特定实现(通常用于设置和获取这些值)提供的。例如,考虑一下getpwuid函数(在Bionic库的stubs.cpp中定义):

345 passwd* getpwuid(uid_t uid) { // NOLINT: implementing bad function.

346 stubs_state_t* state = __stubs_state();

347 if (state == NULL) {

348 return NULL;

349 }

350

351 passwd* pw = android_id_to_passwd(state, uid);

352 if (pw != NULL) {

353 return pw;

354 }

355 return app_id_to_passwd(uid, state);

356 }

像其弟兄一样,getpwuid依次调用其他特定于Android的函数,例如android_id_to_passwd和app_id_to_passwd。然后,这些功能会使用相应的AID信息填充Unix密码结构。 android_id_to_passwd函数调用android_iinfo_to_passwd来完成此任务:

static passwd* android_iinfo_to_passwd(stubs_state_t* state,

const android_id_info* iinfo) {

snprintf(state-gt;dir_buffer_, sizeof(state-gt;dir_buffer_), '/');

snprintf(state-gt;sh_buffer_,

剩余内容已隐藏,支付完成后下载完整资料


资料编号:[238151],资料为PDF文档或Word文档,PDF文档可免费转换为Word

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。