虹科案例|安全性防护平台-高通QCMAP发现的主要漏洞

         在最近的供应链安全评估中,虹科Vdoo分析了多个网络设备的安全漏洞和暴露。在分析过程中,我们发现并负责地披露了这些设备所基于的高通QCMAP(移动接入点)体系结构中的四个主要漏洞。利用这些漏洞,攻击者可以获得对任何受影响设备的远程根访问权。

         QCMAP架构在大多数现代基于高通的调制解调器soc上使用,如MDM9xxx系列。这使我们估计,这些问题可能会影响数以百万计的不同类型的设备在野外。

         在这篇文章中,我们将讨论漏洞的技术细节、发现过程并提供检测和解决问题的指导。在文章最后描述了我们与Qualcomm团队的披露过程,并提供了修复问题的补丁。

         下面详细介绍的第一个和第二个漏洞已经被高通分配了相同的CVE编号(CVE-2020-3657),并在具有严重影响的Android安全公告中列出(Android bug id A-153344684)。

一、高通QCMAP -技术背景

         高通生产的soc的MDM(移动数据调制解调器)系列在一个包中提供各种移动连接特性。

         在许多基于MDM的设备上运行的软件套件之一是QCMAP套件。QCMAP (Qualcomm Mobile Access Point)是一套负责在移动接入点上运行多项服务的软件套件,包括以下关键组件:

  • 一个轻量级的基于pd的web界面(包含专有的CGI脚本和认证机制)
  • 基于minidlna的媒体服务器(支持UPnP和mDNS自动配置)
  • 基于iptables的防火墙接口

         使用QCMAP的调制解调器芯片组广泛应用于各种产品类型和行业,包括网络设备,如移动热点和LTE路由器;汽车信息娱乐/TCU单元;用于工业设备的智能适配器、智能计量设备、智能医疗设备和物联网网关。

         QCMAP服务通常通过以下方式进行配置:MD

         或者,通过一个专用的命令行接口,由QCMAP_CLI二进制文件实现:

         我们已经在许多设备固件图像中看到了QCMAP的实现,例如已经经过分析的以下模型:

  • 中兴通讯MF920V
  • TP-Link M7350(在该设备中,QCMAP二进制文件被修改,没有发现漏洞)
  • 美国网件公司AC785

二、供应链安全评估的发现

         这些问题突出了识别和评估供应链对安全的重要程度。该问题是在虹科Vdoo分析作为作战网络的一部分,部署在现场的固件图像时发现的。这些设备是由第三方高通调制解调器的设备供应商开发的,网络运营商对第三方组件的使用或其潜在的漏洞(已知和未知)一无所知。

         这一发现还展示了自动深入二进制分析在识别新的零日漏洞(即使是在闭源组件中)方面的威力和价值。在这种情况下,运营商使用Vdoo平台对从供应商接收到的固件图像进行自动分析。平台为设备生成完整的SBOM (software bill of materials),包括第一方和第三方部件。所有的设备软件组件,包括高通的QCMAP二进制文件,都被扫描和分析潜在的零日漏洞。虹科Vdoo研究团队对这些潜在漏洞进行了验证,并向高通披露以减轻风险。

三、漏洞细节

         下文深入描述所分析的QCMAP二进制文件中的漏洞。具体来说,我们涉及到体系结构的web服务和连接多个体系结构服务的主二进制文件(QCMAP_ConnectionManager)中的漏洞。本文中的代码片段来自于公开的信息。这些漏洞包括QCMAP web服务器中的堆栈缓冲区溢出(CWE-121)和NULL dereference(空指针异常)(CWE-476),以及命令行接口和连接管理组件中的两个命令注入(CWE-78)。漏洞是否存在和严重程度由使用该体系结构的制造商的具体情况决定。例如,除了易受攻击的设备,有一部分设备根本没有运行易受攻击的服务,而在其他的设备中,一些易受攻击的二进制文件被修改或不存在。

