高通QCMAP发现主要漏洞

高通QCMAP发现主要漏洞

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

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

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

高通QCMAP -技术背景

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

高通QCMAP -技术背景

来源:高通网站

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

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

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

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

QCMAP服务通常通过web配置:

QCMAP服务

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

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

请从下面列出的选项中选择要测试的选项。1.显示当前配置49。获取UPnP状态2。删除SNAT表项50。获得DLNA状态3。添加SNAT条目51。获取MDNS Status 4。获取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…”。第一个变量应该是“page”变量。如果设置为“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 = system(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二进制文件中,并与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”函数的字符串数组(二维字符数组)。由于数组的变量空间有限,因此在一定量的变量之后,数据将溢出缓冲区。由于对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的命令行接口(CLI)实用程序。在这个命令行中,用户可以更改设备的不同设置。

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

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

addr。S_addr = htonl(this->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和VD-1873重复上述步骤,分别调用PoC和检查崩溃,以及调用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@m.si-fil.com与我们联系。

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