为何今天我没抓到任何精灵 - Trail of Bits技术调查
Dan Guido
2016年7月11日
apple, authentication, privacy
tl;dr 当全网疯狂时,我们展开了技术调查。以下是关于Pokemon Go申请Google账户权限的技术笔记。
调查过程
今天下午6点左右,我和Jay展开了以下技术工作:
- 确认Pokemon Go实际请求的权限
- 研究这些权限的真实功能
- 在测试应用中复现权限获取
逆向工程分析
|
|
其中OAuthLogin
scope异常突出,该权限通常仅限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登录流程存在三大问题:
- 未明确告知请求的权限内容
- 用户撤销权限后会自动重新启用
- 现有文档未充分说明令牌权限含义
虽然Niantic声称只需要基础资料,但通过UberAuth
令牌可升级获取包括Gmail在内的全账户访问权限(详见技术细节)。
厂商响应与解决方案
Niantic最终承认错误并发布声明:
“iOS版Pokemon GO错误地请求了Google账户的完全访问权限…实际上仅访问基本资料信息…正在通过客户端更新修正权限请求”
Google将采取两项措施:
- 对已发放的令牌进行降权
- 阻止新用户授予过度权限
建议用户:立即在Google安全设置中撤销Pokemon Go权限,登出后重新登录以获取修正后的权限。
更新记录
2016/7/12:确认"UberAuth"令牌可通过未公开方法升级获取全账户权限
2016/7/13:应用已更新为仅请求基础权限