1.VD-1873 / CVE-2020-3657 -命令注入漏洞(CVSSv3 8.8)

         这是我们发现的最严重的问题,因为它很容易导致远程代码执行(尽管有身份验证)。问题存在于QCMAP_ConnectionManager二进制文件中。请注意,HTTPS在web服务器中的使用取决于设备供应商(我们已经在不同的设备中看到有同时使用HTTPS和HTTP)。如果不使用HTTPS, web身份验证很容易被本地网络攻击者绕过。

         媒体服务器的基本功能包含允许用户设置需要发布的媒体目录。例如,可以通过网络界面来实现以下操作:

        在实现层面,CGI -bin/qcmap_web_cgi的CGI处理程序将数据从web表单传递给QCMAP_Web_CLIENT二进制文件,后者解析请求。发送的数据的格式应该是“var1=val1&var2=val2& var3=val3…”。第一个变量应该是“page”变量。如果它被设置为” SetMediaDir “,代码解析下一个变量来设置DLNA媒体目录。然后它将变量发送到QCMAP_ConnectionManager二进制文件,该文件处理函数qmi_qcmap_msgr_set_dlna_media_dir中的请求,并将其传递给QCMAP_MediaService::SetDLNAMediaDir。在这个函数中,代码以“,”字符分割已发送的目录,对于每个部分,它调用snprintf创建一个命令,然后将该命令作为参数发送给系统函数。没有对用户输入进行检查以确保它不包含恶意字符,因此可以传递一个带有shell元字符的字符串(例如’;’)并运行任意命令。

        为了验证此问题,使用此URL调用web接口:http://x.x.x.x/cgi-bin/qcmap_web_cgi?page=SetMediaDir&dir=fakedir;sleep%2010

2.VD-1871 / CVE-2020-3657 –栈缓冲区溢出漏洞(CVSSv3 7.6)

         此问题驻留在QCMAP_Web_CLIENT二进制文件中,并被高通与VD-1873一起编号为CVE-2020-3657,因为它们驻留在相同的函数中,尽管它们是一个完全不同的漏洞,具有不同的CVSSv3得分7.6。

         QCMAP包含几个CGI二进制文件,这些文件可以被web服务器提供的相应页面调用。web服务器的其中一个页面是cgi-bin/qcmap_web_cgi。这个页面检查用户是否有一个有效的会话,然后将读取的信息发送给CMAP_Web_CLIENT二进制文件。

         QCMAP_Web_CLIENT解析数据并执行所选择的操作。发送的数据的格式应该是“var1=val1&var2=val2& var3=val3…”。Tokenizer函数是负责解析这种格式的。函数接受变量名和值,并将它们复制到由main函数发送给它的输出缓冲区中。代码并不检查实际传递了多少个变量,相反,它会一直运行,直到读取完变量并将它们复制到缓冲区中。该缓冲区是来自“main”函数的字符串数组(二维字符数组)。由于数组的变量空间有限,在一定数量的变量之后,数据将溢出缓冲区。由于对Tokenizer函数的调用是在“main”函数的无限循环中完成的,因此传统的返回地址重写通常是不可能的,然而——取决于具体的体系结构——可能有多种方法可以利用这个问题来获得代码执行。

         请注意,字符串的复制是通过调用strncpy函数,用源缓冲区的长度而不是目标缓冲区的长度来完成的,这相当于一个简单的strcpy调用,没有任何安全优势。

        与许多嵌入式设备一样,我们测试的所有设备都没有启用关键的编译器安全缓解功能(Stack canary支持、独立位置的可执行文件、FORTIFY-SOURCE等)。这使得这个漏洞(以及下一个漏洞CVE-2020-25858)更容易被利用来执行代码,使攻击者能够完全控制设备,并能够运行任意恶意代码,而不是仅仅破坏脆弱的进程。

3.VD-1872 / CVE-2020-25858 – NULL指针异常漏洞(CVSSv3 6.5)

         这个问题存在于QCMAP_Web_CLIENT二进制文件中。在前面提到的Tokenizer函数中,调用strstr函数来搜索“=”字符,并且使用它的返回值而不检查。在一些实现中,我们已经看到strstr的调用被strchr的调用所取代。在这两种情况下,如果没有“=”字符,函数将返回NULL,导致NULL指针引用异常进而导致进程崩溃。

       使用下面的URL调用web接口验证该观点: http://x.x.x.x/cgi-bin/qcmap_web_cgi?a

