https://source.android.com/tech/security/

1. 背景

2. 系统和内核层的安全性

3. 应用程序的安全性

1. 背景

Android为移动设备提供了一套开源平台和开发环境。

其主要的平台编译模块是:

  • 设备硬件:Android运行于手机和平板等广泛不同的硬件上,处理器各不相同,但确实可以利用一些特定硬件相关的安全能力,比如ARM v6 eXecute-Never.
  • 操作系统:操作系统的核心建立在Linux内核之上。所有设备资源,比如camera, gps, 蓝牙,电话,网络等,都通过操作系统得以获取访问(access)。
  • 应用程序运行时:大多应用程序由java编程并运行在Dalvik虚拟机上,然而,还有很多程序包括系统核心服务都是本地(native)程序或者包含本地库。无论Dalvik还是本地程序都要在同样的包含应用程序沙盒(Sandbox)的安全环境下运行,程序获得一块理想的文件系统可以用来写入私有数据,包括数据库和原始文件。

Android应用程序有两个主要来源:

  • 预装的应用程序:包括电话,邮件,日历,联系人,浏览器。这些功能提供了设备的主要功能,可以被其他程序获取访问。预装程序可能是Android源代码的一部分,也可能是OEM厂商为了特定的设备自行开发。
  • 用户安装的应用程序:Android提供了开源的开发环境支持第三方开发的应用程序。

1.1 Android平台的安全架构

Android重新定义传统操作系统的安全控制:

  • 保护用户数据
  • 保护系统资源
  • 提供应用程序的隔离

为了实现这些目标,Android提供了以下关键的安全特性:

  • 通过Linux内核在操作系统层面上健壮的安全性
  • 对所有应用程序强制的沙盒机制
  • 安全的内部通信(interprocess)
  • 应用程序签名
  • 应用程序定义并由用户赋予权限

2. 系统和内核层的安全性

在操作系统层级,Android平台提供了Linux内核的安全性,包括IPC的安全机制来确保运行在不同进程间安全地通信。这些在操作系统层面上的安全性确保了本地代码同样也可以受到应用程序沙盒机制的制约。

2.1 Linux安全性

尽管Linux的历史充满了被无数开发者研究,攻击或修复,如今的Linux已经成为了一个受到很多企业和专家信任的安全稳定的内核。

作为移动开发环境的基础,Linux内核提供了Android一些关键的安全特性,包括:

  • 基于用户的权限模式
  • 进程隔离
  • 安全IPC扩展机制
  • 去除不必要的和有潜在危险的内核部分

作为一个多用户的操作系统,一个基本的安全目标是隔离用户彼此间的资源。

  • 防止用户A读取用户B的文件
  • 确保用户A不会消耗用户B的内存
  • 确保用户A不会消耗用户B的CPU资源
  • 确保用户A不会消耗用户B的设备(比如电话,蓝牙,GPS)

2.2沙盒机制

Android平台利用Linux基于用户的保护方式用来识别和区分应用程序的资源。Android系统为每一个应用程序分配一个唯一的用户ID号(UID),进程以该用户身份的独立运行。这种方式与其他操作系统(包括传统的Linux配置)的区别就在于后者的多用户应用程序都运行在相同的用户权限下。

这就建立起一个内核层面上的应用程序沙盒,使内核确保了应用程序与系统之间的安全性。默认情况下,应用程序间无法进行交互,如果程序A尝试比如读取程序B的数据或者在没有权限的情况下打电话,那么操作系统将防止它发生因为程序A没有合适的用户等级。沙盒是简单的,可审核的,基于老的Unix风格的用户分隔处理和文件权限。

由于应用程序的沙盒是在内核里的,这种安全模型可以扩展到本地代码和操作系统的程序。所有在内核层以上的软件(包括操作系统库,framewrok,运行时以及所有应用程序)都运行在应用程序沙盒之中。在一些平台上,出于安全考虑,开发者被限制在特定的开发框架或者API组里,而Android却没有这样的限制。

在一些操作系统里,内存崩溃错误往往会破坏设备的安全,Android不会这样,内存崩溃只会允许强制代码在该特定的程序上下文间执行,这种权限由操作系统建立。

