Github的OAuth授权绕过,造成恶意读取或修改任意github账户数据

匿名者  1872天前

背景

研究人员用GitHub Enterprise的试用版的时候,使用脚本对其进行模糊测试,然后观察GitHub的Rails代码是否有任何奇怪或可利用的内容,研究人员发现有某些应用程序逻辑由未处理的情况引起的错误,但是由于是低权限查询的,所以没有造成安全问题。即便如此,研究人员还是找见了一些其他问题,如:OAuth授权绕过。

github的OAuth流程

1、第三方应用程序(Foo App)访问Github数据,会向用户发送带有查询字符串信息的链接:https://github.com/login/oauth/authorize

2、Github的授权页面:

github_OAuth.png

3、用户授权应用程序的访问权限,使用查询字符串中的授权代码将其重定向到Foo app,然后使用此代码访问请求的数据。

授权

github根据HTTP请求来确定响应内容,通过get请求返回HTML授权页面,同时发送带有隐藏CSRF令牌字段的POST请求,发送post请求并验证CSRF令牌后,就给应用程序授权了。

授权的http请求是由路由器发送到一个控制器,由控制器进行相应的响应操作。

router.png

controller.png

利用HTTP HEAD请求的攻击

HTTP HEAD请求方法,类似于GET请求,不同点是只有响应头没有响应主体。

发送经过身份验证的HEAD请求到https://github.com/login/oauth/authorize,路由器将其视为GET请求发送到控制器,控制器在处理时把请求当作经过身份验证的POST请求,然后Github得到请求中指定的OAuth应用并授予其访问用户数据的权限。

以上操作绕过了,经过身份验证的POST请求中需要验证的CSRF令牌。

因此,可以发送跨站点身份验证的HEAD请求,就可以无需向用户显示确认的页面,获取任意的OAuth权限,在用户的Github账户中任意读取或修改私有数据。

研究人员向GitHub的Bug赏金计划报告了此问题,他们在大约三个小时内将修复发布到了生产环境,并且获得了25000美元的赏金,当时是GitHub计划有史以来最高的赏金。

时间线

2019-06-19 23:28:56 UTC问题在HackerOne上向GitHub报告

2019-06-19 23:36:50 UTC问题已由GitHub安全团队确认

2019-06-20 02:44:29 UTC问题在github.com上进行了修补,GitHub答复HackerOne再次检查补丁是否已完全解决问题

2019-06-26 16:19:20 UTC GitHub Enterprise 2.17.3、2.16.12、2.15.17和2.14.24随补丁一起发布(请参阅GitHub公告)。

2019-06-26 22:30:45 UTC GitHub奖励$ 25000赏金


本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://blog.teddykatz.com/2019/11/05/github-oauth-bypass.html?from=timeline

最新评论

昵称
邮箱
提交评论