Play Integrity API:应用访问风险抢先体验计划 (EAP)

Play Integrity API 可用作反滥用策略的一部分,以保护您的应用和用户。应用访问风险是 Play Integrity API 中的一种信号,可帮助您评估设备上的其他应用是否可以在应用运行时查看和截取屏幕、使用无障碍功能权限访问应用,或在应用中显示叠加层。经过验证的无障碍应用会自动从这些判定结果中排除。应用的后端服务器可以决定后续步骤(例如向用户发出警告),以帮助您降低攻击和滥用风险。应用访问风险信号有助于开发者保护其应用,同时保护用户隐私,因为发出请求的应用无法获取已安装应用的身份,并且判定结果也不会与用户或设备标识符相关联。

应用访问风险信号是什么?

Play Integrity API 提供了一系列完整性信号,用于帮助应用和游戏开发者检测可能存在风险的欺诈性互动和服务器请求。参与这项抢先体验计划的开发者可将应用访问风险信号添加到其 API 响应,该响应已经包含设备完整性、应用完整性和账号许可判定结果。如果其他判定结果没有问题,应用访问风险信号可以帮助您检测设备上的其他应用是否可以用于访问或控制您的应用。应用访问风险判定结果包含一个或多个响应,代表设备上安装或运行的不同类别的应用。

安装来源 响应 说明
Play 应用或系统应用 KNOWN_INSTALLED 应用由 Google Play 安装,或由设备制造商预加载到系统分区。
KNOWN_CAPTURING Play 应用或系统应用正在运行,可用于读取或捕获发出请求的应用(例如屏幕录制应用)的输入和输出内容。
KNOWN_CONTROLLING Play 应用或系统应用正在运行,可用于控制设备以及发出请求的应用(例如远程控制应用)的输入和输出内容。
KNOWN_OVERLAYS Play 应用或系统应用正在运行,可能在发出请求的应用上显示叠加层。
其他扩展应用 UNKNOWN_INSTALLED 安装了其他应用,这些应用并非由 Google Play 安装或由设备制造商预加载到系统分区。
UNKNOWN_CAPTURING 其他应用正在运行,可用于读取或捕获发出请求的应用(如屏幕录制应用)的输入和输出内容。
UNKNOWN_CONTROLLING 其他应用正在运行,可用于控制设备以及发出请求的应用(例如远程控制应用)的输入和输出内容。
UNKNOWN_OVERLAYS 其他应用正在运行,可能在发出请求的应用上显示叠加层。

应用访问风险信号何时推出?

Play Integrity API 传统请求中的应用访问风险信号会作为抢先体验计划提供给特定 Play 合作伙伴。在抢先体验计划期间,我们可能会添加额外的功能和改进,以增强应用访问风险信号提供的保护力度。应用访问风险信号预计会在 2024 年扩大覆盖范围。

应用访问风险信号注意事项

使用应用访问风险信号时,请注意以下事项:

  • 应用访问风险信号要求设备搭载 Android 6(API 级别 23)或更高版本。
  • 应用访问风险信号要求设备上已安装最新版 Google Play 商店和 Google Play 服务。
  • 此信号发布后,对于传统请求,系统将仅评估是否有应用访问风险;对于所有标准请求,系统最初只会返回未评估的判定结果。我们计划日后让应用访问风险信号也适用于标准请求。
  • 最初只会针对手机、平板电脑和可折叠设备评估应用访问风险。
  • 应用访问风险信号会自动排除已通过增强型 Google Play 无障碍功能审核且已经验证的无障碍服务(无论设备上的安装来源如何)。“已排除”意味着,设备上运行且经过验证的无障碍服务不会在应用访问风险判定结果中返回捕获、控制或叠加层响应。
  • 仅限游戏:用户账号必须获得 Play 许可才能使用应用访问风险信号,否则判定结果将不予评估。

将应用访问风险信号作为防滥用策略的一部分

将应用访问风险信号与其他信号一起使用时,让其作为整体反滥用策略的一部分,而不是作为唯一的反滥用机制,这时此信号的效果最佳。在您的应用中,请结合使用此信号、其他 Play Integrity API 信号以及其他适当的安全性最佳实践

