一、执行摘要
近期,我们发现,KCodes的NetUSB内核模块中存在两个漏洞,可能允许攻击者不恰当地访问某些NETGEAR无线路由器上的信息。这些具体型号的路由器使用台湾公司KCodes的内核模块。内核模块是根据每个设备单独定制的,但这些内核模块都包含类似的功能。
该模块通过TCP实现USB设备的共享,允许客户端使用各种供应商制造的驱动程序和软件连接到这些设备上。攻击者可以在本地网络上发送特定数据包,以利用NetUSB中存在的漏洞,使得路由器泄露敏感信息,甚至最严重能导致攻击者远程执行代码。
根据我们的协调披露政策,Cisco Talos就此漏洞与KCodes和NETGEAR取得了联系。在与KCodes开展合作之后,该供应商向NETGEAR提供了更新,并且NETGEAR已经计划发布更新。Talos团队决定在超过90天期限后公布相关漏洞的具体细节。
二、KCodes NetUSB未经身份验证的远程内核任意内存读取漏洞(TALOS-2018-0775/CVE-2019-5016)
2.1 摘要
KCodes NetUSB.ko内核模块中存在可以被攻击者利用的任意内存读取漏洞,该模块支持至少两种型号的NETGEAR Nighthawk路由器以及一些其他供应商/产品的ReadySHARE打印机功能。攻击者如果特制索引值,可能会导致无效的内存读取,从而导致拒绝服务或远程信息泄露。未经身份验证的攻击者可以在本地网络上精心构造一个数据包,从而触发此漏洞。PHP大马
2.2 测试版本
NETGEAR Nighthawk AC3200(R8000),固件版本:V1.0.4.2810.1.54(11/7/18),NetUSB.ko 1.0.2.66
NETGEAR Nighthawk AC3000(R7900),固件版本:V1.0.3.810.0.37(11/7/18),NetUSB.ko 1.0.2.69
2.3 产品网址
http://www.kcodes.com
https://www.netgear.com/home/products/networking/wifi-routers/R7900.aspx
https://www.netgear.com/home/products/networking/wifi-routers/R8000.aspx
https://www.netgear.com/support/product/ReadySHAREUSBPrinter.aspx
2.4 CVSS v3得分
10.0 – CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:H
2.5 CWE
CWE-200:信息泄露
2.6 漏洞细节
部分型号的NETGEAR路由器使用一家名为KCodes的台湾公司的定制内核模块NetUSB.ko。该模块是针对每个设备专门定制的,但不同模块之间的功能相类似。该模块通过TCP共享USB设备,允许客户端使用各种供应商制造的驱动程序和软件连接到这些设备,从而使得客户端主机将远程设备视为实际插入到计算机上的本地USB设备。在NETGEAR路由器上使用的软件名称为“NETGEAR USB Control Center”(NETGEAR USB控制中心),它使用名为“NetUSBUDSTcpBus.sys”(在Windows系统上)的驱动程序进行通信。许多其他产品都是用了NetUSB.ko。但遗憾的是,我们无法测试如此大量的潜在设备。在2015年,曾经披露了一个先前研究的漏洞,研究人员由此认为,这个内核模块的缺陷可能存在于多家供应商生产的多达92种产品之中。基于此分析,我们使用R8000硬件来测试R8000版本的NetUSB.ko(1.0.2.66),并使用R7900版本来测试R7900版本的NetUSB.ko(1.0.2.69),因为上述两个模块都是针对同一内核而编译的。
在建立与远程USB设备的通信时,必须首先进行握手。握手过程的工作原理如下:
客户端首先发送字节“0x5605”,然后发送16字节的“随机”数据。
00000000 56 05 V. 00000002 81 77 d9 74 f8 9f b4 74 ee 94 02 07 0d b1 38 40 .w.t...t ......8@
服务器(路由器)将使用静态AES密钥5c130b59d26242649ed488382d5eaecc对这些字节进行加密,该密钥被硬编码到NetUSB.ko中,并通过使用密钥0B7928FF6A76223C21A3B794084E1CAD解密0B7928FF6A76223C21A3B794084E1CAD来实现检索。
在加密客户端数据之后,加密的响应与16字节的“随机”数据一起被发送回客户端,以供客户端进行加密并返回。
00000000 29 9e 4d 05 f6 d0 9d 98 ae 7f 81 35 39 83 67 13 ).M..... ...59.g. // Client data encrypted 00000010 af 60 20 6b fa 52 7d 90 82 a3 82 63 f4 b1 14 c1 .` k.R}. ...c.... // Server data to be encrypted and returned
客户端通过使用相同的AES密钥加密“随机”服务器数据,然后将客户端计算机名称的长度作为小端格式的四个字节进行响应。接下来,发送的是计算机名称本身和同步(Synch)命令0x7,同样采用的是小端格式,长度为4个字节。
00000012 2c b7 34 c6 32 e3 70 0e 26 bc 66 48 b8 7b c1 1c ,.4.2.p. &.fH.{.. // Encrypted server data 00000022 0c 00 00 00 .... // Computer name length 00000026 57 49 4e 44 4f 57 53 50 43 2d 30 31 WINDOWSP C-01 // Computer name 00000032 07 00 00 00 .... // Sync Command
当服务器以0x17作为响应时,握手完成(0x15表示设备不可用):
00000020 17 00 00 00 .... // Connection Established
要实际使用设备并建立远程TCP总线,需要发送一系列操作码和数据到服务器上。建立此类通信时,第二个字节是堆栈中可用共享设备列表中的设备编号或索引。该字节没有经过验证,将会允许远程攻击者触发模块尝试读取任意内存,最终导致远程内存泄漏。在这个例子中,我们使用操作码0x2调用“getConfigDescriptor”。
易受攻击的代码:
00007E30 LDRB R