Zoom会议系统曝出高危漏洞,或影响400万电脑摄像头

Zoom会议系统曝出高危漏洞,或影响400万电脑摄像头_第1张图片

Mac版本的Zoom客户端中存在漏洞,一旦点击特定的恶意网站,就可在未经你许可的情况下启用你的摄像头。这一漏洞可能会危害世界上75万家使用Zoom进行业务交流的公司。

漏洞

  • DOS漏洞——已在版本4.4.2中被修复

  • 信息披露(网络摄像头)——尚未修复

前言

此漏洞允许恶意网站在未经用户许可的情况下,激活他们的摄像头,强制加入到某个Zoom的会议中。

除此之外,此漏洞还允许任意网页通过不断把用户加入一个无效会议以DoS(拒绝服务)安装了Zoom的Mac机器。

此外,如果你安装了Zoom客户端,然后将其卸载,此时你的计算机上仍然有一个localhostWeb服务器,一旦你访问某个网页,它就会迅速为你重新安装Zoom客户端。这个特殊的功能直到现在依然有效。

此漏洞始于Zoom的一项简单功能,即:当你向任何人发送会议链接时(例如[https://zoom.us/j/492468757](https://zoom.us/j/492468757)),一旦他们在浏览器中打开,他们的Zoom客户端就会自动运行。我很好奇这一惊人的功能是如何实现的,以及它的安全性如何。但我后来发现,这个功能确实有很大的安全问题。我也一时找不到好方法去修复它。

该漏洞最初是在2019年3月26日给Zoom通报的。初始的漏洞报告中包括了一个快速修复建议描述,只要简单地更改代码逻辑即可实现。Zoom花了10天时间来确认漏洞。而关于如何修补漏洞的第一次实际讨论发生在2019年6月11日。在这次会议中,确认了漏洞的细节,并讨论了Zoom的解决方案。然而,我很容易便在他们修复方法中发现了绕过方法。此时,Zoom距离漏洞公开时间(90天)只剩下18天。而在90天之后的6月24日,也就是漏洞公开截止日期前的最后一天,我发现Zoom采用了我最初的“快速修复”方案。

所以,Zoom未能彻底解决、定位这个漏洞,仅仅做出了些临时处理。拥有如此庞大用户群的公司应该在保护客户安全方面更加主动。

时间线

  • 2019年3月8日——通过Twitter联系(无回复)。
  • 2019年3月26日——通过电子邮件联系Zoom,指明漏洞公开时间段为90天,并提供“快速修复”解决方案。
  • 2019年3月27日——收到回复,表示Zoom安全工程师不在办公室,并表示由于政策,即使在漏洞被修补后也不能公开细节,并拒绝提供奖励。
  • 2019年4月1日——要求确认漏洞。
  • 2019年4月5日——Zoom的安全工程师确认了漏洞。CVSS v3评分为5.2/10。
  • 2019年4月10日——向Chromium安全团队披露了漏洞。
  • 2019年4月18日——根据Chromium团队的建议更新了Zoom。
  • 2019年4月19日——向Mozilla FireFox安全团队披露了漏洞。
  • 2019年4月26日——与Mozilla和Zoom安全团队进行了视频通话。
  • 2019年6月11日——与Zoom安全团队进行视频通话。讨论了Zoom的安全更新的缺陷。
  • 2019年6月21日——Zoom报告漏洞得到修复。
  • 2019年6月24日——已过90天,确定使用我的“快速修复”方案。
  • 2019年7月8日——漏洞修复,细节公开。

细节

如果你的Mac安装了Zoom,那么在本地端口19421上就会运行着Web服务器。你可以通过lsof -i :19421命令进行确认。

首先,在本地机器上安装一个未知的Web服务就是很荒谬。其次,我访问的任何网站都可以与运行在我机器上的Web服务器进行交互,就更是不可理喻。相关代码如下:

在这里插入图片描述

当我最初得知这个Web服务存在时,立马想到如果这个Web服务的参数处理存在缓冲区溢出,那么别人就能远程控制我的机器。

在我访问其中一个Zoom的会议加入“连接”([https://zoom.us/j/492468757](https://zoom.us/j/492468757))时,查看浏览器的开发人员控制台内容,可发现如下内容:

Zoom会议系统曝出高危漏洞,或影响400万电脑摄像头_第2张图片

我还发现,这个页面不是发出常规的Ajax请求,而是从本地运行的Zoom的Web服务中加载图像。图像的不同维度代表服务器的错误/状态代码。你可从下面代码看到详细情况,其中前面的两个数字代表返回的图像像素尺寸:
Zoom会议系统曝出高危漏洞,或影响400万电脑摄像头_第3张图片

可怕的是,这个Web服务可以做的远不止启动一个Zoom会议。我发现即使用户卸载了Zoom,这个Web服务也可以“帮助”用户重新安装,稍后会详细介绍。

为什么这个Web服务返回的数据要以图像文件进行表示?很明显,这样做是为了绕过CORS(跨域资源共享)。

Chrome不支持本地主机的CORS请求。
https://stackoverflow.com/questions/10883211/deadly-cors-when-http-localhost-is-the-origin

不管怎样,Zoom这一举措也很不安全。

会议加入漏洞

我用另一个帐户创建了一个个人会议,并用Postman开始抓包和改包,尝试启动Zoom会议所需的最简短GET请求。

经过一系列摸索,发现以下两个最重要的参数。

  • action=join

  • confno=[无论会议号码是什么]

访问如下请求,我成功进入另一个帐户创建的Zoom会议。

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

一旦有了这个突破口,我就开始寻找可以用这个链接所进行的其他动作。我甚至翻阅了各种公共文档,但还是没任何收获。由于这个Web服务完全没有官方文档记录,所以也算预料之中。

所以,我现在可以强迫任何用户加入我的会议,但音频/视频有另外的设置,不一定能启用。

直到现在,你仍然可以使用该“链接”来强迫他人加入某个会议。

不久后,我了解到Tenable Remote Code Execution in Zoom Security漏洞,该漏洞是在6个月前被修复。如果将这个Tenable漏洞与此漏洞结合在一起,则可针对安装了Zoom的Mac机器实行远程代码攻击。

因此,将来如果发现类似的漏洞,也可和我这个漏洞进行结合,对任何访问了恶意网站的用户实行远程代码攻击。在此,我建议任何仍在使用ZOOM 4.1.33259.0925或更低版本的用户迅速升级软件。

到目前为止,我只是强制让他人加入会议,并没有直接的安全威胁。我开始想如何才能激活他人的摄像头。不久后,我发现了如下设置,您可以选择在参与者加入会议时启用其摄像头
Zoom会议系统曝出高危漏洞,或影响400万电脑摄像头_第4张图片

只要启用这个设置,任何加入会议的人都会自动发送视频。

经过实验后,发现这个设置对所有参与者有效。

PoC

本地的Web服务是自动作为后台进程运行,因此,只要用户点击了恶意网页,不管运不运行Zoom,攻击都能生效。