写在前面的话
如果我告诉你,我只需要拿到你的电子邮件ID,我就可以入侵你所有的网站以及App账号,我就问你怕不怕?没错,利用苹果认证机制(Sign in with Apple,该功能又名“通过苹果登录”)中的这个漏洞,我确实可以做到!
在前不久的一次安全研究过程中,我在苹果认证机制(Sign in with Apple)中发现了一个0 day漏洞,所有使用了该功能的第三方应用程序如果没有实现它们自己额外的安全保护措施的话,都将会受到该漏洞的影响。这个漏洞将直接导致攻击者入侵并接管目标用户第三方应用程序中的用户账户,而且目标用户是否拥有有效的Apple ID并不会影响该漏洞的利用效果。
技术细节
苹果认证机制(Sign in with Apple)的工作机制跟OAuth 2.0非常相似,这里可以使用两种方法来对目标用户的身份进行验证,一种是使用JWT,即JSON Web Token,另一种则是使用有苹果服务器生成的一个code码,而这个code码可以用来生成一个JWT。下图显示的就是JWT的创建过程以及工作机制:
在第二个步骤中,也就是在认证阶段,苹果会给用户提供一个选项,即是否要与第三方应用程序共享苹果电子邮件ID。如果用户选择隐藏电子邮件ID,那么苹果将会生成其自己的针对特定用户的苹果中继电子邮件ID。根据用户的选择,在认证成功之后,苹果将会创建一个包含了这个电子邮件ID的JWT令牌,而这个令牌将会在第三方应用程序中使用并协助用户完成账号登录。
下面给出的是解码后的JWT Payload样本:
{
"iss": "https://appleid.apple.com",
"aud": "com.XXXX.weblogin",
"exp": 158XXXXXXX,
"iat": 158XXXXXXX,
"sub": "XXXX.XXXXX.XXXX",
"c_hash": "FJXwx9EHQqXXXXXXXX",
"email": "contact@bhavukjain.com", // or "XXXXX@privaterelay.appleid.com"
"email_verified": "true",
"auth_time": 158XXXXXXX,
"nonce_supported": true
}
漏洞分析
在研究过程中,我发现我能够从苹果服务器端请求任意电子邮件ID对应的JWT令牌,然后我拿这些令牌的签名和苹果的公钥进行验证时,我发现这些令牌全部都是有效令牌。这也就意味着,任意一名攻击者都可以通过这种方式来伪造一个JWT令牌,然后获取目标用户的账号访问控制权了。
下面给出的是恶意请求样本:
POST /XXXX/XXXX HTTP/1.1
Host: appleid.apple.com
{"email":"contact@bhavukjain.com"}
在这里,我们可以传递任意一个电子邮件地址,苹果将会针对这个电子邮件ID来生成一个有效的JWT令牌(id_token)。
下面给出的是响应样本:
{
"authorization" : {
"id_token" : "eyJraWQiOiJlWGF1bm1MIiwiYWxnIjoiUlMyNTYifQ.XXXXX.XXXXX",
"grant_code" : "XXX.0.nzr.XXXX",
"scope" : [ "name", "email" ]
},
"authorizedData" : {
"userId" : "XXX.XXXXX.XXXX"
},
"consentRequired" : false
}
这个漏洞毫无疑问绝对是一个高危漏洞,因为它将允许攻击者接管目标用户的任意账号。很多开发人员目前都已经在自己的项目中整合了“Sign in with Apple”这个功能,因为根据政策,很多应用程序是强制性要加入这个功能来支持其他的社交帐号登录的。比如说,Dropbox、Spotify、Airbnb和Giphy等等,这些应用程序虽然我都没有对它们进行测试,但是如果这些App都没有部署自己的安全防护措施,那么肯定也会受到这个漏洞的影响,并导致用户账号被入侵。
后记
我在发现这个漏洞之后,便立刻将漏洞信息上报给了苹果公司的相关部门。苹果也对该功能的日志记录进行了分析,并且已确认目前并没有账号受到该漏洞的影响。对于这个漏洞,根据苹果的安全漏洞奖励计划,我成功拿到了十万美元的漏洞奖金,感谢苹果的安全团队。
参考来源:
*本文作者:Alpha_h4ck,转载请注明来自FreeBuf.COM