2.3系统分区和安全模式

系统分区包括内核,操作系统库,运行时,framework和应用程序。这样的分区设为只读。当用户启动设备进入安全模式时,仅应用程序可以访问,确保了用户可以启动设备进入一个对于第三方软件可以自由运行的环境。

2.4文件系统权限
类UNIX系统的文件系统权限确保了用户无法改变或读取他人的文件。在Android上,每一个应用程序运行在自己的用户下,除非开发者显式地把文件暴露给其他程序,他人的程序同样无法改变或读取自己的文件。

2.5 密码系统 (Cryptography)

Android为用户提供了一套加密系统API,包括一些标准公用的密码算法比如AES, RSA, DSA, SHA.此外,API还提供了比如SSL, HTTPS等更高等级的协议。

Android 4.0引入KeyChain类,允许用户使用系统认证的存储空间来存放私钥和证书。

2.6 Root

默认情况下,仅有内核和一小部分核心程序运行于root权限下,Android并不会保护那些拥有root权限的用户或程序被操作系统,内核或其他应用修改。一般情况下,root超级用户拥有对应用程序和数据的完全访问权,那些改变了Android设备权限获取root权限的用户增加了安全隐患和潜在漏洞。

优化Android设备的能力对于开发者来说是很重要的。在很多设备上,用户有能力解锁bootloader来安装程序和改变系统,这些被改变的系统可能允许使用者为了调试程序和系统而获得root权限。为了保护存在的用户数据不被破坏,bootloader解锁机制需要bootloader擦除任何存在的用户数据作为解锁步骤的一部分,但是通过发掘内核的bug或者安全漏洞也可以获取root权限。

对存储在设备上的密钥数据加密并不能保护来自root超级用户的应用程序数据。应用程序可以加一层数据保护层,该层使用存储于设备之外(比如服务器或者用户密码)的密钥的加密方法。当密钥没有呈现时这种方法可以提供暂时的保护,但是在某些情况下密钥必须提供给应用程序,然后使之获得root用户的权限。

保护来自root用户的数据的一个更健壮的方案是使用硬件解决方案。OEM厂商可能会提供硬件解决方案来限制对特定内容的访问,比如视频播放的DRM,谷歌钱包的NFC存储。

对于已丢失或被偷的设备,完全文件系统加密(full filesystem encryption)使用了设备密码来保护加密的密钥,这样一来,即便修改了bootloader或系统在没有设备密码的情况下也无法充分获得用户的数据。

2.7文件系统加密 (Filesystem Encryption)

Android 3.0及以后版本提供了完全文件系统加密,使用AES128所有用户数据在内核里加密。加密的密钥由AES128算法保护,该算法的密钥来自用户的密码。

2.8 密码保护

Android可以通过配置来认证用户提供的密码来获取设备权限。是否使用密码以及密码的复杂程度规则可以由设备管理员设定。

2.9 设备管理员

Android 2.2及以后版本提供了Android设备管理员API,在系统层提供了设备管理员的特性。比如说,内置的邮件应用使用了这些API来增强交换数据(Exchange)的支持。通过邮件应用,Exchange管理员可以增强密码策略。管理员同样可以远程擦除已丢失或偷窃的设备。

更多相关文章

  1. Android(安卓)分析内存的使用情况
  2. 在Ubuntu上下载、编译、运行Android内核Linux Kernel
  3. Android——Toast重复显示解决方法
  4. Android(安卓)Application Task Activities的关系
  5. Android(安卓)应用程序之间数据共享 - ContentProvider
  6. android编译系统makefile(Android.mk)写法.txt
  7. Android编译系统makefile(Android.mk)说明
  8. android中Intent简介
  9. Android:Task概念以及相关

随机推荐

  1. 流程控制之for循环
  2. 必看!java后端,亮剑诛仙(最全知识点)
  3. 解析Java横死之谜,气定神闲看花开花落
  4. 给我1万字,也讲不清Java内存排查。1万不行
  5. 集合类型内置方法
  6. Python与用户交互
  7. 想把Java代码写的更漂亮么?了解一下Try吧
  8. 将java进程转移到“解剖台”之前,法医都干
  9. 字典类型
  10. 字典类型内置方法