应用安全最佳实践

本节包含确保 Android 设备上应用安全性的建议。

源代码审查

源代码审查可以检测到广泛的安全问题,包括本文档中确定的问题。Android 强烈建议进行手动和自动源代码审查。

  • 在进行审查时,请遵循全面的安全指南,以确保覆盖范围。利用相关的内部或外部标准,以确保一致且完整的审查。
  • 对所有使用 Android SDK 的应用代码运行代码检查工具(如 Android Studio 代码检查工具),并纠正所有已识别的问题。
  • 使用自动化工具分析原生代码,该工具可以检测内存管理问题,例如缓冲区溢出和差一错误。
  • Android 构建系统支持许多 LLVM 清理器,例如 AddressSanitizerUndefinedBehaviorSanitizer,它们可用于运行时分析与内存相关的问题。结合 Android 通过 libFuzzer 支持的模糊测试,清理器可以发现需要进一步调查的异常边缘情况。
  • 知识渊博的安全评估人员应审查更高风险的代码,例如加密、支付处理和 PII 处理。

自动化测试

自动化测试可以帮助检测到广泛的安全问题,并且应该定期执行。

  • 在整个开发过程中定期运行最新版本的 CTS,以尽早发现问题并缩短纠正时间。Android 在我们的自动化构建过程中使用 CTS 作为持续集成的一部分,该过程每天构建多次。
  • 自动化接口安全测试,包括使用格式错误输入进行测试(模糊测试)。Android 的构建系统支持使用 libFuzzer 编写模糊测试。

漏洞扫描

漏洞扫描可以帮助确保预装应用没有已知的安全漏洞。高级检测可以减少解决这些漏洞所需的时间和成本,并防止用户和设备面临风险。

  • 使用行业认可的应用漏洞扫描工具扫描所有预装应用,并解决检测到的漏洞。

潜在有害应用

务必确保您设备上预装的应用不是潜在有害应用 (PHA)。您对设备上包含的所有应用的行为了解并负责。在设备发布之前,请扫描所有预加载的应用是否存在漏洞。

有关 PHA 以及 Google 如何在 Play 商店中打击 PHA 的更多信息,请参阅 Google Play Protect 开发者文档

应用安装和权限

预装应用的过度权限可能会造成安全风险。将预装应用的权限限制为最低必要权限,并确保它们无法访问不必要的权限或特权。AndroidManifest.xml 中描述了应用权限。

  • 不要向预装应用授予不必要的权限或特权。彻底审查具有系统特权的应用,因为它们可能具有非常敏感的权限。
  • 确保请求的所有权限都与特定应用的功能相关且必要。
  • 确保所有使用 INSTALL_PACKAGES 权限的预装应用都向用户披露。
  • 确保开发人员在合同中承诺不以 UID 0 身份安装任何应用。
  • 评估通过开发人员网络安装的所有应用的清单中声明的权限。
  • 确保开发人员在合同中承诺在使用 Google Safe Browsing API 扫描自动更新程序和安装程序应用的所有下载网址后,再将应用提供给设备。

应用签名

应用签名在设备安全中起着重要作用,并用于权限检查和软件更新。在选择用于签署应用的密钥时,重要的是要考虑应用是仅在单个设备上可用还是在多个设备上通用。

  • 确保应用未使用公开密钥(例如 AOSP 开发者密钥)进行签名。
  • 确保用于签署应用的密钥以符合行业标准实践的方式进行管理,以处理敏感密钥,包括提供有限的、可审核的访问权限的硬件安全模块 (HSM)。
  • 确保应用未使用平台密钥进行签名。这样做会使应用可以访问平台签名权限,这些权限非常强大,仅供操作系统组件使用。系统应用应使用特许权限。
  • 确保具有相同软件包名称的应用未使用不同的密钥进行签名。这种情况通常发生在为不同设备创建应用时,尤其是在使用平台密钥时。如果应用与设备无关,请在不同设备上使用相同的密钥。如果应用是特定于设备的,请为每个设备和密钥创建唯一的软件包名称。

隔离应用和进程

正确使用 Android 沙箱模型可在应用和进程周围提供额外的安全性。

隔离 root 进程

Root 进程是特权提升攻击的最常见目标;减少 root 进程的数量可以降低特权提升的风险。

  • 确保设备以 root 身份运行最少的必要代码。在可能的情况下,使用常规 Android 进程而不是 root 进程。如果进程必须在设备上以 root 身份运行,请在 AOSP 功能请求中记录该进程,以便可以公开审查。
  • 在可能的情况下,root 代码应与不受信任的数据隔离,并通过进程间通信 (IPC) 进行访问。例如,将 root 功能减少到可通过 Binder 访问的小型服务,并使用签名权限将该服务公开给具有低权限或无权限处理网络流量的应用。
  • Root 进程不得侦听网络套接字。
  • Root 进程不得包含通用运行时,例如 Java VM。

隔离系统应用

通常,预装应用不应使用共享系统唯一标识符 (UID) 运行。如果应用需要使用系统或其他特许服务(例如,电话)的共享 UID,则该应用不应导出任何可供用户安装的第三方应用访问的服务、广播接收器或内容提供程序。

  • 确保设备以系统身份运行最少的必要代码。在可能的情况下,使用具有自己 UID 的 Android 进程,而不是重用系统 UID。
  • 在可能的情况下,系统代码应与不受信任的数据隔离,并且仅向其他受信任的进程公开 IPC。
  • 系统进程不得侦听网络套接字。这是 CTS 要求。

隔离进程

Android 应用沙箱为应用提供了与系统上其他进程(包括 root 进程和调试程序)隔离的预期。除非应用和用户明确启用了调试,否则任何应用都不应违反该预期。

  • 除非使用记录在案的 Android 调试方法,否则确保 root 进程不访问各个应用数据文件夹中的数据。
  • 除非使用记录在案的 Android 调试方法,否则确保 root 进程不访问应用的内存。
  • 确保设备不包含任何访问其他应用或进程的数据或内存的应用。