> For the complete documentation index, see [llms.txt](https://jiek.gitbook.io/android-permission/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jiek.gitbook.io/android-permission/ying-yong-an-quan.md).

# 应用安全

## 应用要素

Android为移动设备提供开源平台和应用环境。核心操作系统是基于Linux内核的。Android应用程序通常以Java编程语言编写，并在Dalvik虚拟机中运行。但是，应用程序也可以用本机代码编写。应用程序是从具有.apk文件扩展名的单个文件安装的。

主要的Android应用程序构建块是：

AndroidManifest.xml：AndroidManifest.xml 文件是控制文件，它告诉系统应用程序中的所有顶级组件（具体是活动，服务，广播接收器和内容提供者）应该如何处理。这也指定了哪些权限是必需的。 活动： 一般来说，活动是单个用户关注任务的代码。它通常包括向用户显示一个UI，但它不必 - 一些活动从不显示UI。通常，应用程序的“活动”之一是应用程序的入口点。 服务：服务 是在后台运行的代码体。它可以在自己的进程中运行，也可以在另一个应用程序的进程的上下文中运行。其他组件“绑定”到服务，并通过远程过程调用调用方法。服务的一个例子是媒体播放器：即使用户退出媒体选择UI，用户可能仍然希望音乐继续播放。即使UI完成，服务也可以保持音乐的正常运行。 广播接收器：BroadcastReceiver 是当被称为意图的IPC机制 由操作系统或其他应用程序发出时被实例化的对象。例如，应用程序可以注册低电池消息的接收器，并根据该信息改变其行为。

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

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

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

这些受保护的API包括：

* 相机功能
* 位置数据（GPS）
* 蓝牙功能
* 电话功能
* 短信/彩信功能
* 网络/数据连接

这些资源只能通过操作系统访问。为了利用设备上受保护的API，应用程序必须定义其清单中需要的功能。准备安装应用程序时，系统将向用户显示一个对话框，指示所请求的权限，并询问是否继续安装。如果用户继续安装，则系统接受用户已经授予所有所请求的权限。用户无法授予或拒绝个人权限 - 用户必须将所有请求的权限授予或拒绝为块。

一旦被授权，只要安装了这些权限，这些权限就被应用到应用程序。为了避免用户混淆，系统不会再次通知用户授予应用程序的权限，并且包含在核心操作系统中或由OEM捆绑的应用程序不会向用户请求权限。如果应用程序被卸载，则会删除权限，因此后续的重新安装将再次显示权限。

在设备设置中，用户可以查看先前安装的应用程序的权限。用户还可以在选择时全局关闭某些功能，例如禁用GPS，收音机或Wi-Fi。

如果应用程序尝试使用尚未在应用程序的清单中声明的​​受保护功能，则权限失败通常会导致将安全异常返回到应用程序。受保护的API权限检查在最低级别执行，以防止规避。图2中显示了在请求访问受保护的API时安装应用程序时的用户消息传递示例。

系统默认权限在<https://developer.android.com/reference/android/Manifest.permission.html> 中有所描述。应用程序可以声明其自己的权限以供其他应用使用。此类权限未列在上述位置。

当定义权限时，protectLevel属性告诉系统如何向用户通知需要许可的应用，或被允许持有许可的用户。有关创建和使用应用程序特定权限的详细信息，请参见<https://developer.android.com/guide/topics/security/security.html。>

有一些设备功能，例如发送SMS广播意图的能力，这些功能不适用于第三方应用程序，但可能由OEM预安装的应用程序使用。这些权限使用signatureOrSystem权限。

## 用户如何理解第三方应用程序

当用户与第三方应用程序进行交互时，Android会努力向用户清楚，并向用户通报这些应用程序的功能。在安装任何应用程序之前，用户将显示有关应用程序请求的不同权限的明确消息。安装后，系统不会再次提示用户确认任何权限。

在安装时间之前立即显示权限有很多原因。这是用户正在积极审查有关应用程序，开发人员和功能的信息，以确定它是否符合他们的需求和期望。同样重要的是，他们尚未对应用程序做出精神或财务承诺，并且可以轻松地将应用程序与其他替代应用程序进行比较。

一些其他平台使用不同的用户通知方法，在每个会话开始时或应用程序正在使用时请求许可。Android的愿景是让用户随意切换应用程序。每次提供确认将减慢用户速度，并阻止Android提供出色的用户体验。让用户在安装时查看权限，如果用户感到不舒服，可以让用户无需安装应用程序。

此外，许多用户界面研究已经表明，过度提示用户导致用户开始向所示的任何对话表示“OK”。Android的安全目标之一是有效地向用户传达重要的安全信息，无法使用用户将被忽略的对话框来完成。通过提供重要信息一次，只有重要的是，用户更有可能考虑他们所同意的内容。

某些平台选择不显示有关应用程序功能的任何信息。这种方法可以防止用户轻松理解和讨论应用程序功能。尽管所有用户不可能始终作出充分信息的决定，但Android权限模型可使各种用户的应用程序信息轻松访问。例如，意外的权限请求可以提示更复杂的用户询问有关应用程序功能的关键问题，并在Google Play等所有用户可见的地方分享他们的疑虑。

| 应用安装权限 - Google地图                                                                                                                                                                                                         | 已安装应用程序的权限 - Gmail                                                                                                                                                                                                         |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ![应用安装权限 -  Google地图](https://3601807489-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M6gnm_FCMmpk-ca9XwA%2Fsync%2F87f7516ad2f93187810ce7deec5b731f2fcdc845.png?generation=1588815962177901\&alt=media) | ![已安装应用程序的权限 -  Gmail](https://3601807489-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M6gnm_FCMmpk-ca9XwA%2Fsync%2Faef5aebbd79c70e7667d247375e47c7808d40de9.png?generation=1588815961849129\&alt=media) |

图1.显示应用程序的权限

## 进程间通信

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

Android还提供了新的IPC机制：

Binder：一种基于轻量级的基于能力的远程过程调用机制，用于在执行进程内和跨进程调用时实现高性能。Binder是使用自定义的Linux驱动程序实现的。请参阅<https://developer.android.com/reference/android/os/Binder.html。> 服务：服务（上面讨论）可以提供使用binder直接访问的界面。 意图：意图是一个简单的消息对象，代表一个“意图”来做某事。例如，如果您的应用程序想要显示一个网页，它会通过创建Intent实例来表示其“Intent”来查看URL，并将其交给系统。系统找到一些其他代码（在这种情况下，浏览器），知道如何处理该Intent并运行它。意图也可以用于在系统范围内广播有趣的事件（如通知）。请参阅 <https://developer.android.com/reference/android/content/Intent.html。> ContentProviders：ContentProvider是提供对设备上数据的访问的数据仓库; 经典的例子是ContentProvider，用于访问用户的联系人列表。应用程序可以访问其他应用程序通过ContentProvider公开的数据，并且应用程序还可以定义自己的ContentProviders来公开其自己的数据。请参阅<https://developer.android.com/reference/android/content/ContentProvider.html。> 虽然可以使用其他机制（如网络套接字或世界可写文件）实现IPC，但这些是推荐的Android IPC框架。将鼓励Android开发人员使用最佳做法来保护用户的数据，避免引入安全漏洞。

## 成本敏感的API

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

电话 SMS / MMS 网络/数据 应用内结算 NFC接入 Android 4.2增加了对使用SMS的进一步控制。如果应用程序尝试将短信发送到使用可能导致额外费用的高级服务的短代码，Android将会提供通知。用户可以选择是否允许应用程序发送消息或阻止它。

## SIM卡访问

对于第三方应用，低级别的SIM卡访问不可用。操作系统处理与SIM卡的所有通信，包括访问SIM卡存储器上的个人信息（联系人）。应用程序也不能访问AT命令，因为它们由无线电接口层（RIL）专门管理。RIL不提供这些命令的高级API。

## 个人信息

Android已经将API提供给用户数据访问的一组受保护的API。通常情况下，Android设备也会在用户安装的第三方应用中累积用户数据。选择共享此信息的应用程序可以使用Android操作系统权限检查来保护来自第三方应用程序的数据。

访问仅通过受保护的API可用的敏感用户数据 ![](https://3601807489-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M6gnm_FCMmpk-ca9XwA%2Fsync%2F0dc2e02dd2249df3d7bbe99f66c89d932161d98e.png?generation=1588815961630132\&alt=media) 图2.访问敏感的用户数据只能通过受保护的API

可能包含个人或个人身份信息（如联系人和日历）的系统内容提供商已创建具有明确标识的权限。这种粒度为用户提供了可能提供给应用程序的信息类型的清晰指示。在安装过程中，第三方应用程序可能会要求访问这些资源的权限。如果授予许可，则可以安装该应用程序，并且可以随时安装所请求的数据。

收集个人信息的任何应用程序默认情况下只会将该数据限制在特定应用程序中。如果应用程序选择通过IPC将数据提供给其他应用程序，则授予访问权的应用程序可以对操作系统强制实施的IPC机制应用权限。

## 敏感数据输入设备

Android设备经常提供敏感数据输入设备，允许应用与周边环境（如摄像机，麦克风或GPS）进行交互。对于访问这些设备的第三方应用程序，必须首先明确提供用户通过使用Android操作系统权限进行访问。安装后，安装程序将提示用户按名称请求传感器的许可。

如果应用程序想知道用户的位置，应用程序需要访问用户位置的权限。安装后，安装程序将提示用户询问应用程序是否可以访问用户的位置。在任何时间，如果用户不希望任何应用访问其位置，则用户可以运行“设置”应用程序，进入“位置和安全”，并取消选中“使用无线网络”和“启用GPS卫星” 。这将禁用用户设备上所有应用程序的基于位置的服务。

## 设备元数据

Android还努力限制对本身敏感的数据的访问，但可以间接地显示用户的特征，用户偏好以及他们使用设备的方式。

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

## 证书机关

Android包括一组安装的系统证书颁发机构，这是系统可信的。在Android 7.0之前，设备制造商可以修改其设备上发货的一组CA。然而，运行7.0及以上的设备将具有一套统一的系统CA，因为不再允许设备制造商的修改。

要作为新的公共CA添加到Android股票集，CA必须完成Mozilla CA Inclusion Process，然后向Android提交功能请求（<https://code.google.com/p/android/issues/entry）> 将CA添加到Android CA设置在Android开源项目 （AOSP）中的股票。

仍然有CA是设备特定的，不应该包含在AOSP CA的核心集合中，例如可能需要安全地访问运营商基础架构组件（如SMS / MMS网关）的运营商的私有CA。鼓励设备制造商将私有CA仅包含在需要信任这些CA的组件/应用程序中。有关详细信息， 请参阅网络安全配置

## 申请签名

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

在Google Play上，应用程式签名使得Google与开发人员的信任和开发人员对应用程序的信任相辅相成。开发人员知道他们的应用程序是未经修改的Android设备; 开发人员可以对其应用程序的行为负责。

在Android上，应用程序签名是将应用程序置于其应用程序沙箱中的第一步。签名的应用程序证书定义哪个用户标识与哪个应用程序相关联？不同的应用程序运行在不同的用户ID 应用程序签名确保一个应用程序不能访问任何其他应用程序，除非通过明确的IPC。

当应用程序（APK文件）安装到Android设备上时，软件包管理器会验证APK已使用该APK中包含的证书进行了正确的签名。如果证书（或更准确地说，证书中的公钥）与用于在设备上签署任何其他APK的密钥相匹配，则新的APK可以选择在清单中指定它将与另一个类似地共享一个UID分配的APK。

应用程序可以由第三方（OEM，运营商，替代市场）或自签名签署。Android使用自签名证书提供代码签名，开发人员可以在没有外部帮助或许可的情况下生成代码 申请不必由中央机关签字。Android目前不对应用程序证书执行CA验证。

应用程序还能够在签名保护级别声明安全权限，限制仅访问使用相同密钥签名的应用程序，同时保留不同的UID和应用程序沙箱。通过共享的UID功能允许与共享的应用程序沙箱更密切的关系，其中两个或多个使用相同开发人员密钥签名的应用程序可以在其清单中声明共享的UID。

## 应用验证

Android 4.2及更高版本支持应用程序验证。用户可以选择启用“验证应用程序”，并在安装之前由应用程序验证程序进行评估，如果应用程序尝试安装可能有害的应用程序，应用程序验证可以提醒用户;如果应用程序特别糟糕，则可能会阻止安装。

## 数字版权管理

Android平台提供了一个可扩展的DRM框架，允许应用程序根据与内容相关联的许可证约束来管理受权限保护的内容。DRM框架支持许多DRM方案; 设备支持哪些DRM方案留给设备制造商。

的Android的DRM框架是在两个建筑层中实现（参见下图）：

DRM框架API，通过Android应用程序框架暴露于应用程序，并通过Dalvik VM运行标准应用程序。 本地代码DRM管理器，其实现DRM框架并且公开用于DRM​​插件（代理）的接口来处理各种DRM方案的权限管理和解密 Android平台上数字版权管理架构

![](https://3601807489-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M6gnm_FCMmpk-ca9XwA%2Fsync%2Fe7ef15807326c359f336ffeb17034c5216c6dcc6.png?generation=1588815962071218\&alt=media) 图3. Android平台上数字版权管理的架构

references: <https://source.android.com/security/overview/app-security>
