应用安全

应用元素

Android 为移动设备提供了一个开放源代码平台和应用环境。核心操作系统基于 Linux 内核。Android 应用通常以 Java 编程语言编写,并在 Android Runtime (ART) 虚拟机中运行。但是,应用也可以用原生代码编写。应用从带有 APK 文件扩展名的单个文件安装。

Android 应用的主要构建块包括:

  • AndroidManifest.xmlAndroidManifest.xml 文件是一个控制文件,用于告知系统如何处理应用中的所有顶级组件(特别是下述 Activity、Service、广播接收器和内容提供程序)。它还会指定需要哪些权限。

  • ActivityActivity 通常是使用 Activity 类为单个以用户为中心的任务编写的代码。Activity 通常包括向用户显示 UI,但并非必须如此;有些 Activity 从不显示 UI。通常,应用的某个 Activity 是应用的入口点。

  • ServiceService 是一段在后台运行的代码。它可以自己的进程中运行,也可以在另一个应用的进程上下文中运行。其他组件“绑定”到 Service,并通过远程过程调用来调用其方法。媒体播放器就是一个 Service 的示例:即使在用户退出媒体选择 UI 后,用户可能仍然希望音乐继续播放。即使 UI 已完成,Service 也会让音乐继续播放。

  • 广播接收器BroadcastReceiver 是一个对象,当操作系统或另一个应用发出称为 Intent 的 IPC 机制时,它会被实例化。例如,应用可以为低电量消息注册一个接收器,并根据该信息更改其行为。

Android 权限模型:访问受保护的 API

Android 上的所有应用都在应用沙盒中运行。默认情况下,Android 应用只能访问有限范围的系统资源。系统管理 Android 应用对资源的访问,如果使用不当或恶意使用,可能会对用户体验、网络或设备上的数据产生不利影响。

这些限制以各种不同的形式实施。某些功能受到有意缺少敏感功能 API 的限制(例如,没有直接操作 SIM 卡的 Android API)。在某些情况下,角色分离提供了一种安全措施,例如每个应用存储的隔离。在其他情况下,敏感 API 旨在供受信任的应用使用,并通过称为“权限”的安全机制进行保护。

这些受保护的 API 包括:

  • 相机功能
  • 位置数据 (GPS)
  • 蓝牙功能
  • 电话功能
  • 短信/彩信功能
  • 网络/数据连接

这些资源只能通过操作系统访问。为了使用设备上受保护的 API,应用必须在其清单中定义它需要的功能。所有 Android 6.0 及更高版本都使用运行时权限模型。如果用户从应用请求需要受保护 API 的功能,系统会显示一个对话框,提示用户拒绝允许该权限。

一旦授予,权限将应用于应用,只要它已安装。为了避免用户感到困惑,系统不会再次通知用户授予应用的权限,并且核心操作系统中包含或由 OEM 捆绑的应用不会向用户请求权限。如果卸载应用,权限将被删除,因此后续重新安装将再次导致显示权限。

在设备设置中,用户可以查看他们以前安装的应用的权限。用户还可以选择全局关闭某些功能,例如禁用 GPS、无线电或 Wi-Fi。

如果应用尝试使用未在应用清单中声明的受保护功能,则权限失败通常会导致安全异常被抛回应用。受保护的 API 权限检查在尽可能低的级别强制执行,以防止规避。图 2 显示了在安装应用时请求访问受保护 API 的用户消息示例。

系统默认权限在 https://developer.android.com.cn/reference/android/Manifest.permission.html 中进行了描述。应用可以声明自己的权限供其他应用使用。此类权限未在上述位置列出。

在定义权限时,protectionLevel 属性会告知系统如何告知用户需要权限的应用,或允许谁持有权限。有关创建和使用应用特定权限的详细信息,请参见 https://developer.android.com.cn/guide/topics/security/security.html

有些设备功能(例如,发送短信广播 Intent 的能力)不适用于第三方应用,但 OEM 预装的应用可以使用这些功能。这些权限使用 signatureOrSystem 权限。

用户如何理解第三方应用

Android 致力于让用户清楚地了解他们何时与第三方应用互动,并告知用户这些应用具有哪些功能。在安装任何应用之前,系统会向用户显示一条清晰的消息,告知用户应用正在请求的不同权限。安装后,系统不会再次提示用户确认任何权限。

在安装前立即显示权限有很多原因。此时,用户正在积极查看有关应用、开发者和功能的信息,以确定其是否符合他们的需求和期望。同样重要的是,他们尚未对应用建立心理或经济承诺,并且可以轻松地将该应用与其他备选应用进行比较。

某些其他平台使用不同的用户通知方法,在每个会话开始时或应用使用时请求权限。Android 的愿景是让用户随意在应用之间无缝切换。每次都提供确认会减慢用户速度,并阻止 Android 提供出色的用户体验。让用户在安装时查看权限使用户可以选择在感到不舒服时不安装该应用。

