【安全风险通告】部分漏洞细节已公开,奇安信安全产品已支持防护,... 2021.01.20 12:24:56 118 |
阿里云安全获Oracle官方致谢 |Weblogic Server远程代码执行漏洞预警... 2021.01.20 09:15:17 83 |
Apache Tomcat高危安全漏洞风险提示 2021.01.18 16:00:36 64 |
游族投毒案嫌疑人设有制毒场所,于暗网购买上百种毒药 2021.01.18 12:43:52 61 |
【安全圈】美联储警告:黑客正在绕过 MFA 进行云计算攻击 2021.01.19 21:33:36 60 |
JumpServer 堡垒机远程代码执行漏洞 2021.01.18 18:40:35 60 |
【更新】JumpServer 远程代码执行漏洞二次通告 2021.01.18 11:06:53 60 |
CVE-2019-2725高版本POC拓展 2021.01.19 18:00:37 59 |
「树莓派+1万块乐高」打造乐高分类器,树莓派官方转发,网友:我想... 2021.01.21 08:10:01 56 |
Windows Defender杀软存在主动执行恶意软件漏洞 2021.01.17 21:52:32 54 |
细节是否公开 |
PoC 状态 |
EXP 状态 |
在野利用 |
是 |
已公开 |
未知 |
未知 |
奇安信 CERT风险评级为: 高危
风险等级: 蓝色(一般事件)
Windows 10 Version 1709 for 32-bit Systems
Windows 10 Version 1709 for ARM64-based Systems
Windows 10 Version 1709 for x64-based Systems
Windows 10 Version 1803 for 32-bit Systems
Windows 10 Version 1803 for ARM64-based Systems
Windows 10 Version 1803 for x64-based Systems
Windows 10 Version 1809 for 32-bit Systems
Windows 10 Version 1809 for ARM64-based Systems
Windows 10 Version 1809 for x64-based Systems
Windows 10 Version 1903 for 32-bit Systems
Windows 10 Version 1903 for ARM64-based Systems
Windows 10 Version 1903 for x64-based Systems
Windows 10 Version 1909 for 32-bit Systems
Windows 10 Version 1909 for ARM64-based Systems
Windows 10 Version 1909 for x64-based Systems
Windows 10 Version 2004 for 32-bit Systems
Windows 10 Version 2004 for ARM64-based Systems
Windows 10 Version 2004 for x64-based Systems
Windows Server 2019
Windows Server 2019 (Server Core installation)
Windows Server, version 1903 (Server Core installation)
Windows Server, version 1909 (Server Core installation)
Windows Server, version 2004 (Server Core installation)
使用奇安信天擎的客户可以通过奇安信天擎控制台一键更新修补相关漏洞,也可以通过奇安信天擎客户端一键更新修补相关漏洞。
也可以采用以下官方解决方案及缓解方案来防护此漏洞:
Windows自动更新
Windows系统默认启用 Microsoft Update,当检测到可用更新时,将会自动下载更新并在下一次启动时安装。还可通过以下步骤快速安装更新:
1、点击“开始菜单”或按Windows快捷键,点击进入“设置”
2、选择“更新和安全”,进入“Windows更新”(Windows 8、Windows 8.1、Windows Server 2012以及Windows Server 2012 R2可通过控制面板进入“Windows更新”,步骤为“控制面板”-> “系统和安全”->“Windows更新”)
3、选择“检查更新”,等待系统将自动检查并下载可用更新
4、重启计算机,安装更新
系统重新启动后,可通过进入“Windows更新”->“查看更新历史记录”查看是否成功安装了更新。对于没有成功安装的更新,可以点击该更新名称进入微软官方更新描述链接,点击最新的SSU名称并在新链接中点击“Microsoft 更新目录”,然后在新链接中选择适用于目标系统的补丁进行下载并安装。
手动安装补丁
另外,对于不能自动更新的系统版本(如Windows 7、Windows Server 2008、Windows Server 2008 R2),可参考以下链接下载适用于该系统的10月补丁并安装:
https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-16898
如果无法立即安装更新,可参考以下步骤缓解漏洞:
1.禁用ICMPv6 RDNSS:
您可以使用下面的PowerShell命令禁用ICMPv6 RDNSS,以防止攻击者利用此漏洞。此解决方案仅适用于Windows 1709及更高版本。有关更多信息,请参见Windows Server 1709的新增功能(https://docs.microsoft.com/en-us/windows-server/get-started/whats-new-in-windows-server-1709)。
netsh int ipv6 set int *INTERFACENUMBER* rabaseddnsconfig=disable
注意:此变更无需重启系统
您可以使用下面的PowerShell命令恢复:
netsh int ipv6 set int *INTERFACENUMBER* rabaseddnsconfig=enable
注意:此变更无需重启系统
近日,奇安信CERT监测到 CVE-2020-16898 漏洞细节以及 POC 在网上公开,便第一时间复现了此漏洞,经测试,该 POC 可稳定触发 BSOD,以下为测试时的抓包数据:
当Windows TCP / IP堆栈不正确地处理使用选项类型 25(递归DNS服务器(RDNSS)选项)且长度字段值为偶数的 ICMPv6 路由器广告数据包时,存在一个远程执行代码漏洞。抓包数据确实满足以上条件。
IPv6 路由器广告选项允许 IPv6 路由器向 DNS6 主机广告 DNS 递归服务器地址列表和 DNS 搜索列表。RDNSS 选项通常包含一个或多个递归 DNS 服务器的 IPv6 地址列表。所有地址共享相同的生命周期值。如果希望具有不同的“生存时间”值,则可以使用多个 RDNSS 选项。以下为 RDNSS 选项的格式:
Type(1个字节):RDNSS选项类型的类型为25(0x19)
Length(1个字节):如果该选项中包含一个IPv6地址,则长度取最小值3 。每增加一个RDNSS地址,长度就会增加2。接收器使用“长度”字段来确定选项中IPv6地址的数量
LifeTime(4个字节):该RDNSS地址可以用于名称解析的最长时间(相对于发送包的时间,以秒为单位)
Addresses of IPv6 Recursive DNS Servers(可变长度,由“Length”字段确定):一个或多个递归DNS服务器的128位IPv6地址 。地址个数为(Length - 1)/ 2
可以将 Length 字段理解为 RDNSS 选项总长度/8,IPv6 Recursive DNS Servers 地址前的字段占 8 字节,每个 IPv6 Recursive DNS Servers 地址长度为 16 个字节,所以正常的 RDNSS 选项总长度应满足 16x+8(x>=1),将其除以 8 就是 2x+1(x>=1) ,也就是 Length 字段应该满足的条件。漏洞在于没有对 Length 字段进行奇偶判断,导致对 Addresses of IPv6 Recursive DNS Servers 及下一个 RDNSS 选项边界的错误解析,从而引发安全问题。
系统使用 Ipv6pHandleRouterAdvertisement 函数处理 IPv6 路由器广告数据,在该函数中使用 NdisGetDataBuffer 函数以从 NET_BUFFER 结构中访问数据(连续或不连续),使用 NET_BUFFER 结构( NdisGetDataBuffer 函数第一个参数)中 CurrentMdlOffset 的字段定位要访问数据起始地址相对于 MDL 指向内存数据的偏移。如下所示,使用 NdisGetDataBuffer 函数获取第一个 RDNSS 选项数据指针。
0: kd> g
Breakpoint 0 hit
:
e89f33d7ff call ndis!NdisGetDataBuffer (fffff806`4bf4e0d0)
0: kd> dt _net_buffer @rcx
ndis!_NET_BUFFER
Next : (null)
CurrentMdl : 0xffffdd06`68748d60 _MDL
CurrentMdlOffset : 0x10
DataLength : 0x188
stDataLength : 0x188
MdlChain : 0xffffdd06`6a9c8180 _MDL
DataOffset : 0x70
Link : _SLIST_HEADER
NetBufferHeader : _NET_BUFFER_HEADER
ChecksumBias : 0
Reserved : 0
NdisPoolHandle : 0xffffdd06`68531040 Void
NdisReserved : [2] (null)
ProtocolReserved : [6] 0x00000198`00000000 Void
MiniportReserved : [4] (null)
DataPhysicalAddress : _LARGE_INTEGER 0x0
SharedMemoryInfo : (null)
ScatterGatherList : (null)
0: kd> dx -id 0,0,ffffdd0666892300 -r1 ((ndis!_MDL *)0xffffdd0668748d60)
*)0xffffdd0668748d60) : 0xffffdd0668748d60 [Type: _MDL *]
Next : 0xffffdd066e8ea9b0 [Type: _MDL *]
Size : 56 [Type: short]
MdlFlags : 4 [Type: short]
AllocationProcessorNumber : 0x0 [Type: unsigned short]
Reserved : 0x0 [Type: unsigned short]
Process : 0x0 [Type: _EPROCESS *]
MappedSystemVa : 0xffffdd0668748da0 [Type: void *]
StartVa : 0xffffdd0668748000 [Type: void *]
ByteCount : 0x30 [Type: unsigned long]
ByteOffset : 0xda0 [Type: unsigned long]
0: kd> db 0xffffdd0668748da0 + 10
19 04 00 00 00 00 03 84-30 30 30 30 30 30 30 30 ........00000000
30 30 30 30 30 30 30 30-18 22 fd 81 00 00 03 84 00000000."......
00 f9 09 02 55 48 33 77-9e f9 09 f1 00 00 00 00 ....UH3w........
e0 8d 74 68 06 dd ff ff-90 26 3c 68 06 dd ff ff ..th.....&<h....
10 86 74 68 06 dd ff ff-80 85 74 68 06 dd ff ff ..th......th....
02 00 00 00 00 00 00 00-48 8e 74 68 06 dd ff ff ........H.th....
00 00 00 00 00 00 00 00-18 8e 74 68 06 dd ff ff ..........th....
18 8e 74 68 06 dd ff ff-00 00 00 00 00 00 00 00 ..th............
0: kd> p
:
0fb64801 movzx ecx,byte ptr [rax+1]
0: kd> db rax
19 04 00 00 00 00 03 84-30 30 30 30 30 30 30 30 ........00000000
30 30 30 30 30 30 30 30-18 22 fd 81 00 00 03 84 00000000."......
00 f9 09 02 55 48 33 77-9e f9 09 f1 00 00 00 00 ....UH3w........
e0 8d 74 68 06 dd ff ff-90 26 3c 68 06 dd ff ff ..th.....&<h....
10 86 74 68 06 dd ff ff-80 85 74 68 06 dd ff ff ..th......th....
02 00 00 00 00 00 00 00-48 8e 74 68 06 dd ff ff ........H.th....
00 00 00 00 00 00 00 00-18 8e 74 68 06 dd ff ff ..........th....
ffffdd06`68748e20 18 8e 74 68 06 dd ff ff-00 00 00 00 00 00 00 00 ..th............
据 quarkslab 博客中所讲,Ipv6pUpdateRDNSS 会计算 IPv6 地址数量为(option.Length-1)/ 2,使用 POC 调试的话为(4-1)/ 2 = 1,因而会以 3 个 8 字节为单位前进 NET_BUFFER,以下为在第一个 RDNSS 选项的 length 字段下断点的情况。
0: kd> g
Breakpoint 1 hit
:
8d4e01 lea ecx,[rsi+1]
0: kd> ub rip l1
:
0fb64301 movzx eax,byte ptr [rbx+1]
0: kd> db rbx
19 04 00 00 00 00 03 84-30 30 30 30 30 30 30 30 ........00000000
30 30 30 30 30 30 30 30-18 22 fd 81 00 00 03 84 00000000."......
00 f9 09 02 55 48 33 77-9e f9 09 f1 00 00 00 00 ....UH3w........
e0 8d 74 68 06 dd ff ff-90 26 3c 68 06 dd ff ff ..th.....&<h....
10 86 74 68 06 dd ff ff-80 85 74 68 06 dd ff ff ..th......th....
02 00 00 00 00 00 00 00-48 8e 74 68 06 dd ff ff ........H.th....
00 00 00 00 00 00 00 00-18 8e 74 68 06 dd ff ff ..........th....
18 8e 74 68 06 dd ff ff-00 00 00 00 00 00 00 00 ..th............
0: kd> u rip //计算(length - 1)/ 2
:
8d4e01 lea ecx,[rsi+1] // rsi =1,ecx=2
2bc6 sub eax,esi // 4-1=3
4183cfff or r15d,0FFFFFFFFh
99 cdq
f7f9 idiv eax,ecx // 3/2 =1
8b5304 mov edx,dword ptr [rbx+4]
8945b7 mov dword ptr [rbp-49h],eax
8bf0 mov esi,eax
0: kd>
:
f7f9 idiv eax,ecx
0: kd>
:
8b5304 mov edx,dword ptr [rbx+4]
0: kd> r eax
eax=1
Ipv6pUpdateRDNSS 函数执行完之后,偏移变成 0x28,正好指向了 18 22 ... 这个选项。
0: kd> gu
:
440fb77c2462 movzx r15d,word ptr [rsp+62h]
0: kd> dt _net_buffer ffffdd06`6e29dea0
ndis!_NET_BUFFER
Next : (null)
CurrentMdl : 0xffffdd06`68748d60 _MDL
CurrentMdlOffset : 0x28
DataLength : 0x170
stDataLength : 0x170
MdlChain : 0xffffdd06`6a9c8180 _MDL
DataOffset : 0x88
Link : _SLIST_HEADER
NetBufferHeader : _NET_BUFFER_HEADER
ChecksumBias : 0
Reserved : 0
NdisPoolHandle : 0xffffdd06`68531040 Void
NdisReserved : [2] (null)
ProtocolReserved : [6] 0x00000198`00000000 Void
MiniportReserved : [4] (null)
DataPhysicalAddress : _LARGE_INTEGER 0x0
SharedMemoryInfo : (null)
ScatterGatherList : (null)
0: kd> dx -id 0,0,ffffdd0666892300 -r1 ((ndis!_MDL *)0xffffdd0668748d60)
*)0xffffdd0668748d60) : 0xffffdd0668748d60 [Type: _MDL *]
Next : 0xffffdd066e8ea9b0 [Type: _MDL *]
Size : 56 [Type: short]
MdlFlags : 4 [Type: short]
AllocationProcessorNumber : 0x0 [Type: unsigned short]
Reserved : 0x0 [Type: unsigned short]
Process : 0x0 [Type: _EPROCESS *]
MappedSystemVa : 0xffffdd0668748da0 [Type: void *]
StartVa : 0xffffdd0668748000 [Type: void *]
ByteCount : 0x30 [Type: unsigned long]
ByteOffset : 0xda0 [Type: unsigned long]
0: kd> db 0xffffdd0668748da0+28
18 22 fd 81 00 00 03 84-00 f9 09 02 55 48 33 77 ."..........UH3w
9e f9 09 f1 00 00 00 00-e0 8d 74 68 06 dd ff ff ..........th....
90 26 3c 68 06 dd ff ff-10 86 74 68 06 dd ff ff .&<h......th....
80 85 74 68 06 dd ff ff-02 00 00 00 00 00 00 00 ..th............
48 8e 74 68 06 dd ff ff-00 00 00 00 00 00 00 00 H.th............
18 8e 74 68 06 dd ff ff-18 8e 74 68 06 dd ff ff ..th......th....
00 00 00 00 00 00 00 00-b0 18 cd 68 06 dd ff ff ...........h....
f0 c4 d1 66 06 dd ff ff-01 00 00 00 00 00 00 00 ...f............
在下一次循环时,会对该选项进行解析,并按照 Route Information Option(其类型为 0x18)的流程进行处理。
0: kd>
Breakpoint 0 hit
tcpip!Ipv6pHandleRouterAdvertisement+0x984:
fffff806`4c1dad2c e89f33d7ff call ndis!NdisGetDataBuffer (fffff806`4bf4e0d0)
0: kd> p
tcpip!Ipv6pHandleRouterAdvertisement+0x989:
fffff806`4c1dad31 0fb64801 movzx ecx,byte ptr [rax+1]
0: kd> db rax
ffffdd06`68748dc8 18 22 fd 81 00 00 03 84-00 f9 09 02 55 48 33 77 ."..........UH3w
ffffdd06`68748dd8 9e f9 09 f1 00 00 00 00-e0 8d 74 68 06 dd ff ff ..........th....
ffffdd06`68748de8 90 26 3c 68 06 dd ff ff-10 86 74 68 06 dd ff ff .&<h......th....
ffffdd06`68748df8 80 85 74 68 06 dd ff ff-02 00 00 00 00 00 00 00 ..th............
ffffdd06`68748e08 48 8e 74 68 06 dd ff ff-00 00 00 00 00 00 00 00 H.th............
ffffdd06`68748e18 18 8e 74 68 06 dd ff ff-18 8e 74 68 06 dd ff ff ..th......th....
ffffdd06`68748e28 00 00 00 00 00 00 00 00-b0 18 cd 68 06 dd ff ff ...........h....
ffffdd06`68748e38 f0 c4 d1 66 06 dd ff ff-01 00 00 00 00 00 00 00 ...f............
在 case 0x18 中,直接调用 NdisGetDataBuffer 函数向栈上复制大量数据(由于数据不连续并且指定了Storage 参数为栈上的地址),函数执行完之后,栈被破坏且复制到栈上的数据完全可控。
0: kd>
:
e81bb3cbff call ndis!NdisGetDataBuffer (fffff806`4bf4e0d0)
0: kd> r r8 // Storage 参数
r8=fffff8064ad23718
0: kd> r rsp
rsp=fffff8064ad23460
0: kd> p
:
660f6f0553e50d00 movdqa xmm0,xmmword ptr [tcpip!_xmm (fffff806`4c371310)]
0: kd> k
# Child-SP RetAddr Call Site
00 fffff806`4ad23460 42424242`42424242 tcpip!Ipv6pHandleRouterAdvertisement+0xb8a0d
01 fffff806`4ad23810 84030000`00000519 0x42424242`42424242
02 fffff806`4ad23818 41414141`41414141 0x84030000`00000519
03 fffff806`4ad23820 41414141`41414141 0x41414141`41414141
04 fffff806`4ad23828 00000000`00000000 0x41414141`41414141
最终在 Ipv6pHandleRouterAdvertisement 函数返回时由于 cookie 检查不通过,触发蓝屏。
0: kd>
:
e869f70800 call tcpip!_security_check_cookie (fffff806`4c26ac00)
0: kd> p
KDTARGET: Refreshing KD connection
Fatal System Error: 0x00000139
(0x0000000000000002,0xFFFFF8064AD232C0,0xFFFFF8064AD23218,0x0000000000000000)
WARNING: This break is not a step/trace completion.
The last command has been cleared to prevent
accidental continuation of this unrelated event.
Check the event, location and thread before resuming.
Break instruction exception - code 80000003 (first chance)
A fatal system error has occurred.
Debugger entered on first try; Bugcheck callbacks have not been invoked.
A fatal system error has occurred.
For analysis of this file, run !analyze -v
:
cc int 3
0: kd> k
# Child-SP RetAddr Call Site
00 fffff806`4ad227f8 fffff806`498add92 nt!DbgBreakPointWithStatus
01 fffff806`4ad22800 fffff806`498ad487 nt!KiBugCheckDebugBreak+0x12
02 fffff806`4ad22860 fffff806`497c7a97 nt!KeBugCheck2+0x947
03 fffff806`4ad22f60 fffff806`497d9829 nt!KeBugCheckEx+0x107
04 fffff806`4ad22fa0 fffff806`497d9c50 nt!KiBugCheckDispatch+0x69
05 fffff806`4ad230e0 fffff806`497d7fe3 nt!KiFastFailDispatch+0xd0
06 fffff806`4ad232c0 fffff806`4c26ac35 nt!KiRaiseSecurityCheckFailure+0x323
07 fffff806`4ad23458 fffff806`4c1db497 tcpip!_report_gsfailure+0x5
08 fffff806`4ad23460 42424242`42424242 tcpip!Ipv6pHandleRouterAdvertisement+0x10ef
09 fffff806`4ad23810 84030000`00000519 0x42424242`42424242
0a fffff806`4ad23818 41414141`41414141 0x84030000`00000519
0b fffff806`4ad23820 41414141`41414141 0x41414141`41414141
0c fffff806`4ad23828 00000000`00000000 0x41414141`41414141
以下为补丁前后对比,其中,v29 和 v32 来自于 length << 3,补丁前只判断了 length 长度是不是大于等于 3,补丁后加入了对 length 值奇偶的校验,如果 length 为偶数,则会转入错误流程。
补丁前
补丁后
奇安信网神天堤防火墙产品防护方案
奇安信新一代智慧防火墙(NSG3000/5000/7000/9000系列)和下一代极速防火墙(NSG3500/5500/7500/9500系列)产品系列,已通过更新IPS特征库完成了对该漏洞的防护。建议用户尽快将IPS特征库升级至“2010141000”及以上版本并启用规则ID: 1227101进行检测防御。
奇安信天眼产品解决方案
奇安信天眼新一代威胁感知系统在第一时间加入了该漏洞的检测规则,请将规则包升级到3.0.1014.12434及以上版本。规则名称:Windows TCP/IP 远程代码执行漏洞(CVE-2020-16898),规则ID:0x5d84。奇安信天眼流量探针(传感器)升级方法:系统配置->设备升级->规则升级,选择“网络升级”或“本地升级”。
奇安信网神网络数据传感器系统产品检测方案
奇安信网神网络数据传感器(NDS3000/5000/9000系列)产品,已具备该漏洞的检测能力。规则ID为:51549,建议用户尽快升级检测规则库至2010141012以后版本并启用该检测规则。
[1] https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-16898
[2] https://www.mcafee.com/blogs/other-blogs/mcafee-labs/cve-2020-16898-bad-neighbor/
奇安信CERT致力 于
第 一时间 为企业级客户提供
安全风险通告和有效的解决方案