影响超过四百万网络摄像头:Zoom客户端存在0 day漏洞可能导致代码执行

41yf1sh 业务安全 2019年7月12日发布
Favorite收藏

导语:近期,我们发现Zoom客户端存在两个安全漏洞。其中的一个漏洞允许任何网站在未经用户允许的情况下,强行将用户加入到Zoom呼叫中,并激活其摄像头。另外一个漏洞可以通过多次将用户加入到无效的呼叫中,从而导致拒绝服务(DoS)。

CVE编号

CVE-2019-13449:Zoom客户端拒绝服务漏洞(已在4.4.2版本客户端中修复)

CVE-2019-13450:网络摄像头信息泄露漏洞(目前暂未发布补丁,计划在7月10日发布)

前言

近期,我们发现Zoom客户端存在两个安全漏洞。其中的一个漏洞允许任何网站在未经用户允许的情况下,强行将用户加入到Zoom呼叫中,并激活其摄像头。另外一个漏洞可以通过多次将用户加入到无效的呼叫中,从而导致拒绝服务(DoS)。

除此之外,如果用户曾经安装过Zoom客户端,即使将客户端卸载,计算机上也会保留一个localhost的Web服务器,只需访问特定网页,无需其他任何交互,就可以重新安装Zoom客户端。这种重新安装的“功能”在目前最新版本中仍然存在。

1.jpeg