此外,许多用户界面研究表明,过度提示用户会导致用户开始对显示的任何对话框说“确定”。Android 的安全目标之一是有效地向用户传达重要的安全信息,这无法通过用户会被训练为忽略的对话框来完成。通过只在重要时呈现重要信息一次,用户更有可能考虑他们同意的内容。

某些平台选择根本不显示有关应用功能的任何信息。这种方法阻止用户轻松理解和讨论应用功能。虽然并非所有用户始终能够做出完全知情的决定,但 Android 权限模型使广泛的用户可以轻松访问有关应用的信息。例如,意外的权限请求可能会促使更复杂的用户询问有关应用功能的关键问题,并在 Google Play 等位置分享他们的担忧,这些担忧对所有用户都可见。

应用安装时的权限 — Google 翻译 已安装应用的权限 — Gmail
Permissions at Application Install -- Google Translate Permissions of an Installed Application — Gmail

图 1. 应用的权限显示

进程间通信

进程可以使用任何传统的 UNIX 类型机制进行通信。示例包括文件系统、本地套接字或信号。但是,Linux 权限仍然适用。

Android 还提供了新的 IPC 机制:

  • Binder:一种轻量级、基于功能的远程过程调用机制,旨在在执行进程内和跨进程调用时实现高性能。Binder 使用自定义 Linux 驱动程序实现。请参阅 https://developer.android.com.cn/reference/android/os/Binder.html

  • Service:Service(如上所述)可以提供使用 Binder 直接访问的接口。

  • Intent:Intent 是一个简单的消息对象,表示“打算”做某事。例如,如果您的应用想要显示网页,它会通过创建 Intent 实例并将其交给系统来表达其查看 URL 的“Intent”。系统会找到一些其他代码(在本例中为浏览器),这些代码知道如何处理该 Intent 并运行它。Intent 也可用于广播有趣的事件(例如通知)系统范围。请参阅 https://developer.android.com.cn/reference/android/content/Intent.html

  • ContentProvider:ContentProvider 是一个数据仓库,可提供对设备上数据的访问;经典示例是用于访问用户联系人列表的 ContentProvider。应用可以访问其他应用通过 ContentProvider 公开的数据,应用也可以定义自己的 ContentProvider 来公开自己的数据。请参阅 https://developer.android.com.cn/reference/android/content/ContentProvider.html

虽然可以使用其他机制(例如网络套接字或全局可写文件)来实现 IPC,但这些是推荐的 Android IPC 框架。将鼓励 Android 开发者围绕保护用户数据和避免引入安全漏洞使用最佳实践。

费用敏感型 API

费用敏感型 API 是指任何可能为用户或网络产生费用的功能。Android 平台已将费用敏感型 API 放在由操作系统控制的受保护 API 列表中。用户必须向请求使用费用敏感型 API 的第三方应用授予明确权限。这些 API 包括:

  • 电话
  • 短信/彩信
  • 网络/数据
  • 应用内结算
  • NFC 访问

Android 4.2 增加了对短信使用的进一步控制。如果应用尝试向使用高级服务的短代码发送短信,可能会导致额外费用,Android 会提供通知。用户可以选择允许应用发送消息还是阻止消息。

SIM 卡访问

第三方应用无法低级别访问 SIM 卡。操作系统处理与 SIM 卡的所有通信,包括访问 SIM 卡内存上的个人信息(联系人)。应用也无法访问 AT 命令,因为这些命令完全由无线电接口层 (RIL) 管理。RIL 没有为这些命令提供高级 API。

个人信息

Android 已将提供对用户数据访问权限的 API 放入受保护 API 集中。在正常使用情况下,Android 设备还将在用户安装的第三方应用中累积用户数据。选择共享此信息的应用可以使用 Android 操作系统权限检查来保护数据免受第三方应用的侵害。

Access to sensitive user data available only through protected
APIs

图 2. 只能通过受保护的 API 访问敏感用户数据

可能包含个人或个人身份信息(例如联系人和日历)的系统内容提供程序已使用明确标识的权限创建。这种粒度为用户清楚地指示了可能提供给应用的信息类型。在安装期间,第三方应用可能会请求访问这些资源的权限。如果授予权限,则可以安装该应用,并且在安装该应用后的任何时间都可以访问请求的数据。

任何收集个人信息的应用默认情况下都将数据限制为仅供特定应用使用。如果应用选择通过 IPC 向其他应用提供数据,则授予访问权限的应用可以对操作系统强制执行的 IPC 机制应用权限。

敏感数据输入设备

