NetUSB是KCodes开发的产品,允许网络中的设备与连接在路由器上的USB设备进行交互。比如,可以与打印机进行交互。这一过程要求计算机中的驱动能够通过kernel模块与路由器通信。研究人员在NetUSB中发现一个远程代码执行漏洞,漏洞CVE编号为CVE-2021-45608。
NetUSB授权给了大量的厂商使用,包括:
Netgear
TP-Link
Tenda
EDiMAX
DLink
Western Digital
因此该漏洞影响全球数百万的设备,而且该漏洞的利用可以远程实现。
NetUSB.ko Internals
用于初始化连接的握手如下所示:
握手后,会执行用于命令分析的while循环,代码如下:
SoftwareBus_fillBuf 与recv的处理方式类似,都用到buffer和buffer大小,会用从socket读取的数据来填充buffer。
漏洞分析
命令0x805f在函数 SoftwareBus_dispatchNormalEPMsgOut中会达到以下代码:
Kernel模块中有漏洞的代码部分
代码会从远程PC处取回4字节的内容。然后加上0x11,并用作kmalloc中的size值。因为提供的size值并没有经过验证,因此加上0x11后可能会引发整数溢出。比如,0xffffffff的大小在加上0x11会变成0x10。
然后分配的区域可以通过去引用和SoftwareBus_fillBuf函数来使用和写入:
越界写
从最后一次对SoftwareBus_fillBuf的调用来看,填充的大小可以用作从远程socket读取的最大值。从之前的例子来看,大小0xffffffff可以用作发送给recv的大小。
漏洞补丁
建议的修复方案
在用用户提供的size值来分配内存之前,研究人员建议进行一个整数溢出检查:
if(user_supplied_size + 0x11 < 0x11) return;
因为该漏洞存在于不同种类路由器的第三方组件中,修复该漏洞的唯一方式就是更新路由器固件。
Netgear给出的更新固件中,就是加入了一个新的size检查:
Netgear给出的补丁
本文翻译自:https://www.sentinelone.com/labs/cve-2021-45608-netusb-rce-flaw-in-millions-of-end-user-routers/如若转载,请注明原文地址