Google IAP returns 空头购买代币验证

Google IAP returns short purchase token for verification

我已经实施了服务器端验证Google IAP 购买令牌。我的移动应用程序将此令牌发送给我,因为它是从 Google 获取的。

常规令牌看起来像

minodojglppganfbiedlabed.AO-J1OyNtpooSraUdtKlZ_9gYs0o20ZF_0ryTNACmvaaaG5EwPX0hPruUdGbE3XejoXYCYzJA2xjjAxrDLFhmu9WC4fvTDNL-RDXCWjlHKpzLOigxCr1QhScXR8uXtX8R94iV6MmMHqD

但有时我会收到这样的短令牌

korpimulxmslxissnschtkdb

当我通过 Google Play Developer API: https://www.googleapis.com/androidpublisher/v2/applications/packageName/purchases/subscriptions/subscriptionId/tokens/token 验证此令牌时,对于短令牌,我收到 404 错误。

问题出在哪里?这个短代币有没有可能代表真实的交易?

你最后解决了吗?

我可以建议的唯一原因是令牌是由应用程序内购买 Cracker 生成的,例如可以安装在 root 设备上的 "Freedom in-app purchases for Android" 应用程序。

我很想知道您是否收到了您自己进行的任何测试购买的短令牌。

令牌是假的另一个迹象是您在应用程序上购买后获得的 orderId 的格式。

如果它不符合 Administering In-app Billing 文档中指示的格式,那么它很可能是欺诈性购买。

我一直在我们的应用程序中收到这些相同的无效令牌,有一段时间不知道原因。令牌有多种格式,包括 24 个字母字符(例如 glvnqnpjqslcagyimgxeuybk)、15 个数字(例如 781871156762279see this question), and even tokens of proper length that have a slightly different format from valid ones (eg. xdavcuvdnniwwrhwemleqjdz.rSQozm... see this question)。

这些是我从 in-app billing API 收到的关于这些不同标记的错误消息:

  • "code": 404, "message": "The purchase token was not found."
  • "code": 400, "message": "Invalid Value"
  • "code": 400, "message": "Your request is invalid for this subscription purchase."

Marc Greenstock 给了我一个尝试重现问题的想法。

进行欺诈性购买

我在 root 设备上测试了两个声称可以破解应用内购买的应用:FreedomLucky Patcher。前者不起作用:虽然它检测到我们的应用程序可以进行购买,但当我尝试制作假的时,它告诉我 "this app's purchases cannot be faked"。然而,后一个 did 在经过一些摆弄后工作,并生成了一个与问题完全相同的空头购买令牌。当我尝试通过 in-app billing API 验证令牌时,我收到了与之前完全相同的 "invalid token" 消息。

我还开始使用 this method 记录生成无效令牌的设备的根状态。虽然这不能证明任何事情,但 几乎所有 无效令牌都源自已获得 root 权限的设备这一事实让我怀疑是在作弊。

攻击

我相信攻击的原理如下。有知道的朋友请多多指教!

  • 用户在获得 root 权限的设备上安装了一款声称可以免费进行应用内购买的黑客应用
  • 黑客应用程序要么在设备上修补合法的应用程序内结算服务,要么模拟它
  • 在购买流程中,黑客应用拦截了用于合法服务的 purchase Intent
  • 黑客应用程序以与合法服务相同的方式处理购买请求并生成响应,但购买请求永远不会到达 Google 的服务器
  • 依赖 local 令牌验证的应用程序将请求从应用程序内结算服务进行购买。此请求也被黑客应用拦截,声称购买有效
  • 依赖于 服务器 令牌验证的应用程序将购买令牌发送到服务器,服务器调用从未见过令牌的 in-app billing API,因此 returns 一个 "invalid token" 响应

缓解

  • 完全依赖应用内结算服务的应用易受攻击purchasepurchase validation 请求都被同一个欺诈应用截获。没有防御。
  • 依赖服务器后端的应用程序应将购买令牌发送到后端以通过发布者进行验证API。这些应用程序必须不能在后端验证并returns对应用程序的肯定结果之前将购买的用户记入贷方。后端可能应该遵循 security recommendations 进行应用内结算。这些应用程序可能更安全地防止欺诈性购买,尽管它们会产生大量无效购买。
  • 我认为依赖令牌的长度或格式、订单 ID 或其他数据来确定购买的有效性是不安全的。这些令牌可能只是格式错误,因为它们模拟了以前的格式。据推测,黑客应用程序的作者最终会发布一个版本来模拟 Google 想要设计的任何格式。唯一安全的方法是通过您控制的设备上的应用内结算 API 来验证购买,即。服务器。

我发现了一种适用于某些虚假 IAP 提供商的部分缓解措施:手动重新检查数字签名。无论 IAP 模拟器做什么,它们都没有副本Google 的 RSA 私钥。我已经推出了自己的签名检查,它至少捕获了一些虚假交易。

The check code is a gist.