CVE-2021-45608 | NetUSB RCE漏洞

CVE-2021-45608 | NetUSB RCE漏洞

执行摘要

  • SentinelLabs 在大量网络设备供应商使用的 KCodes NetUSB 内核模块中发现了一个严重漏洞,此漏洞影响了数百万最终用户路由器设备。
  • 攻击者可以远程利用此漏洞在内核中执行代码。
  • SentinelLabs 于 9 月 9 日开始披露流程,补丁于 10 月 4 日发送给供应商。
  • 目前,SentinelOne 尚未发现野外滥用的证据。

介绍

随着我的一些项目开始,当我听说 Pwn2Own Mobile 2021 已经宣布时,我开始着手研究其中一个目标。Netgear 设备在 2019 年的比赛中出现时,我没有看过它,所以我决定看看它。

在通过各种二进制文件通过各种路径时,我遇到了一个名为 NetUSB 的内核模块。事实证明,该模块正在侦听0.0.0.0 IP上的 TCP 端口20005。

如果没有防火墙规则来阻止它,那就意味着它正在侦听 WAN 和 LAN。谁不喜欢远程内核错误?

NetUSB 是KCodes开发的产品。它旨在允许网络中的远程设备与连接到路由器的 USB 设备进行交互。例如,您可以与打印机进行交互,就好像它通过 USB 直接插入您的计算机一样。这需要您计算机上的驱动程序通过此内核模块与路由器通信。

它已授权给大量其他供应商用于他们的产品,最值得注意的是:

  • Netgear
  • TP-Link
  • Tenda
  • EDiMAX
  • DLink
  • Western Digital

NetUSB.ko 内部结构

早在 2015 年,就发现了一个不同的 NetUSB 漏洞。从中获得了一些很棒的资源(包括bl4sty对该漏洞的一个非常有用的利用,它帮助快速验证了这个漏洞)。

用于发起连接的握手如下:

CVE-2021-45608 | NetUSB RCE漏洞
初始化通信的握手

握手之后,将执行一个命令解析 while 循环,其中包含以下代码:

CVE-2021-45608 | NetUSB RCE漏洞
接受命令编号并将消息路由到适当的 SoftwareBus 函数的代码

SoftwareBus_fillBuf其作用类似于recv同时获取缓冲区及其大小,用从套接字读取的数据填充缓冲区。

漏洞

该命令0x805f在函数中到达以下代码SoftwareBus_dispatchNormalEPMsgOut

CVE-2021-45608 | NetUSB RCE漏洞
内核模块中易受攻击的代码段

从远程 PC 获取 4 个字节。将数字0x11添加到其中,然后用作 中的大小值kmalloc。由于未验证此提供的大小,因此添加0x11可能会导致整数溢出。例如,大小0xffffffff会导致0x100x11已经被添加到它。

然后通过取消引用和SoftwareBus_fillBuf函数来使用和写入这个分配的区域:

CVE-2021-45608 | NetUSB RCE漏洞
在分配的小区域上发生越界写入

查看对 的最终调用SoftwareBus_fillBuf,提供的大小用作从远程套接字读取的最大值。在前面的示例中,0xffffffff此处将使用大小(不是溢出的值)作为发送到的大小recv

除了我们的报告,我们还发送了建议的缓解策略。在使用用户提供的大小分配内存之前,应执行整数溢出检查,如下所示:

if(user_supplied_size + 0x11 < 0x11) return;

可利用性

从漏洞利用的角度来看,有很多事情需要考虑。

首先,我们可以分配的最小大小是0x0,最大值是0x10。这意味着分配的对象将始终位于kmalloc-32内核堆的平板中。

其次,我们需要考虑对溢出本身的控制量。我们已经知道通过套接字接收的数据在攻击者的控制范围内,但是大小是否可以协商?由于0xffffffff在 32 位系统上实际上无法利用大小,因此有必要查看SoftwareBus_fillBuf实际工作原理。这个函数下面是标准的socketrecv函数。这意味着提供的大小仅用作最大接收大小而不是严格的数量,例如memcpy.

考虑为溢出布置内核堆有多容易也很重要。许多漏洞利用需要使用堆空洞,以确保将易受攻击的堆结构放置在将被覆盖的对象之前。在这个内核模块的情况下,套接字接收数据的超时时间为 16 秒,这意味着结构在分配后最多可以溢出 16 秒。这消除了创建堆孔的需要。

最后,需要考虑选择可以被覆盖的目标结构。关于哪些可以使用存在一些限制。

  • 该结构的大小必须小于 32 字节才能放入kmalloc-32.
  • 该结构必须可以从远处喷射。
  • 结构必须有一些可以被覆盖的东西,使它作为目标有用(例如,类型-长度-值结构或指针)

虽然这些限制使得编写针对此漏洞的利用变得困难,但我们认为这并非不可能,因此使用 Wi-Fi 路由器的用户可能需要为其路由器寻找固件更新。

修复

由于此漏洞位于授权给各个路由器供应商的第三方组件中,因此修复此问题的唯一方法是更新路由器的固件(如果有可用更新)。请务必检查您的路由器是否不是报废型号,因为它不太可能收到此漏洞的更新。

探索 Netgear 固件更新,通过向函数添加新的大小检查来修复漏洞:

CVE-2021-45608 | NetUSB RCE漏洞
漏洞补丁,由 Netgear 实施

结论

此漏洞影响全球数百万台设备,在某些情况下可能完全可以远程访问。由于受此漏洞影响的供应商数量众多,我们直接将此漏洞报告给 KCodes,以便分发给他们的被许可人,而不是仅针对竞赛中的 TP-Link 或 Netgear 设备。这样可以确保所有供应商在比赛期间都收到补丁,而不仅仅是一个。

虽然我们不会发布任何针对它的漏洞利用,但尽管开发一个漏洞涉及相当大的复杂性,但仍有可能在未来公开。我们建议所有用户遵循上述补救信息,以降低任何潜在风险。

披露时间表

  • 2021 年 9 月 9 日 – 给 KCodes 的初始电子邮件,要求提供有关如何发送漏洞信息的信息
  • 2021 年 9 月 20 日 – 向 KCodes 披露漏洞详细信息和补丁建议,最终披露日期为 2021 年 12 月 20 日
  • 2021 年 10 月 4 日 – KCodes 要求提供概念验证脚本来验证补丁
  • 2021 年 10 月 4 日 – 提供了概念验证脚本
  • 2021 年 11 月 17 日 – 向 KCodes 发送一封电子邮件,以仔细检查补丁是否已在 10 月 4 日发送给所有供应商,而不仅仅是 Netgear
  • 2021 年 11 月 19 日 – KCodes 确认他们已将补丁发送给所有供应商,并且固件将在 12 月 20 日之前发布
  • 2021 年 12 月 14 日 – 发现 Netgear 已发布 R6700v3 设备的固件并实施了更改
  • 二○二一年十二月二十○日-美国网件发布的咨询的漏洞
  • 2022 年 1 月 11 日 – SentinelLabs 公开披露该漏洞的详细信息

SentinelOne 的负责任披露政策可在此处找到。

from

转载请注明出处及链接

Leave a Reply

您的邮箱地址不会被公开。 必填项已用 * 标注