发现高通QCMAP的主要漏洞

发现高通QCMAP的主要漏洞

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

QCMAP体系结构在大多数基于qualcomm的现代soc上都在使用,例如MDM9xxx系列。这让我们估计,这些问题可能会潜在地影响数百万种不同类型的设备。

在这篇博客文章中,我们将讨论这些漏洞的技术细节以及我们是如何发现它们的,并提供如何检测和解决它们的指导。最后,我们描述了我们与高通团队的披露过程,他们意识到这些问题,并提供了补丁,可用于修复脆弱设备上的问题。下面详细介绍的第一和第二个漏洞被高通分配了相同的CVE编号(CVE-2020-3657),并在Android安全公告严重影响(Android bug id A-153344684)。

高通QCMAP -技术背景

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

高通QCMAP -技术背景

来源:高通公司网站

在许多基于mdm的设备上运行的软件套件之一是QCMAP套件。

QCMAP是一个软件套件,负责运行移动接入点中的许多服务,其中包括以下关键组件:

  1. 基于lighttpd的web界面(带有专有的CGI脚本和身份验证机制)
  2. 基于minidlna的媒体服务器(支持UPnP和mDNS自动配置)
  3. 基于iptables的防火墙接口

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

QCMAP服务通常通过web配置:

QCMAP服务

来源:QCMAP web配置主页(index.html)

或者,通过一个专用的命令行界面,由QCMAP_CLI二进制实现:

➜rootfs> usr/bin/QCMAP_CLI请从下面列出的项目中选择一个选项进行测试。1.显示当前配置获取UPnP状态2。删除SNAT表项50。获取DLNA状态3。添加SNAT表项51。获取MDNS Status。获取SNAT配置52。获取工作站模式状态 Set Roaming 53. Set DLNA Media Directory 6. Get Roaming 54. Get DLNA Media Directory 7. Delete DMZ IP 55. Set MobileAP/WLAN Bootup Config 8. Add DMZ IP 56. Get MobileAP/WLAN Bootup Config 9. Get DMZ IP 57. Enable/Disable IPV4 10. Set IPSEC VPN Passthrough 58. Get IPv4 State 11. Get IPSEC VPN Passthrough 59. Get Data Bitrate 12. Set PPTP VPN Passthrough 60. Set UPnP Notify Interval 13. Get PPTP VPN Passthrough 61. Get UPnP Notify Interval 14. Set L2TP VPN Passthrough 62. Set DLNA Notify Interval 15. Get L2TP VPN Passthrough 63. Get DLNA Notify Interval 16. Set Autoconnect Config 64. Add DHCP Reservation Record 17. Get Autoconnect Config 65. Get DHCP Reservation Records 18. Get WAN status 66. Edit DHCP Reservation Record 19. Add Firewall Entry 67. Delete DHCP Reservation Record 20. Enable/Disable M-DNS 68. Activate Hostapd Config 21. Enable/Disable UPnP 69. Activate Supplicant Config 22. Enable/Disable DLNA 70. Get Webserver WWAN access flag 23. Display Firewalls 71. Set Webserver WWAN access flag 24. Delete Firewall Entry 72. Enable/Disable ALG 25. Get WWAN Statistics 73. Set SIP server info 26. Reset WWAN Statistics 74. Get SIP server info 27. Get Network Configuration 75. Restore Factory Default Settings(** Will Reboot Device ) 28. Get NAT Type 76. Get Connected Device info 29. Set NAT Type 77. Get Cradle Mode 30. Enable/Disable Mobile AP 78. Set Cradle Mode 31. Enable/Disable WLAN 79. Get Prefix Delegation Config 32. Connect/Disconnect Backhaul 80. Set Prefix Delegation Config 33. Get Mobile AP status 81. Get Prefix Delegation Status 34. Set NAT Timeout 82. Set/Get Gateway URL 35. Get NAT Timeout 83. Enable/Disable DDNS 36. Set WLAN Config 84. Set DDNS Config 37. Get WLAN Config 85. Get DDNS Config 38. Activate WLAN 86. Enable/Disable TinyProxy 39. Set LAN Config 87. Get TinyProxy Status 40. Get LAN Config 88. Set DLNAWhitelisting 41. Activate LAN 89. Get DLNAWhitelisting 42. Get WLAN Status 90. Add DLNAWhitelistingIP 43. Enable/Disable IPV6 91. Delete DLNAWhitelistingIP 44. Set Firewall Config 92. Set UPNPPinhole State 45. Get Firewall Config 93. Get UPNPPinhole State 46. Get IPv6 State 94. Configure Active Backhaul Priority 47. Get WWAN Profile 95. Get Backhaul Priority 48. Set WWAN Profile 96. Teardown/Disable and Exit

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

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