收集遥测数据并了解受众群体,再采取行动

在根据应用访问风险信号或其他 Play Integrity API 判定结果更改功能之前,您可以先实现该 API,但不进行违规处置,以了解现有受众群体的当前状况。了解当前安装群体返回的判定结果后,就可以预估计划采取的任何违规处置的影响,并相应地调整反滥用策略。

对访问高价值或敏感功能的风险流量进行查验

确定应用或游戏中的高价值或敏感操作,以通过 Play Integrity API 进行保护,而不是直接拒绝访问。在可能的情况下,请先对存在风险的流量进行查验,然后再允许执行高价值操作。例如,当应用访问风险信号表明一款可截屏的应用正在运行时,请要求用户停用或卸载可截屏的应用,然后才允许用户继续使用您要保护的功能。

适时请求完整性判定

您应尽可能在要防止被访问的操作或服务器请求发生时,请求获取应用访问风险判定结果,以防诈骗者绕过应用执行的完整性检查。

采用分层强制执行策略

应用访问风险信号适用于 Android 6(API 级别 23)或更高版本,但在新款设备(尤其是 Android 10 [API 级别 29] 及更高版本)上更加可靠。作为分层强制执行策略的一部分,请考虑将搭载较新版 Android 的设备视为比搭载旧版的设备更可信。

规划用户支持

尽可能向用户提供有用的错误消息,并告诉用户可以采取什么措施来解决问题,例如重试、启用互联网连接或检查 Google Play 商店应用是否为最新版本。

在应用中满足合法的无障碍功能需求

确保您的应用最大限度提供无障碍体验。用户有合法理由在设备上使用无障碍功能,因此应用访问风险信号会自动排除 Google Play 已知且经过验证的无障碍服务。

遵循针对 Play Integrity API 的现有建议

除上述做法外,请阅读 Play Integrity API 的安全注意事项

抢先体验应用访问风险信号

按照以下步骤开始使用应用访问风险信号。

第 1 步:查看以下重要注意事项

  • 使用应用访问风险信号,即表示您同意《Google Play 开发者分发协议》和《Play Integrity API 服务条款》中的条款。
  • 为便于满足 Google Play“数据安全”部分中的要求,您可以使用所提供的关于 Play Integrity API 如何处理数据的信息。
  • 我们希望参与抢先体验计划的开发者评估应用访问风险信号,并向 Google Play 提供有关其评估结果的反馈和信息。
  • 在抢先体验计划期间,应用访问风险信号可能会发生变化。

第 2 步:申请加入应用访问风险信号 EAP

如果您的帐号获选抢先体验应用访问风险信号,您将在 Play 管理中心的 Integrity API 页面上看到一个新选项,用于将应用访问风险信号包含到 Play Integrity API 响应中,如第 3 步中所述。

如果您还无法使用应用访问风险信号,但希望申请加入抢先体验计划,可以填写此表单。获准加入抢先体验计划的开发者将获得在 Google Play 管理中心内启用这种信号的权限。

第 3 步:通过 Google Play 管理中心在 Integrity API 响应中启用应用访问风险信号

获准加入抢先体验计划后,您会在 Play 管理中心的“Integrity API”页面上看到一个用于将应用访问风险信号添加至 Play Integrity API 响应的新选项。准备就绪后,即可在 Play 管理中心内开启应用访问风险信号:

  1. 登录 Play 管理中心。
  2. 选择要使用应用访问风险信号的应用。
  3. 在左侧菜单的发布部分,进入应用完整性
  4. 点击 Play Integrity API 旁边的设置
  5. 在该页面的响应部分,点击更改响应
  6. 开启应用访问风险信号
  7. 点击保存更改

当您开启或关闭应用访问风险信号时,系统会删除您在 Play 管理中心设置的任何 Play Integrity API 测试响应,您将需要重新创建这些响应。

第 4 步:将 Integrity API 传统请求集成到您的应用及其后端服务器