Android 设备通常提供敏感数据输入设备,允许应用与周围环境互动,例如摄像头、麦克风或 GPS。对于第三方应用要访问这些设备,必须首先通过使用 Android 操作系统权限由用户明确授予访问权限。安装时,安装程序将提示用户请求按名称访问传感器。

如果应用想要知道用户的位置,则该应用需要获得访问用户位置的权限。安装时,安装程序将提示用户询问应用是否可以访问用户的位置。在任何时候,如果用户不希望任何应用访问他们的位置,则用户可以运行“设置”应用,转到“位置和安全”,然后取消选中“使用无线网络”和“启用 GPS 卫星”。这将禁用用户设备上所有应用的位置服务。

设备元数据

Android 还致力于限制访问并非本质上敏感,但可能间接揭示有关用户特征、用户偏好以及他们使用设备的方式的数据。

默认情况下,应用无权访问操作系统日志、浏览器历史记录、电话号码或硬件/网络标识信息。如果应用在安装时请求访问此信息,安装程序将提示用户询问应用是否可以访问该信息。如果用户不授予访问权限,则不会安装该应用。

证书颁发机构

Android 包含一组已安装的系统证书颁发机构,这些颁发机构在系统范围内受信任。在 Android 7.0 之前,设备制造商可以修改设备上附带的 CA 集。但是,运行 7.0 及更高版本的设备将具有统一的系统 CA 集,因为不再允许设备制造商进行修改。

要作为新的公共 CA 添加到 Android 股票集中,CA 必须完成 Mozilla CA 加入流程,然后针对 Android (https://code.google.com/p/android/issues/entry) 提交功能请求,以便将 CA 添加到 Android 开放源代码项目 (AOSP) 中的股票 Android CA 集中。

仍然有一些特定于设备的 CA,不应包含在 AOSP CA 的核心集中,例如运营商的专用 CA,这些 CA 可能需要安全地访问运营商基础设施的组件,例如短信/彩信网关。建议设备制造商仅在需要信任这些 CA 的组件/应用中包含专用 CA。有关更多详细信息,请参阅网络安全配置

应用签名

代码签名允许开发者识别应用的作者,并在无需创建复杂的接口和权限的情况下更新他们的应用。在 Android 平台上运行的每个应用都必须由开发者签名。尝试在未签名的情况下安装的应用将被 Google Play 或 Android 设备上的软件包安装程序拒绝。

在 Google Play 上,应用签名架起了 Google 与开发者之间的信任桥梁,以及开发者与其应用之间的信任桥梁。开发者知道他们的应用以未修改的形式提供给 Android 设备;并且开发者可以对其应用的行为了解负责。

在 Android 上,应用签名是将应用放入其应用沙盒的第一步。签名的应用证书定义了哪个用户 ID 与哪个应用关联;不同的应用在不同的用户 ID 下运行。应用签名确保一个应用无法访问任何其他应用,除非通过明确定义的 IPC。

当应用(APK 文件)安装到 Android 设备上时,软件包管理器会验证 APK 是否已使用 APK 中包含的证书正确签名。如果证书(或更准确地说,证书中的公钥)与用于对设备上的任何其他 APK 进行签名的密钥匹配,则新的 APK 可以选择在清单中指定它将与其他类似签名的 APK 共享 UID。

应用可以由第三方(OEM、运营商、替代市场)签名或自签名。Android 提供使用自签名证书的代码签名,开发者无需外部帮助或权限即可生成这些证书。应用不必由中央机构签名。Android 目前不对应用证书执行 CA 验证。

应用还可以声明签名保护级别的安全权限,从而仅限制对使用同一密钥签名的应用的访问,同时保持不同的 UID 和应用沙盒。通过共享 UID 功能,允许与共享应用沙盒建立更紧密的关系,其中两个或多个使用同一开发者密钥签名的应用可以在其清单中声明共享 UID。

应用验证

Android 4.2 及更高版本支持应用验证。用户可以选择启用“验证应用”,并在安装前让应用验证程序评估应用。应用验证可以在用户尝试安装可能有害的应用时提醒用户;如果某个应用特别糟糕,它可以阻止安装。

数字版权管理

Android 平台提供了一个可扩展的数字版权管理 (DRM) 框架,让应用可以根据与内容关联的许可约束来管理受版权保护的内容。DRM 框架支持多种 DRM 方案;设备支持哪些 DRM 方案由设备制造商决定。

Android DRM 框架在两个架构层中实现(参见下图):

  • DRM 框架 API,通过 Android 应用框架向应用公开,并为标准应用通过 ART VM 运行。

  • 原生代码 DRM 管理器,它实现 DRM 框架并公开 DRM 插件(代理)的接口,以处理各种 DRM 方案的版权管理和解密

Architecture of Digital Rights Management on Android
platform

图 3. Android 平台上的 DRM 架构