4.VD-1874 / CVE-2020-25859 –命令注入漏洞(CVSS v3 7.9)

        此问题存在于QCMAP_CLI二进制文件中。QCMAP包含一个名为QCMAP_CLI的命令行接口(CLI)实用程序。在这个CLI中,用户可以更改设备的不同设置。

         一个可能的选项是设置网关URL。当设置URL时,set请求被发送到函数qmi_qcmap_msgr_set_gateway_url的QCMAP_ConnectionManager二进制文件,该函数在某个时刻调用QCMAP_LAN::EnableGatewayUrl函数。在这个函数中,代码调用snprintf创建一个包含URL的字符串,然后调用系统函数创建一个新进程,但是没有对用户输入进行检查以确保它不包含恶意字符,因此可以传递一个带有shell元字符的字符串(例如’;’)并运行任意命令。

        这个问题在我们看到的一些函数的实现中出现了两次。

对于概念的证明执行下面的步骤:

(1)运行QCMAP_CLI二进制文件

(2)输入:82 <回车>

(3)输入:1 <回车>

(4)输入:www;sleep 10 <回车>

四、风险评估

        据我们所知,这些漏洞还没有被大肆利用,因此还没有对已部署的设备造成任何具体的安全威胁。然而,正如上面的问题证明章节所显示的那样,只要具备技术知识,利用漏洞进行攻击是轻而易举的。我们将继续密切监控任何滥用该漏洞的行为,并通过Vision的威胁情报feed Whistler向Vdoo Vision用户发出警报。

五、识别脆弱的设备

         据我们所知,由于这些易受攻击的文件没有可识别的版本信息,所以这个问题并不能直接检测出来。如果您可以访问一个正在运行的设备,按照以下步骤检查您的设备是否容易受到攻击:

  • 通过尝试直接连接或对相关端口执行端口扫描,验证设备正在运行web服务器。
  • 成功登录到web服务器(允许cookie)后,您的浏览器将在设备上有一个有效的会话。现在尝试执行VD-1871的PoC。如果QCMAP_Web_CLIENT进程似乎崩溃(例如,web服务器超时),您的设备是脆弱的。
  • 对VD-1872重复上述步骤,调用PoC并检查崩溃,对VD-1873调用PoC并检查响应中的延迟。
  • 找到QCMAP_Web_CLIENT二进制文件并检查其SHA-256是否为以下其中之一:

71311beee4c761f85d46eaadab475541455adbd135f3c868c0800b1703378755
5f19143efa90161bde6eb129f7b43bdf0a25e86ae7a749dc13b7ea645aa590f5
e6d505c80de7ccce0cf297715f67e0efbbc30e7427a846ea04d64af1a9e77dae
0079e76c4c9ca3668789fd4c58c24e66519365c86479f0d7477980d0b6422eed
0a51f755716a688225573ca4cae469acdf6c6350d83d19098580e8e295692668

         如果是的话,你的设备可能会受到攻击。

  • 如果您运行的是基于高通MDM的Android设备,请确保您的安全补丁级别更新到2020年10月(或更新)。

         虹科Vdoo平台作为平台安全分析能力的一部分,能够通过自动扫描设备二进制图像,快速检测设备暴露于上述问题。如果您怀疑自己可能会受到攻击,请随时联系我们寻求帮助。

六、减轻受影响设备上的漏洞

        如果您的设备被发现存在漏洞,且无法更新或修补固件,则可采用以下缓解技术:

  1. 如果你的设备不需要连接网络,考虑断开连接。
  2. 如果设备必须连接到网络,请确保通过防火墙阻止对web端口的访问,并确保这些端口不被转发到外部网络。
  3. 如果您可以在外围保护后部署一个包含WAF的设备,请将其配置为检查包含40个以上查询参数的url。

七、披露过程

        在2020年6月向高通PSIRT披露这些漏洞后,他们回复说他们已经发现这些漏洞,并在2019年进行了修补,他们计划在2020年10月公开披露它们。这两个被分配到CVE-2020-3657的漏洞在谷歌2020年10月的Android安全公告中列出。