通过软件供应链安全评估发现

这些问题突出了识别和评估的重要性软件供应链安全.这些问题是在JFrog安全研究团队(以前的Vdoo)分析作为作战网络的一部分部署在现场的固件映像时发现的。这些设备是由基于第三方高通调制解调器的供应商开发的。网络运营商对第三方组件的使用情况或其潜在漏洞(已知和未知)的可见性为零。

这一发现证明了自动化深度的力量和价值二元分析在识别闭源组件中的新的零日漏洞时。使用SCA工具对于Vdoo(现在是JFrog的一部分)提供的自动安全分析功能,运营商分析从供应商收到的固件图像。所有设备软件组件,包括高通的QCMAP二进制文件,然后被扫描和分析潜在的零日漏洞。我们自己的研究团队对这些潜在漏洞进行了验证,然后向高通披露以进行缓解。

漏洞细节

在本节中,我们将对所分析的QCMAP二进制文件中的漏洞进行深入描述。具体来说,我们涉及到体系结构的web服务和连接多个体系结构服务的主二进制文件(QCMAP_ConnectionManager)中的漏洞。本文中的代码片段来自公开的信息。漏洞包括QCMAP web服务器中的基于堆栈的缓冲区溢出(CWE-121)和NULL解引用(CWE-476),以及CLI和连接管理器组件中的两次命令注入(CWE-78)。漏洞的存在和严重程度取决于使用此体系结构的每个制造商的具体实现。例如,除了完全易受攻击的设备之外,我们研究的一些设备根本没有运行易受攻击的服务,而在另一些设备中,一些易受攻击的二进制文件被修改或丢失了。

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

这是我们发现的最严重的问题,因为它很容易导致远程代码执行(尽管经过验证)。问题存在于QCMAP_ConnectionManager二进制文件中。

注意,在web服务器中使用HTTPS取决于设备供应商(我们已经看到在不同的设备中使用HTTPS和HTTP)。如果不使用HTTPS, web身份验证很容易被本地网络攻击者绕过。

媒体服务器的部分基本功能是允许用户设置要发布的媒体目录。这可以通过web界面来实现:

命令注入漏洞

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

Token = strtok_r(media_dir, ",", &ptr);while (token != NULL){/*删除前导空格*/ str_start = token;在((* str_start ! = ' \ 0 ') & & (* str_start  == ' ')) { ++ str_start;} if (str_start != token) /*如果前导空间存在*/ memmove(token, str_start, strlen (str_start)+1);} /*删除前导空间结束*/ snprintf(tmp, sizeof(tmp), "%s%s%s", bef, token, aft);ret =系统(tmp);token = strtok_r(NULL, ",", &ptr);}

为了验证概念,请使用以下URL调用web界面-

http://x.x.x.x/cgi-bin/qcmap_web_cgi?page=SetMediaDir&dir=fakedir;sleep%2010

VD-1871 / CVE-2020-3657 -基于堆栈的缓冲区溢出漏洞(CVSSv3 7.6)

该问题驻留在QCMAP_Web_CLIENT二进制文件中,并被高通与dvd -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调用,没有任何安全好处。