如果尚未这样做,请按照文档中的说明设置 Play Integrity API 传统请求,并将此类请求集成到您的应用及其后端服务器。系统最初只会针对传统请求评估应用访问风险。在添加相关支持之前,系统不会针对任何标准请求评估应用访问风险。

第 5 步:使用新的应用访问风险判定结果

启用后,Play Integrity API 载荷中的 environmentDetails 字段将包含新的应用访问风险判定结果。

{
  requestDetails: { ... }
  appIntegrity: { ... }
  deviceIntegrity: { ... }
  accountDetails: { ... }
  environmentDetails: {
      appAccessRiskVerdict: {
          // This field contains one or more responses, for example the following.
          appsDetected: ["KNOWN_INSTALLED", "UNKNOWN_INSTALLED", "UNKNOWN_CAPTURING"]
      }
 }
}

如果已评估应用访问风险,则 appAccessRiskVerdict 将包含 appsDetected 字段以及一个或多个响应。根据检测到的应用的安装来源,这些响应分为以下两组之一:

  • Play 应用或系统应用:通过 Google Play 安装的应用或由设备制造商在设备的系统分区中预加载的应用(用 FLAG_SYSTEM 标识)。对此类应用的响应以 KNOWN_ 为前缀。

  • 其他应用:非通过 Google Play 安装的应用。此字段会排除设备制造商在系统分区中预加载的应用。这类应用的响应以 UNKNOWN_ 为前缀。

可返回以下响应:

KNOWN_INSTALLEDUNKNOWN_INSTALLED
表明有与相应安装来源相匹配的已安装应用。
KNOWN_CAPTURINGUNKNOWN_CAPTURING
表明有运行中的应用启用了相应权限,可用于在您的应用运行时查看屏幕。这会排除设备上运行的任何 Google Play 已知的经验证无障碍服务。
KNOWN_CONTROLLINGUNKNOWN_CONTROLLING
表明有运行中的应用启用了相应权限,可用于控制设备并直接控制输入到您的应用中的内容,还可用于捕获应用的输入和输出。这不包括 Google Play 已知在设备上运行的所有经过验证的无障碍服务。
KNOWN_OVERLAYSUNKNOWN_OVERLAYS
表明有运行中的应用启用了相应权限,可用于在您的应用上显示叠加层。这不包括 Google Play 已知在设备上运行的所有经过验证的无障碍服务。
EMPTY(空白值)

如果未达成必要条件,系统将不会评估应用访问风险。在这种情况下,appAccessRiskVerdict 字段为空。导致这种情况的原因可能有多种,其中包括以下原因:

  • 设备不够可信。
  • 设备上安装的应用是 Google Play 无法识别的版本。
  • 设备上的 Google Play 商店版本已过时。
  • 仅限游戏:用户账号不具备相应游戏的 Play 许可。

下表列举了一些示例来说明判定结果及其含义(下表并未列出所有可能的结果):

应用访问风险判定结果响应示例 解读
appsDetected:
["KNOWN_INSTALLED"]
只有 Google Play 可识别的已安装应用或设备制造商在系统分区中预加载的应用。
没有任何正在运行的应用会导致捕获、控制或叠加判定结果。
appsDetected:
["KNOWN_INSTALLED",
"UNKNOWN_INSTALLED",
"UNKNOWN_CAPTURING"]
表明有通过 Google Play 安装的应用或设备制造商在系统分区中预加载的应用。
有其他应用正在运行且已启用,可用于查看屏幕或捕获其他输入和输出内容。
appsDetected:
["KNOWN_INSTALLED",
"KNOWN_CAPTURING",
"UNKNOWN_INSTALLED",
"UNKNOWN_CONTROLLING"]
当前运行的 Play 或系统已启用相应权限,可用于查看屏幕或捕获其他输入和输出内容。
表明还有其他应用在运行,且应用已启用相应权限并可用于控制设备并直接控制输入到您的应用中的内容。
appAccessRiskVerdict: {} 由于未达成必要条件,系统未能评估应用访问风险。例如,设备不够可信。

您可根据自己的风险级别来决定接受哪些判定结果组合以执行后续操作,以及您要针对哪些判定结果采取措施。以下代码段是一个示例,展示了如何验证没有正在运行且可截屏或控制您的应用的应用:

