Facebook破例为开源TLS库Fizz漏洞奖赏1万美元

Semmle公司的安全研究员Kevin Backhouse在Facebook的开源TLS库Fizz中找到一个因证书溢出触发的拒绝服务漏洞。因该漏洞严重程度高,因此Facebook破例为原本不再奖励范围内的漏洞颁发1万美元的奖励。

如下是该研究员的博客文章节选:

Fizz 简介

该漏洞是一个无限循环,可被未验证的远程攻击者触发。Fizz是Facebook的TLS实现,也就是说它用于 https://facebook.com 中的“https:”部分。据Facebook公司在2018年8月6日发布的数据显示,“我们在全球范围内为移动应用、Proxygen、负载平衡器、内部服务甚至是OUIC库mvfst等中部署了Fizz。超过50%的内部流量目前受TLS 1.3的保护。”

鉴于Fizz是一个开源项目,因此其它项目和组织机构可能也在使用它。

漏洞严重性和缓解措施

漏洞(CVE-2019-3560)造成的影响是,攻击者能够通过TCP向任意使用Fizz库的服务器发送恶意信息并在该服务器上触发无限循环,从而导致服务器对其它客户端无法做出响应。该漏洞被归为拒绝服务(DoS)漏洞,因为它导致攻击者破坏服务而不是获取未授权访问权限。由于信息只有64KB大小,因此发动攻击的成本极其低廉,但对于服务器而言却具有重大风险。

具有异常民用级互联网连接(1Mbps的上传速度)的一台电脑就能每秒发送两条信息。由于每条信息针对的是一个CPU内核,因此只需要小型僵尸网络就能快速拿下整个数据中心。

我没有发现针对该漏洞的缓解措施,因此建议尽快更新到已打补丁的Fizz版本v2019.02.25.00。

PoC

我已经编写了触发该漏洞的PoC。它就是一个简单的C程序,打开服务器的TCP套接字并发送大小仅为64KB的恶意有效负载。该程序在发送完有效负载后就马上关闭套接字,但服务器由于陷入死循环因此无法注意到这一点。我并未在真实的网站上测试该有效负载,只是在包含在Fizz源代码的演示服务器应用中进行了测试。然而,该漏洞存在于Fizz库的核心,而非演示应用程序,因此我认为 https://facebook.com 在提交漏洞前是存在风险的。

Facebook已发布补丁,但我会在其它Fizz用户更新后发布完整详情。

简要技术分析

这个漏洞是因为PlaintextRecordLayer.cpp第42行中+=中存在一个整数溢出问题:

auto length = cursor.readBE<uint16_t >();if (buf.chainLength() < (cursor - buf.front()) + length) { return folly::none;}length += sizeof (ContentType) + sizeof (ProtocolVersion) + sizeof (uint16_t );buf.trimStart(length);continue ;

该代码从传入的网络数据包中读取一个uint16_t并将其分配给length。换句话说,length的长度是受攻击者控制的。第2行的if语句看似是bounds检查,但实际上只是检查已收到足够的数据以便继续解析。这就是利用代码为何需要发送64KB数据的原因:该代码在收到至少length字节之前并不会触发第5行的整数溢出。该利用通过设置length = 0XFFFB起作用。这意味着+=后,length的值为0。它说明调用第7行的trimStart并不会消耗任何数据,因此在循环下次迭代前并不会产生任何进展。

而修复该漏洞的方法也很简单:使用大于uint16_t的类型来计算该加法,从而避免整数溢出问题的产生。

但是,我并未有完全说明该利用起作用的全部内容。设置length = 0XFFFB这一步是容易的那部分,我发现搞清楚如何构建真正能触发这行代码的信息才是更难的部分。Fizz用户更新后,我会发布完整详情。

漏洞奖励

2019年3月13日,Facebook给我发了一份邮件,通知我获得1万美元的奖励。他们的解释如下:

“这个漏洞本可导致恶意攻击者引发针对Facebook基础设施的拒绝服务。虽然我们的漏洞奖励计划通常并不涵盖此类漏洞,但你提交的报告讨论了具有重大风险的场景。”

时间轴

2019-02-20:通过Facebook公司的白帽计划提交漏洞

2019-02-20:Facebook证实漏洞问题存在并转交给产品团队

2019-02-20:Facebook修复所有服务器

2019-02-25:Facebook在GitHub上推送修复方案

2019-03-13:Facebook确认漏洞奖励

2019-03-19:Semmle公司披露CVE-2019-3560

该研究员按照所在公司的政策,已将赏金全部捐献给慈善组织Techtonica。按照Facebook的规定,如果选择捐赠,则Facebook会捐赠同等款项,因此该慈善组织收到2万美元的捐赠。

*参考来源:lgtm,360代码卫士编译整理,转载请注明来自 FreeBuf.COM。