Ch = strtok_r(buf, "&",&saveptr);while (ch != NULL) {strncpy(columns,ch,strlen(ch)+1);[我]strncpy(字段,ch, strlen (ch) + 1);ch2 = strstr(列," = ");strncpy(值[我],ch2 [1], strlen (ch2 [1]) + 1);//strtok_r可重入,这样上下文切换不会导致数据丢失。ch = strtok_r(NULL, "&",&saveptr);我+ +;}

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

为了验证概念,请使用以下URL调用web界面-

http://x.x.x.x/cgi-bin/qcmap_web_cgi?a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b&a=b

VD-1872 / CVE-2020-25858 -空指针解引用漏洞(CVSSv3 6.5)

此问题存在于QCMAP_Web_CLIENT二进制文件中。

在前面提到的Tokenizer函数中,调用strstr函数来搜索' = '字符,并使用其返回值而不进行检查。在几个实现中,我们看到对strstr的调用被对strchr的调用所取代。在这两种情况下,如果没有' = '字符,函数将返回NULL,导致NULL指针解引用。这会导致进程崩溃。

Ch = strtok_r(buf, "&",&saveptr);while (ch != NULL) {strncpy(columns,ch,strlen(ch)+1);[我]strncpy(字段,ch, strlen (ch) + 1);ch2 = strstr(列," = ");strncpy(值[我],ch2 [1], strlen (ch2 [1]) + 1);//strtok_r可重入,这样上下文切换不会导致数据丢失。ch = strtok_r(NULL, "&",&saveptr);我+ +;}

为了验证概念,请使用以下URL调用web界面-

http://x.x.x.x/cgi-bin/qcmap_web_cgi?a

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

此问题存在于QCMAP_CLI二进制文件中。

QCMAP包含一个名为QCMAP_CLI的命令行接口实用程序。在这个命令行中,用户可以更改设备的不同设置。

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

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

addr。s_addr = htonl(——> lan_cfg.apps_ip_addr);strlcpy (a5_ip inet_ntoa (addr) QCMAP_LAN_MAX_IPV4_ADDR_SIZE);snprintf(command, MAX_COMMAND_STR_LEN, "echo %s %s >> %s",a5_ip, this->lan_cfg.gateway_url,QCMAP_HOST_PATH);ds_system_call(命令,strlen(命令));

要进行概念验证,请执行以下步骤-

  1. 运行QCMAP_CLI二进制文件
  2. 输入:82 <输入>
  3. 输入:1 <输入>
  4. 输入:www;sleep 10

风险评估

据我们所知,这些漏洞尚未被广泛利用,因此尚未对部署的设备造成任何具体的安全威胁。然而,如上面的概念片段证明所示,考虑到技术知识,开发是微不足道的。我们将继续密切监视任何滥用此漏洞的行为,并将相应地更新此博客文章。

识别脆弱的设备

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

  • 通过尝试直接连接或对相关端口执行端口扫描来验证设备正在运行web服务器。
  • 成功登录到web服务器(允许cookie)后,您的浏览器将在设备上有一个有效的会话。现在尝试为VD-1871执行PoC。如果QCMAP_Web_CLIENT进程似乎崩溃了(例如,web服务器超时),那么您的设备就很容易受到攻击。
  • 对VD-1872重复上面的步骤,调用PoC并检查崩溃,对VD-1873重复调用PoC并检查响应中的延迟。
  • 找到QCMAP_Web_CLIENT二进制文件,检查它的SHA-256是否为以下其中之一:
    71311 beee4c761f85d46eaadab475541455adbd135f3c868c0800b1703378755
    5 f19143efa90161bde6eb129f7b43bdf0a25e86ae7a749dc13b7ea645aa590f5
    e6d505c80de7ccce0cf297715f67e0efbbc30e7427a846ea04d64af1a9e77dae
    0079年e76c4c9ca3668789fd4c58c24e66519365c86479f0d7477980d0b6422eed
    0 a51f755716a688225573ca4cae469acdf6c6350d83d19098580e8e295692668

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

减少受影响设备上的漏洞

如果您的设备被发现是易受攻击的,而无法更新或打补丁固件,则可以应用以下缓解技术:

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

信息披露过程

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

问题吗?想法吗?有关安全漏洞的任何咨询请通过research@www.si-fil.com联系我们。

除了将发现和负责任地披露漏洞作为我们日常活动的一部分外,JFrog安全研究团队还通过授权组织通过自动安全分析发现漏洞来提高软件安全性。有关JFrog DevOps平台安全特性的更多信息和更新-点击这里