Kotlin

val environmentDetails =
    JSONObject(payload).getJSONObject("environmentDetails")
val appAccessRiskVerdict =
    environmentDetails.getJSONObject("appAccessRiskVerdict")

if (appAccessRiskVerdict.has("appsDetected")) {
    val appsDetected = appAccessRiskVerdict.getJSONArray("appsDetected").toString()
    if (!appsDetected.contains("CAPTURING") && !appsDetected.contains("CONTROLLING")) {
        // Looks good!
    }
}

Java

JSONObject environmentDetails =
    new JSONObject(payload).getJSONObject("environmentDetails");
JSONObject appAccessRiskVerdict =
    environmentDetails.getJSONObject("appAccessRiskVerdict");

if (appAccessRiskVerdict.has("appsDetected")) {
    String appsDetected = appAccessRiskVerdict.getJSONArray("appsDetected").toString()
    if (!appsDetected.contains("CAPTURING") && !appsDetected.contains("CONTROLLING")) {
        // Looks good!
    }
}

第 6 步:向 Google Play 提供抢先体验反馈

抢先体验计划的参与者应报告问题并提供反馈。如需报告有关应用访问风险或完整性判定的技术问题,请创建问题并提供所需的全部信息。您还可发送电子邮件至 integrity-api-eap@google.com,提供有关应用访问风险的反馈。

从旧版应用访问风险判定结果格式迁移

在 2024 年 4 月底之前加入应用访问风险 EAP 的应用将暂时在应用访问风险判定结果中收到三个字段,即第 5 步中所述的 appsDetected 字段,以及两个已废弃的字段 playOrSystemAppsotherApps

appAccessRiskVerdict: {
    // This field can be INSTALLED, CAPTURING, CONTROLLING or UNEVALUATED.
    playOrSystemApps: "INSTALLED"
    // This field can be NOT_INSTALLED, INSTALLED, CAPTURING, CONTROLLING or UNEVALUATED.
    otherApps: "CAPTURING"
    // This field contains one or more of the eight possible responses.
    appsDetected: ["KNOWN_INSTALLED", "UNKNOWN_INSTALLED", "UNKNOWN_CAPTURING"]
}

如果未评估应用访问风险信号,以下应用将收到判定结果:

appAccessRiskVerdict: {
    playOrSystemApps: "UNEVALUATED"
    otherApps: "UNEVALUATED"
}

为帮助您从使用 playOrSystemAppsotherApps 字段改为使用新字段 appsDetected,下表概述了这些字段之间的关系。

旧字段名称 旧字段值 对应的 appsDetected 响应
playOrSystemApps INSTALLED KNOWN_INSTALLED
CAPTURING KNOWN_INSTALLED, KNOWN_CAPTURING
CONTROLLING KNOWN_INSTALLED, KNOWN_CONTROLLING
如果除了控制 Play 应用或系统应用之外,捕获 Play 应用或系统应用还在运行,则还可能会返回响应 KNOWN_CAPTURING
UNEVALUATED 判定结果中未包含 appsDetected
otherApps NOT_INSTALLED 系统不会返回任何 UNKNOWN_ 响应。
INSTALLED UNKNOWN_INSTALLED
CAPTURING UNKNOWN_INSTALLED, UNKNOWN_CAPTURING
CONTROLLING UNKNOWN_INSTALLED, UNKNOWN_CONTROLLING
如果捕获的其他应用除了控制其他应用之外正在运行,还可能会返回响应 UNKNOWN_CAPTURING
UNEVALUATED 判定结果中未包含 appsDetected

请注意,应用访问风险信号之前不会检测到正在运行且可能会显示叠加层的应用。因此,叠加层仅会在新的 appsDetected 响应中标记,而不会在 playOrSystemAppsotherApps 字段中标记。

在移除 playOrSystemAppsotherApps 字段之前,我们会与受影响应用的开发者联系。

详细了解 Play 完整性和签名服务,这可帮助您确保用户以您预期的方式来体验应用和游戏。