国外一位名叫Youssef Sammouda的白帽子于今年5月中旬公布了他在Facebook上发现的数个漏洞,利用这些漏洞组合,最终获得了44625 美元的赏金奖励(包含7000元钻石联赛奖金以及2625元赏金延迟奖金)。
漏洞说明:
该漏洞允许攻击者窃取用于登录 Facebook 的 Gmail OAuth id_token从而接管受害者的Facebook 帐户,而发生这种情况是利用了多个漏洞,主要是 Facebook 沙箱域中的 XSS 和导致与该沙箱域共享的敏感数据漏洞。我们先来看看这几个漏洞分别是什么。
1、Facebook Checkpoint
Facebook 在登录后有额外的安全机制,负责保护和验证用户的真实身份,确保有效的 MFA。此外,如果你的 Facebook 帐户因滥用或暂时被阻止而被删除,你最终会进入这个“Checkpoint”(检查点)。
在此检查过程中的某些情况下,你需要完成验证码以确保在正常的速率限制和尝试次数中:
从上图可以看出,他们使用了Google Captcha,并将Google Captcha作为一项额外的安全功能,以避免将来自Google的第三方代码添加到主域中,他们将 Google Captcha 包含在沙箱域中,并在将其放入 Iframe 后与主域之间建立通信。
一切看起来似乎都OK,但这个实现中的奇怪部分是不知何种原因(可能是日志记录)决定在检查点与沙箱域共享当前 URL,如下所示:
例如,当前URL为:
https://www.facebook.com/checkpoint/CHECKPOINT_ID/?test=test
正在加载的iframe页面将具有这个URL:
https://www.fbsbx.com/captcha/recaptcha/iframe/?referer=https%3A%2F%2Fwww.facebook.com%2Fcheckpoint%2FCHECKPOINT_ID%2F%3Ftest%3Dtest
如同所见,第一个URL作为参数被包含在第二个URL中。
此外,由于处于这个Checkpoint,所以在 www.facebook.com 域中访问的任何 URL 都会让我们再次重定向到这个Checkpoint,然后前一个 URL 同样被包含在下一个URL的参数中:
1、(访问)
https://www.facebook.com/eg_oauth_callback_endpoint?code=code
2、(服务器重定向)
https://www.facebook.com/checkpoint/CHECKPOINT_ID/?next=https%3A%2F%2Fwww.facebook.com%2Feg_oauth_callback_endpoint%3Fcode%3Dcode
3、(内部Iframe)
https://www.fbsbx.com/captcha/recaptcha/iframe/?referer=https://www.facebook.com/checkpoint/CHECKPOINT_ID/?next=https%3A%2F%2Fwww.facebook.com%2Feg_oauth_callback_endpoint%3Fcode%3Dcode
那么我们便可以将在 www.facebook.com 中访问过任何URL及泄露给 www.fbsbx.com,下一步就是想办法把它们从沙箱域中泄露给我们,这并不困难,因为沙箱域的安全性与主域相比较而言松散了很多,我们也能从中轻易地找到 XSS。
2、XSS in www.fbsbx.com
白帽小哥之前就在该网站发现了XSS,因为 Facebook 实际上使用沙盒域来允许某些用户可以上传 HTML 文件的特定功能,即使在本次漏洞确认后,该功能仍然保持原样。
只需要拥有一个开发者帐户,然后在https://developers.facebook.com/tools/playable-preview/ 使用脚本上传 HTML 文件即可,最终文件将被上传到 www.fbsbx.com,如下所示:
https://www.fbsbx.com/developer/tools/playable-preview/preview-asset/?handle_str=STR
3、退出和登录CSRF
由于目标 Facebook 帐户不处于Checkpoint状态,因此我们无法利用上述的漏洞,在这种情况下,我们可以先注销当前用户,并将其登录到处于 Checkpoint 状态的攻击者帐户,但如果这样做了,我们还怎么接管他人的 Facebook 帐户呢?
答案是针对 Facebook 使用的第三方 OAuth,即 Gmail。如果用户登录到 Gmail,Gmail 会将 OAuth code/Token发送回 www.facebook.com,并且由于我们可以窃取访问 www.facebook.com 的任何内容,于是便可以使用 Google OAuth 登录到 Facebook与该 Gmail 帐户相关联的帐户(即任何拥有 Gmail 帐户的 Facebook 帐户)
4、SOP && COOP
要窃取传递给 facebook 内部 iframe 的 URL,我们首先应该在两个窗口之间建立关系:
窗口 (1)具有如下URL
https://www.facebook.com/checkpoint/?next=Pevious_Page_With_Gmail_Code
的页面,以及带有 XSS 的
https://www.fbsbx.com/developer/tools/playable-preview/preview-asset/?handle_str=
页面的窗口(2)。
例如,我们可以从窗口 (2) 访问 opener.frames[0] .location.href :
–这里的Opener是窗口 (1)。
– frames[0]是 iframe 里面有
https://www.fbsbx.com/captcha/recaptcha/iframe/?referer=https://www.facebook.com/checkpoint/?next=Pevious_Page_With_Gmail_Code
的页面。
由于frames [0] 和窗口 (2) 是同源的,所以可以读取被盗代码的页面location.href。 唯一可以防止这种情况发生的保护措施是 COOP(Cross-Origin-Opener-Policy),但它在前几个月在 Facebook 中被大量应用。
攻击步骤:
完整攻击将通过上传脚本传递到 www.fbsbx.com,通过利用步骤2中的XSS,从而执行以下步骤的代码:
1、退出CSRF:代码已被原作者编辑(隐藏)
2、登录CSRF:代码已被原作者编辑(隐藏)
3、使用windows.open打开(TARGET):
https://accounts.google.com/o/oauth2/auth?redirect_uri=https://www.facebook.com/oauth2/redirect/&response_type=permission%20code%20id_token&scope=email%20profile%20openid&client_id=15057814354 -80cg059cn49j6kmhhkjam4b00on1gb2n.apps.googleusercontent.com
它将重定向到
www.facebook.com/checkpoint/CHECKPOINT_ID/?next=URL_WITH_CODE
其中 URL_WITH_CODE 是
www.facebook.com/oauth2/redirect/?code=Gmail_Code
4、等待几秒,然后访问 TARGET.frames[0].location.href,我们就有了 Google OAuth code和 id_token,作为攻击者,我们可以从 id_token 中提取电子邮件地址,然后在 www.facebook.com 中启动密码重置过程(设置正确的 sfui cookie),然后选择连接到 Gmail(openid),我们会重定向到与第 3 步类似的 URL,但会带有额外的状态参数。
我们使用上一步重定向到 accounts.google.com 中的状态,并将其放在此处以构建最终 URL
https://www.facebook.com/oauth2/redirect/?state=STATE&code=CODE_FROM_STEP_4
如果我们访问上面这个 URL,在响应包的正文中会看到一个访问受害者帐户的链接(该URL的 /recover/password/ 中包含有一个随机数,该随机数即为受害者帐户)。
漏洞时间线:
Feb 16, 2022— Report Sent
Feb 22, 2022— Acknowledged by Facebook
Mar 21, 2022— Fixed by Facebook
May 14, 2022 — $44625 bounty awarded by Facebook. (7000 Diamond League Bonus, 2625 Bounty Delay Bonus)
====正文结束====