WhatsApp缓冲区溢出漏洞
导语:WhatsApp修补了一个在野外被利用的远程漏洞CVE-2019-3568,研究人员通过diff分析补丁,发现修补了一个整数溢出和缓冲区溢出漏洞。
前言
WhatsApp修补了一个在野外被利用的远程漏洞CVE-2019-3568,研究人员通过diff分析补丁,发现修补了一个整数溢出和缓冲区溢出漏洞。研究人员就在想攻击者会如何利用这个RCE漏洞长期对目标设备进行监听。最后发现,攻击者是通过漏洞获取App执行权限之后调用App中的代码执行WhatsApp Web功能,使得远端的Web浏览器对设备长期的监听。
背景介绍
最近,Zimperium在5月13日发布了一篇关于Facebook披露的一个WhatsApp漏洞的博文。据报道,这一漏洞已经在野外被利用,并被指定为CVE-2019-3568。Zimperium之前的一篇文章提供了一些关于该漏洞的初步信息,包括该漏洞对WhatsApp产品的影响、漏洞的利用以及Zimperium如何帮助应对与该漏洞相关的风险和威胁。
这篇文章是对CVE-2019-3568进一步研究的结果,指在介绍一些具体的技术细节,并展示WhatsApp上远程代码执行(RCE)利用该漏洞的PoC演示。
注意事项
在该漏洞和补丁的报告中,Facebook披露该漏洞是一个影响WhatsApp客户端iOS和Android版本的远程代码执行(RCE)。不过其中并没有提到目标平台,所有版本目前都有对应的补丁。
由于漏洞的技术细节并没有进行公开,为了与事实保持一致,这篇文章将有选择地关注几个已经披露的补丁。
我们将尝试推断出一些关于整体漏洞的分析,比如特征、逻辑,最重要的是,运行在iOS设备上的WhatsApp客户端中RCE的可能影响,以及攻击者利用漏洞可以实现什么操作?
需要注意的是,这个分析只是初步的,为了充分了解补丁漏洞的影响,还必须对补丁的其他方面进行审查。
修补程序分析
由于这个漏洞是在两个平台上都已修补,并且iOS应用程序分析和反汇编分析的文章比较少,所以我选择在本文中侧重对iOS版本的修补程序进行分析。
我们所分析的WhatsApp客户端位于iOS,如果你也希望按照我们的想法分析,请确保你能找到2.19.50(未补丁)和2.19.51(补丁)版本。检查这两个版本(IDA和BinDiff或Ghidra),会在数据包处理函数中产生几个变化,其中两个函数占主要部分(0x100c236b4和0x100c25b78)。下面,我们将逐一介绍这些函数。
首先,我们将在0x0100C236B4(命名为processbrustpackages)处检查函数。该函数似乎是负责处理STUN和其他包含在WhatsApp VoIP栈的数据包。以下是修复版本中删除的主要函数部分。
在第716行,对来自调用者控制的packetSize和_Asize进行大小检查。
如果packetSize大于0x7A120,则会导致整数溢出,此时,下面的数据块将被忽略。
这将导致对memcpy的调用(高亮显示部分)。
这个执行块已在更新的修复版本中被删除:
下面是修复函数的BinDiff调用图:
下一个引起我们注意的补丁函数是0x0100C25B78,名为handle_incoming_traffic。以下是该函数已修补的部分:
在第60行,在提供的调用者参数上调用memcpy,而不检查大小,这可能导致缓冲区溢出漏洞。所以在修复版本中,引入大小检查,以确保大小<=0x5c8:
在我们之前介绍的第一个函数中也添加了这个大小检查:
我们了解到,另外一个可能的内存溢出漏洞已经通过在这两个函数中引入的大小检查进行了修补。有趣的是,指出这两个修复函数在WhatsApp应用程序内部的通信处理中起着关键作用,这从调用者图中可以看出。
现在,我们已经知道修补后的版本已经删除了潜在的缓冲区溢出和整数溢漏洞,这些漏洞可能会被利用到WhatsApp应用程序中的调用者控制的远程代码执行中。接下来,我们将需要验证这个函数确实就是所报道的语音呼叫功能中的漏洞。
CVE-2019-3568的漏洞存在于应用程序的VOIP堆栈中,允许攻击者向目标手机号码发送特制的SRTCP包实现远程执行代码。在iPhone或Android设备上该漏洞可以通过WhatsApp呼叫功能进行利用。整个攻击过程中不需要用户交互,受害者并不需要接听电话,呼叫记录通常也不会显示在日志里。
漏洞利用过程
为了验证该函数在语音通话过程中被调用,请使用Xcode连接到运行在越狱设备上的易受攻击的WhatsApp应用程序中:
在函数地址(映像库和函数位置)上设置断点,或者使用Jonatan Levin的Jtool2为xCode创建断点命令:
如下所示:
现在,启动对该帐户的语音呼叫,正如我们所假设的,我们击中了断点:
到目前为止,还没有关于完整漏洞利用有效载荷的文章,也没有关于漏洞利用分析的任何技术评论。
在不急于下结论的情况下,我们已经能够验证以下方面:
1.公民实验室(Citizen Lab)与英国《金融时报》一起报道的CVE-2019-3568漏洞的确属实;
2. WhatsApp在其iOS客户端中修补了至少一个(可能更多)潜在的内存损坏漏洞;
3.这些修复是由至少两个与语音调用功能相关的函数组成;
4.测试中的断点不需要用户交互;
5.谷歌Project Zero将这种攻击目前划分为 “suspected” ,以便在远程代码执行中使用;
6.iOS操作系统并没有修补这个漏洞。
所以由此分析,由该漏造成的漏洞攻击还未实际发生,只是存在理论上的可能性。也许,出于某种原因,这个漏洞被披露出来,只是为了吸引读者的眼球。这就解释了为什么至今没有公布有效载荷,也没有公布漏洞的分析结果。
此外,如果攻击确实是发生了,综合以上分析,可以肯定的是,WhatsApp为客户端应用程序创建了一个复杂的有效载荷,无需用户交互即可触发,从而在WhatsApp内部实现远程代码执行。
人们可能会关注,攻击者通过在WhatsApp中执行RCE操作,能获得什么好处呢?从理论上讲,WhatsApp可以访问麦克风、摄像头、位置和照片,这使得它成为攻击者最想攻破的目标。然而,要成功访问所有这些内容,就需要跨越许多障碍,包括绕过新设备上的PAC、堆栈检查和iOS引入的其他缓解措施。此外,攻击者需要在重新启动后实现持久性。
如果一些攻击者真的制作了有效载荷,并进行了调试和攻击测试, 则当得到远程代码执行的结果,他们将不得不建立读/写/执行原语,使用info-leaks和运行时计算,以便攻击能取得成功。
因此,我们只能想象,攻击者可能攻击的是WhatsApp的其他方面而不是语音调用功能。
能否有一些快速有效的方法来实现持久性?有些路径会在应用程序逻辑中使用命令执行功能时,尽可能保持沉默,这是否会对攻击者提供攻击帮助,从而在重启后存活下来,并提供对目标WhatsApp账户活动的远程监控?
同样,目前由于没有官方发布的攻击样本,所以关于实际的使用机制,我们只能靠猜测。
而我们的猜测,完全基于上述分析。
获取WhatsApp Web
WhatsApp有一个广受欢迎的网络客户端功能,叫做“WhatsApp web”。“它允许用户使用一个简单的浏览器从世界任何地方连接到他们的WhatsApp账户,从而进行发送和接收消息,创建新的群组,查看旧消息等等,就好像他们是在用自己的设备在操作一样。”
为了建立这种远程登录功能,用户需要遵循以下简单的步骤:首先从一台计算机浏览https://web.whatsapp.com,再用WhatsApp应用程序扫描生成的二维码。
一旦扫描被通过,浏览器将通过身份验证:
从现在开始,用户就可以远程浏览器客户端的设备上读取每条消息,发送消息,操作过程和在移动端是一样的。
在Android设备上,用户会收到每个已连接帐户的通知,如下所示:
但是,在iOS上,WhatsApp客户端就没有这样的通知。如果远程Web会话处于活动状态或者有人劫持了WhatsApp会话,则iOS的用户不会收到任何通知。如果你想查看是否有人盗取了你的帐户,你需要进入“设置”:
WhatsApp Web:
然后,你会看到一个连接过的浏览器列表:
iOS上没有提供IP或其他标识符,只有浏览器用户代理。
因此,如果你的账户被远程劫持,在iOS上你不会收到任何通知。
只要用户进行了网络连接,WhatsApp Web就可以无限期地持续,即使目标重启他们的设备。
总结
通过反汇编授权过程,我发现可以通过在目标设备上调用一个函数来对远程web会话进行静默授权(静默授权不需要用户确认,只需要用户访问某个网页,属于嵌套在普通网页里的授权形式):
-[WASettingsViewController qrCodeScannerViewController:didFinishWithCode: ]
此函数负责验证新web会话中提出的验证,如果执行此调用,它可以授权一个与当前WhatsApp帐户的远程会话连接。
这可以用Xcode上的一行程序来模拟:
1.通过浏览https://web.whatsapp.com打开WhatsApp web;
2.复制二维码并将其解码为字符串。
3.在Xcode中,暂停WhatsApp并粘贴以下命令:
(lldb) po [[WASettingsViewController new] qrCodeScannerViewController:[WAWebClientQRCodeScannerViewController new] didFinishWithCode:@”PUT_TARGET_TOKEN_HERE” ]
这样,我们就成功地劫持了目标帐户。
你可以点此视频介绍,了解WhatsApp应用程序中具有远程代码执行功能的函数(视频中模拟为一个简单的调试会话),攻击者如何使用它来执行客户端应用程序中的任何代码。在这种情况下,在没有任何通知的情况下劫持客户端WhatsApp会话:
发表评论