该漏洞利用了Zoom中非常简单的功能,用户可以向任何人发送会议链接(例如:https://zoom.us/j/492468757),当收到链接的用户在浏览器中打开该链接时,他们的Zoom客户端会在本地神奇地打开。我非常好奇这一功能的具体实现方式,以及如何能保证其安全性。最终我发现,该机制确实没有被安全地实施,存在一定的风险。与此同时,我也发现了一个解决方案,在不需要进行额外用户交互的前提下,可以保证该机制安全地实现。

2.jpeg

这一漏洞是在2019年3月26日披露,披露过程中采用了负责任的漏洞披露方式。在最初的漏洞报告中,包括一个“快速修复”的建议描述,Zoom可以通过简单地改变他们的服务器逻辑来实现。Zoom花费了10天时间来确认漏洞。他们关于如何修复漏洞的第一次实际会议讨论是在2019年6月11日召开,也就是距离90天公开披露截止日期结束前的18天。在此次会议中,确认了漏洞的详细信息,并讨论了Zoom的计划解决方案。但是,我能非常轻易的在他们的计划修复方案中发现一些漏洞和可以绕过的地方。在当时,Zoom只剩下18天的时间来解决漏洞。经过了90天的等待之后,在公开披露截止日期前的最后一天(6月24日),我发现Zoom只实施了最初建议的“快速修复”解决方案。

总而言之,Zoom很快确认了报告的漏洞确实存在,但他们没能及时修复这些漏洞。由于这一系列产品具有庞大的用户群体,我认为有必要采取更加主动的方式,保护其用户免受袭击。

发现漏洞

在Mac上,如果您曾经安装过Zoom,那么本地计算机上的Web服务器会在19421端口上运行。我们可以通过在终端上运行lsof -i :19421来确认此服务是否存在。

首先,我们不得不说,如果一个安装的应用程序,会在我的本地计算机上运行一个Web服务器,同时还使用这一个完全没有文档的API,这会让我感觉很奇怪。其次,我访问的任何网站都可以与在我的主机上运行的这个Web服务器进行交互,这对于一个安全研究员来说,是一个巨大的危险信号。

Zoom网站上的代码如下,通过这段代码我了解到存在一个localhost服务器:

3.png

当我得知这个Web服务器存在的时候,我最初的想法是,如果在这个Web服务器的参数处理过程中有任何缓冲区溢出,那么就有人可以在我的主机上实现远程代码执行。然而,这并不是我发现的漏洞,而只是我最初的一个假设。

我们访问其中一个Zoom到的“join”(加入)链接时,可以查看记录到Web开发人员控制台的内容,我们可以看到如下内容:

4.png

我还发现,该页面并没有发出常规的AJAX请求,而是从本地运行的Zoom Web服务器加载图像。图像的不同尺寸决定了服务器的错误或状态代码。我们可以在这里看到条件判断的逻辑:

5.png

这两个数字,是Web服务器返回的图像的像素尺寸。

令人担心的是,这个枚举似乎表明,Web服务器可以做的不仅仅是启动Zoom会议。我发现,这个Web服务器也可以在用户已经卸载的情况下,重新安装Zoom应用程序。

我非常好奇,为什么这个Web服务器会返回以图像文件的尺寸作为编码的数据?原因是,它绕过了跨源资源共享(CORS)。在设计之初,Web服务器就刻意忽略了在localhost上运行的服务器的任何CORS策略。

由于2010年发现的一个漏洞,Chrome不支持localhost for CORS的请求。我猜测,这是处于安全考虑而故意这样实现的。但不管怎样,目前都表明Zoom滥用了一种攻击方式来绕过CORS的保护,我们会在后面详细介绍。

漏洞1:视频通话漏洞

我使用不同帐户创建了一个私人会议,并且破解了打开的Postman,并开始删除参数,以确认能启动Zoom会议所需的最小GET请求。

有很多随机参数会发送到localhost Web服务器,但唯一值得关注的,似乎是以下内容:

action=join
confno=[whatever the conference number is]

使用Postman的以下GET请求,我成功让我的计算机加入到另一个帐户创建的Zoom调用中。

http://localhost:19421/launch?action=join&confno=[some confrence number]

在掌握上述信息之后,我开始尝试其他可以通过的“action”参数,从而在客户端上能做其他事情。即使在搜索各种公开的文档和公开的ProtoBuff模式之后,我也无法找到任何关于可能存在哪些隐藏功能的提示。同样,这个网络服务器的API完全没有配套的文档说明,我花了几个小时在官方和非官方文档中搜索关于这个桌面Web服务器的相关信息。

所以,现在我就有了一个可以用来恶意让任何用户接听电话的最小化PoC,但是,“New Meeting”的默认设置是允许用户选择是否加入他们的语音或视频中。我会认为这是一个安全漏洞。

上述存在问题的实现方式到目前仍然存在,我们仍然可以使用此漏洞利用方法,在未经许可的情况下,向某人发起呼叫。

除此之外,我发现了Zoom安全漏洞中的Tenable远程代码执行漏洞,该漏洞仅仅在6个月之前才修复过。如果将Tenable漏洞与此漏洞结合使用,那么将会允许对任何已经安装Zoom Mac客户端的计算机实现远程代码执行。如果在此后能够找到一个类似的漏洞,可以允许互联网上的任何网站,在用户的计算机上实现远程代码执行。

因此,建议仍然在使用Zoom 4.1.33259.0925或更低版本的用户及时升级版本,否则攻击者可以执行非常有效的攻击。

到目前为止,我只能在未经用户许可的情况下让用户加入通话。尽管这具有一定程度的安全隐患,但是我还没有做到真正的利用。由此,我开始研究如何能够启动特定用户的摄像头。在设置工作会议时,我看到了这样的界面。

6.png

攻击者可以选择在用户加入呼叫时,启动参与者的摄像头。

在设置会议时,可以启用“Participants: On”,一旦配置此选项,我发现任何加入我的会议的用户都会自动连接他们的视频。

当我在我个人电脑上操作时,我尝试了同样的功能,发现它的工作方式完全相同。

由此,我创建了以下的概念验证。

PoC

本地客户端中的Zoom Web服务器作为后台进程运行,为了利用这一点,用户甚至都不需要“运行”,即可导致Zoom APP受到攻击。

<img src="http://localhost:19421/launch?action=join&confno=492468757"/>

只有一行,这一PoC确实非常简单。

或者,如果想要激活摄像头,只需要在网站中使用iframe嵌入Zoom加入的链接。

<iframe src="https://zoom.us/j/492468757"/>

攻击者只需要将上述内容嵌入到他们的网站之中,就可以导致任意Zoom的用户立即启动他们的视频。直至今日仍然是如此。

这一链接可以嵌入到恶意广告中,也可以作为网络钓鱼活动的一部分。如果我实际上是攻击者,我可能会投入一些精力来看看是否有额外的端口逻辑,也就是在Zoom的网站上是否有运行的JavaScript中的代码。

我们可以在下面的链接中,看到可以自行测试的、能正常实现漏洞测试的PoC。需要说明的是,在Mac上单击此链接,将直接启动Zoom的调用。

https://jlleitschuh.org/zoom_vulnerability_poc/

下面是一个完整的PoC,可以让用户的摄像头处于活动状态。需要说明的是,在Mac上单击此链接,将启动Zoom并激活摄像头。

https://jlleitschuh.org/zoom_vulnerability_poc/zoompwn_iframe.html

快速修复方案

为了修复该漏洞中的“自动加入视频”,我建议厂商在后端服务器上禁用会议创建者默认自动启用参与者视频的功能。我的建议并不是一个彻底的修复方案,但确实可以作为一种快速地方式来保护用户免受此攻击的影响。

除此之外,我还建议厂商确认会议主持人是否可以强制加入计算机音频的隐藏功能,如果有应该被禁用。

针对上述建议,厂商的答复如下:

Zoom认为客户有权选择他们想要的会议方式,这包括是否希望体验无缝加入会议,是否允许自动启用麦克风和视频,或者是否希望在加入会议后手动启用这些输入设备。在Zoom的会议客户端的音频和视频设置中,提供了此类配置选项。

但是,我们也意识到,一些客户希望在加入会议之前,有一个确认的对话框。根据您的建议,Zoom团队正在评估此功能,以及对用户输入设备的其他帐户级别控制。我们会让您及时了解到在这方面的后续计划。

然而,我认为需要关注的一点是,Zoom的默认设置就是允许启用相机。

最终,Zoom确实修复了这一漏洞,但他们所做的只是阻止攻击者打开用户的摄像头,并没有禁用攻击者将访问恶意站点的用户强行加入到会议中的能力。

漏洞2:拒绝服务漏洞

同样的漏洞,也允许攻击者对任意用户的主机进行拒绝服务攻击。攻击者只需要简单地重复发送错误编号的GET请求,Zoom应用程序就会不断地向操作系统请求“焦点”。下面的PoC展示了此漏洞的详细信息。

<body>
<script>
// It's actually better if this number isn't a valid zoom number.
var attackNumber = "694138052"
setInterval(function(){
  var image = document.createElement("img");
  // Use a date to bust the browser's cache
  var date = new Date();
  image.src = "http://localhost:19421/launch?action=join&confno=" + attackNumber + "&" + date.getTime();
  image.onload = function() {
    // Be tidy, clean up the DOM afterwards
    image.parentNode.removeChild(image);
  };
  document.body.appendChild(image);
}, 1);
</script>
</body>

该DoS漏洞已经在Zoom客户端的4.4.2版本上进行了修复。

漏洞3:安装漏洞

如果用户曾经在计算机上安装过Zoom,那么就会安装这一Web服务器。即使用户已经从计算机上卸载了Zoom,该服务器还是会继续运行。

除了启动通话之外,该服务器还支持更新和安装新版本的Zoom。我对Zoom Web服务器进行了一些额外的反编译,从而查看这些终端疑似调用的代码路径。

我使用了Hopper Disassembler对Web服务器的Objective-C字节码进行了反汇编,发现了以下方法。

从某些API请求获取参数,并使用参数来生成用于升级Zoom安装版本的下载URL:

7.png

该方法由以下逻辑控制。

确保下载URL仅在可信的子域名范围内:

8.png

在安装了Zoom的所有Mac上运行的Web服务器中的一个API就可以作为一个终端,允许该服务器更新,或重新安装当前版本的Zoom。

我们可以通过执行以下操作,来确认该逻辑确实存在:

1、如果尚未安装Zoom客户端,需首先在计算机上安装。

2、打开Zoom客户端,然后将其关闭。

3、通过将Applications/zoom.us.aap拖放到废纸篓来实现对Zoom客户端的卸载。

4、打开任意Zoom的加入链接,此时将会在“Applications”文件夹中重新安装Zoom,并由此Web服务器来启动。

利用应用程序内列出的可以用来下载Zoom应用程序更新的域名列表,我决定确认在访问每个站点时返回的内容。例如,这是访问https[://]zipow[.]com/upgrade?os=mac后的结果:

9.png

如果需要重新安装Zoom,我们可以清楚地看到用于下载Zoom安装程序的URL。

我对源代码中列出的所有域名进行了whois查找,得到了一些有趣的结果。举例来说,域名zoomgov.com计划在2019年5月1日到期。如果这个域名没有再继续注册,那么一旦被攻击者接管此域名,将允许在该站点托管受感染版本的Zoom安装程序,感染已经从计算机中卸载Zoom的用户。从本质上来说,这将促使该漏洞升级为远程代码执行漏洞(RCE)。我在2019年4月26日与Mozilla安全团队沟通的过程中,向Zoom团队透露了这一信息。在电话会议结束的5个小时内,我发现该域名已经被注册到2024年5月1日。

功能性安全漏洞

在我看来,网站不应该允许与这样的桌面应用程序进行通信。浏览器应该强制执行一个基础的沙箱,以防止在用户计算机上执行恶意代码。

让每个Zoom用户都拥有一个Web服务器,能够接受处罚浏览器沙箱之外代码的HTTP GET请求,这将导致Zoom成为一个巨大的目标。值得注意的是,如果我们尝试使用JavaScript AJAX请求直接启动相同的漏洞利用程序,则会遇到以下异常。

浏览器禁止来自JavaScript的所有localhost请求:

10.png

CORS-RFC1918

在与Chromium和Mozilla Firefox安全团队讨论此漏洞时,他们都表示无法对该漏洞采取任何措施。Chromium团队向我提出了CORS-RFC1918,该提案要求浏览器厂商在允许站点对本地资源(例如:localhost、192.168.1.*)发出请求之前,先查询用户的权限。

此外,我们还看到了与这一RFC文件相关的其他漏洞,Google Project Zero的Tavis Ormandy在TrendMicro的密码管理器中发现了类似的漏洞,允许通过浏览器实现远程代码执行,从而从密码保管库中泄露出用户的密码。

在我们向Mozilla Firefox团队报告相同的漏洞时,他们关闭了该漏洞,因为这严格意义上并不算是针对Firefox的漏洞。但是,他们很快又将该漏洞重新打开,将其视为针对其内部基础设施的漏洞。最后,我被邀请与Zoom和Mozilla Firefox团队进行沟通,我们在2019年4月26日讨论了该漏洞。在此次电话会议中,Zoom和Mozilla向我承诺,这一漏洞将在90天期限内得到修复。然而,事实上并没有。

Zoom的建议修复方案

Zoom团队提出的解决方案是对客户发出的请求进行数字签名。但是,攻击者面对这种方案,只需要拥有一个后端服务器,该服务器首先向Zoom站点发出请求以获得有效签名,然后再将签名转发给客户端。

Zoom团队还建议将签名与发出请求的IP进行锁定。这意味着,只要攻击者的服务位于与受害者相同的NAT路由器后面,这种攻击方式完全有效。

我向Zoom团队描述了这两种方案存在的问题。但遗憾的是,这也意味着Zoom团队只有18天时间来找到新的解决方案了。

在我的警告之后,他们仍然选择了上述的解决方案。这一新增加的签名或令牌被嵌入在名为confid的新参数中。要绕过这个新的confid检查的最简单方法,是上文所描述的iframe方案。或者,如果攻击者与受害者位于同一NAT路由器后面,可以请求加入页面,从HTML文档中提取#lhs_launch_parames字段,并将其嵌入来自恶意页面的HTML响应中。

总结

截至2015年,Zoom已经拥有超过4000万用户。考虑到Mac已经占据PC市场的10%,并且自2015年以来Zoom的用户数量已经有明显的增长,我们可以假设至少有400万的Zoom用户在使用Mac。Zoom、Google Meet或Skype for Business等工具,已经成为了现代办公中不可或缺的工具之一。

因此,在该应用程序中的任何漏洞,都必须被视为是对所有用户的严重威胁。本报告中描述的所有漏洞,都可以通过“偷渡式攻击”的方法进行利用。在我与Zoom安全团队的对话中,他们似乎多次争辩说这个漏洞的严重性是非常有限的,因为需要“用户交互”才能利用这些漏洞。对于此,我强烈建议厂商,不要仅仅因为“需要用户互动”就轻视这些漏洞,因为所谓的“用户互动”,实际上只需要点击一个链接,或者直接访问一个网页。

我认为,为了完全保护用户,需要移除这个localhost Web服务器解决方案。使用浏览器注册自定义URI处理程序(例如:zoom:// URI处理程序)等替代方法,是一种更加安全的解决方案。触发这些URI处理程序之后,浏览器会明确提示用户确认打开应用程序。根据Zoom团队的说法,这个localhost服务器继续存在的额唯一原因是Apple的Safari不支持URI处理程序。

漏洞影响

这基本上算是0-Day漏洞。遗憾的是,Zoom没有在90天之内完成漏洞修复工作,而这一期限是目前的行业标准。因此,超过四百万用户的隐私正处于风险之中。

此外,由于缺乏足够的自动更新功能,许多用户在新版本发布后的几个月内继续运行过时的Zoom版本,这使得他们很容易受到类似的攻击。

用户自行修复方案

如果用户希望自行修复此漏洞,可以执行以下操作。

禁用Zoom在加入会议时打开网络摄像头的功能。

11.png

或者,在终端(Terminal)中输入以下命令:

# For just your local account
defaults write ~/Library/Preferences/us.zoom.config.plist ZDisableVideo 1
# For all users on the machine
sudo defaults write /Library/Preferences/us.zoom.config.plist ZDisableVideo 1

要关闭服务器,请运行lsof -i :19421以获取进程的PID,然后执行kill -9 [进程编号]。随后,就可以删除~/.zoomus目录,以删除Web服务器应用程序文件。

要防止在更新后重新恢复此服务器,我们可以在终端中执行以下操作:

# To prevent the vulnerable server from running on your machine
# (this does not impact Zoom functionality), run these two lines in your Terminal.
 
pkill "ZoomOpener"; rm -rf ~/.zoomus; touch ~/.zoomus && chmod 000 ~/.zoomus;
 
pkill "RingCentralOpener";  rm -rf ~/.ringcentralopener; touch ~/.ringcentralopener && chmod 000 ~/.ringcentralopener;
 
# (You may need to run these lines for each user on your machine.)

完整修复方案

下面是关于如何在Windows和Mac上解决此问题的完整说明。

如果用户使用的是macOS,请运行以下命令:

pkill "ZoomOpener"; rm -rf ~/.zoomus; touch ~/.zoomus && chmod 000 ~/.zoomus;
pkill "RingCentralOpener"; rm -rf ~/.ringcentralopener; touch ~/.ringcentralopener && chmod 000 ~/.ringcentralopener;

这两个命令对Zoom旗下两大流行品牌Zoom和RingCentral的产品有效。如果隐藏的服务器正在运行,上述命令首先会将其关闭,然后将其删除。最后,他们创建一个空文件并设置权限,使隐藏的服务器无法再重新安装回该位置。对于这些应用程序的当前版本,上述措施已经足够。然而,我们不排除更高版本有可能会破坏此修复程序。

如果用户在macOS上面使用的是Safari浏览器,那么至此已经完成了修复所需的步骤。但是,如果用户使用了第三方浏览器,目前仍然可以通过链接立即打开Zoom。下面是第三方浏览器的修复方式。

针对Chrome:

1、导航到chrome://version/,找到“Profile Path”下面列出的路径。

2、退出Chrome,打开该目录,然后打开“首选项”文件。

3、这是一个JSON文件。查找其中是否存在字符串"zoommtg":false或"zoomrc":false。如果存在,请删除它们。如果在上述字符串后面带有逗号,也需要一并将逗号删除。

4、保存文件。

针对Firefox:

1、打开Firefox的Preferences(首选项);

2、使用“Find in Preferences”搜索字符串zoommtg或zoomrc。

3、如果看到包含头部为“Content Type”和“Action”的表,需要找到其中标记为zoommtg和zoomrc的行,并将操作设置为“始终询问”。

在任何情况下,都应该避免在模式对话框中选中“以后再次使用此行为”。Safari是目前唯一已知安全的浏览器,不允许用户以这种方式来产生风险。

面向研究人员的提示

考虑到Zoom有大量的用户,我强烈建议其他研究人员能够花费一定精力来探索此Zoom Web服务器,从而确认是否存在其他漏洞。尽管如此,我不建议任何在Zoom软件中发现漏洞的研究人员直接向厂商报告漏洞。相反,我建议研究人员通过Zero Day Initiative(ZDI)报告这些漏洞。ZDI披露计划为厂商提供了120天的修复时间来解决漏洞,他们也将向研究人员支付费用,同时支持研究人员公开披露他们的研究结果。

如果大家要尝试对Zoom客户端应用程序进行反编译,其目录位于计算机的~/.zoomus路径下。

我的PoC示例的源代码库可以在GitHub上查看到。

时间线

2019年3月8日  通过Twitter尝试与厂商取得联系(无答复)。

2019年3月26日  通过电子邮件的方式联系Zoom Inc,确认公开披露的截止日期为90天,并向厂商提供“快速修复解决方案”。

2019年3月27日  由于该厂商的漏洞奖励计划中标明,即使在该漏洞被修复后,也不能公开披露,因此拒绝了厂商针对该漏洞提供的经济奖励。

2019年4月1日  与厂商确认该漏洞情况。

2019年4月5日  Zoom安全工程师回复邮件,确认漏洞存在,并讨论了漏洞的严重程度,确定CVSSv3评分为5.2/10。

2019年4月10日  向Chromium安全团队披露了漏洞。

2019年4月18日  根据Chromium团队给出的建议,对Zoom进行了更新。

2019年4月19日  向Mozilla Firefox安全团队披露了漏洞。

2019年4月26日  与Mozilla和Zoom安全团队进行视频通话,讨论关于DNS到期的详细信息。

2019年6月7日  收到Zoom的电子邮件,讨论关于此前视频通话中提到的修复方案。

2019年6月11日  与Zoom安全团队进行视频通话,就即将披露漏洞详情开展讨论,同时详细说明Zoom计划发布的补丁中存在的缺陷。

2019年6月20日  计划与Zoom安全团队进行另一次视频通话,由于日程冲突,没有成功进行。

2019年6月21日  Zoom反馈漏洞已经得到修复。

2019年6月24日  90天公开披露时限到期,确认漏洞已经按照“快速修复”的解决方案得到修复。

2019年7月7日  由于修复中存在回滚的问题,导致摄像头漏洞再次出现。

2019年7月8日  回滚问题已经修复,发现并披露了变通修复方式,公开披露本文章。

本文翻译自:https://medium.com/bugbountywriteup/zoom-zero-day-4-million-webcams-maybe-an-rce-just-get-them-to-visit-your-website-ac75c83f4ef5如若转载,请注明原文地址: https://www.4hou.com/business/19157.html
点赞 3
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论