揭秘Pokemon Go过度获取Google账户权限的技术内幕

本文通过逆向工程分析Pokemon Go iOS版的OAuth权限请求机制,揭露其异常获取Google账户"UberAuth"超级令牌的技术细节,该权限可升级获取Gmail等全账户访问权,并探讨Google OAuth流程的设计缺陷。

为何今天我没抓到任何精灵 - Trail of Bits技术调查

Dan Guido
2016年7月11日
apple, authentication, privacy

tl;dr 当全网疯狂时,我们展开了技术调查。以下是关于Pokemon Go申请Google账户权限的技术笔记。

调查过程

今天下午6点左右,我和Jay展开了以下技术工作:

  1. 确认Pokemon Go实际请求的权限
  2. 研究这些权限的真实功能
  3. 在测试应用中复现权限获取

逆向工程分析

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

其中OAuthLoginscope异常突出,该权限通常仅限Google自家应用(如Chrome和iOS账户管理器)使用。我们在Github上仅发现少数项目使用它。

OAuth技术验证

通过Google官方OAuth Playground测试时,该scope会返回"未授权"错误,说明Playground无法复现Pokemon Go的权限请求。这可能是Google 2012年弃用、2015年关闭的OAuth 1.0 API残留。但令人困惑的是,已迁移到OAuth 2.0的账户按理不应再能使用旧版API。

安全缺陷分析

Pokemon Go登录流程存在三大问题:

  1. 未明确告知请求的权限内容
  2. 用户撤销权限后会自动重新启用
  3. 现有文档未充分说明令牌权限含义

虽然Niantic声称只需要基础资料,但通过UberAuth令牌可升级获取包括Gmail在内的全账户访问权限(详见技术细节)。

厂商响应与解决方案

Niantic最终承认错误并发布声明:

“iOS版Pokemon GO错误地请求了Google账户的完全访问权限…实际上仅访问基本资料信息…正在通过客户端更新修正权限请求”

Google将采取两项措施:

  1. 对已发放的令牌进行降权
  2. 阻止新用户授予过度权限

建议用户:立即在Google安全设置中撤销Pokemon Go权限,登出后重新登录以获取修正后的权限。


更新记录
2016/7/12:确认"UberAuth"令牌可通过未公开方法升级获取全账户权限
2016/7/13:应用已更新为仅请求基础权限

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