目录导航
执行摘要
- 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对该漏洞的一个非常有用的利用,它帮助快速验证了这个漏洞)。
用于发起连接的握手如下:

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

SoftwareBus_fillBuf
其作用类似于recv
同时获取缓冲区及其大小,用从套接字读取的数据填充缓冲区。
漏洞
该命令0x805f
在函数中到达以下代码SoftwareBus_dispatchNormalEPMsgOut
:

从远程 PC 获取 4 个字节。将数字0x11
添加到其中,然后用作 中的大小值kmalloc
。由于未验证此提供的大小,因此添加0x11
可能会导致整数溢出。例如,大小0xffffffff
会导致0x10
后0x11
已经被添加到它。
然后通过取消引用和SoftwareBus_fillBuf
函数来使用和写入这个分配的区域:

查看对 的最终调用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 固件更新,通过向函数添加新的大小检查来修复漏洞:

结论
此漏洞影响全球数百万台设备,在某些情况下可能完全可以远程访问。由于受此漏洞影响的供应商数量众多,我们直接将此漏洞报告给 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 的负责任披露政策可在此处找到。
转载请注明出处及链接