Pokémon Go iOS版权限漏洞:OAuth过度授权风险分析

本文详细分析了2016年Pokémon Go iOS版存在的谷歌账户OAuth权限过度请求问题,包括技术团队如何通过越狱设备逆向分析、发现未公开的UberAuth令牌机制,以及最终促使Niantic和谷歌联合修复的安全事件全过程。

为什么我今天没抓到任何宝可梦 - Trail of Bits博客

tl;dr 当互联网今天陷入疯狂时,我们展开了事实调查。以下是我们对Pokémon Go向您的谷歌账户请求权限的笔记。

以下是Jay和我在今天下午6点左右开始做的事情:

  • 查找Pokémon Go实际请求的权限
  • 调查这些权限的实际作用
  • 在测试应用中复制这些权限

我们的第一直觉是直接查看代码,因此我们开始在越狱手机上加载iOS应用。Pokémon Go应用使用越狱检测来阻止使用修改设备的用户访问游戏。正如我们通常发现的那样,这种保护很容易绕过,因此没有提供真正的保护。

Niantic向谷歌发出OAuth请求,其范围设置为以下内容(注意:“范围”决定了Niantic对您账户的访问级别,每个请求项是不同类别的数据):

1
2
3
4
openid
email
https://www.google.com/accounts/OAuthLogin
https://www.googleapis.com/auth/userinfo.email

OAuthLogin范围在此列表中显得突出。它主要由谷歌的应用程序使用,例如Chrome和iOS账户管理器,不过我们也发现了一些使用它的Github项目。

无法从谷歌自家的OAuth Playground使用此OAuth范围。它只会给出各种“未授权”错误消息。这意味着OAuth Playground(谷歌用于测试其API访问的服务)无法完全复制Pokémon Go请求的权限。

它可能是OAuth 1.0 API的一部分,该API于2012年被谷歌弃用,并于2015年关闭。如果是这样,我们不确定为什么Pokémon Go能够使用它。我们检查过,迁移到OAuth 2.0 API的账户不再能够访问旧的1.0 API。

似乎无法通过正常或文档记录的方式创建我们自己的使用此OAuth范围的应用。为了正确测试此OAuth令牌提供的访问级别,我们可能需要挂钩一个有权访问的应用(例如,通过Cydia挂钩)。

Pokémon Go登录流程未描述正在请求的权限,并在权限被撤销后静默重新启用它们。此外,可用文档未能充分描述令牌权限对任何试图调查它们的人意味着什么。

很明显,这种访问不需要用于识别Pokémon Go中的用户账户。在我们撰写本文时,我们预计Niantic最终会通过减少他们请求的权限来回应。到我们发布时,他们发布了一份声明,确认他们将这样做。

这一次,我们同意Hacker News上的许多评论。

这似乎是谷歌方面的一个重大安全失败。OAuth流程没有理由能够静默请求管理员权限。作为用户,我真的必须得到一个提示来询问我(并警告我!)。 — ceejayoz

我们能够通过Google Apps for Work查询特定的令牌范围,但我们尚未找到个人账户的等效功能。鉴于这些令牌几乎等同于密码,似乎明智的做法是启用更大的调查和透明度,关于它们在所有谷歌账户上的使用,以备下一次不可避免的发生这种情况时。

Google Apps for Work允许您查询单个令牌范围

到我们走到这一步时,Niantic发布了一份声明,确认他们的访问权限远远超过所需:

我们最近发现,iOS上的Pokémon GO账户创建过程错误地请求了对用户谷歌账户的完全访问权限。然而,Pokémon GO仅访问基本的谷歌配置文件信息(特别是您的用户ID和电子邮件地址),并且没有访问或收集其他谷歌账户信息。一旦我们意识到这个错误,我们开始开发客户端修复,以仅请求基本谷歌配置文件信息的权限,与我们实际访问的数据一致。谷歌已核实Pokémon GO或Niantic未接收或访问任何其他信息。谷歌将很快将Pokémon GO的权限减少到仅Pokémon GO需要的基本配置文件数据,用户无需自行采取任何行动。

在谷歌和Niantic按照其声明中描述的行动跟进后,这将完全解决此问题。据我们所能判断,谷歌计划找到已发行的令牌并“降级”它们,同时Niantic不再为新用户请求这些权限。

感谢阅读,如果您有任何进一步细节,请告诉我们!请花点时间查看您通过谷歌安全检查授权的应用,并启用双因素认证(2FA)。

更新2016年7月12日:看起来我们在“UberAuth”令牌方面走对了路。此OAuth范围最初获得访问权限非常少,但可以通过一系列未文档记录的方法交换为新令牌,允许访问您谷歌账户中的所有数据,包括Gmail。更多细节:https://gist.github.com/arirubinstein/fd5453537436a8757266f908c3e41538

更新2016年7月13日:Pokémon Go应用已更新,现在仅请求基本权限。Niantic的声明表明他们将自行取消错误发行的所有令牌的权限,但如果您想抢先一步,请转到您的应用权限,撤销Pokémon Go访问权限,退出Pokémon Go应用,然后重新登录。

如果您喜欢这篇文章,请分享: Twitter LinkedIn GitHub Mastodon Hacker News

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计