9

Windows IPv6 协议栈中的安全漏洞

 3 years ago
source link: http://netsecurity.51cto.com/art/202010/628656.htm
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

微软在10月的补丁日修复了87个安全漏洞,其中一个是Windows IPv6 协议栈中的安全漏洞。漏洞CVE编号为cve-2020-16898,CVSS评分为9.0分。攻击者可以利用恶意伪造的包在远程系统上执行任意代码。

JvU7ja6.jpg!mobile

PoC代码非常简单,可以引发Windows系统蓝屏,表明能够绕过Windows 10和Windows server2019 补丁的攻击者就可以利用漏洞。因为漏洞利用实现远程代码执行的效应可以广泛传播,因此漏洞的影响也非常大,该漏洞可以实现蠕虫般传播。研究人员将该漏洞命名为“Bad Neighbor”,因为该漏洞位于ICMPv6 的邻居发现协议,使用的是Router Advertisement 类型。

技术细节

由于Windows TCP/IP 栈不当处理使用Option Type 25 (Recursive DNS Server Option) 和length 域为偶数的ICMPv6 Router Advertisement 包,会引发该漏洞。在该option 中,length 的计数是递增8字节,所以length为3时,总的长度应该是24字节。该option本身含有5个域:Type, Length, Reserved, Lifetime, Addresses of IPv6 Recursive DNS Servers。前4个域总共只有8个字节,而最后一个域含有IPv6 地址数目的变量,每个IPv6 地址为16字节。根据RFC 8106,length 域是大于等于3的奇数:

当IPv6 主机通过RA 消息接收DNS option时,会按照如下规则处理相关的option:

DNS option的有效性通过length 域来检查。RDNSS option 中的Length field的值大于等于最小值3,并满足(Length - 1) % 2 == 0。

如果是一个偶数的length 值,Windows TCP/IP 栈就会错误地按8字节增加网络缓存。这是因为栈内部是以16字节递增的,无法处理不符合RFC 标准的length值。栈中错误匹配结果会将当前option 的最后8字节作为第二个option 的开始,引发栈溢出和潜在的远程代码执行。

为完整地实现该漏洞的利用链还需要Windows kernel中的内存泄露或信息泄露漏洞。

漏洞影响和补丁

该漏洞比较大的影响是Windows 10用户,因为启用了IPv6的服务器还比较少。

目前,微软已经发布了补丁,如果无法安装补丁,那么比较好的办法就是禁用IPv6。此外,还可以在网络边界拦截或丢弃ICMPv6 Router Advertisements。从PoC的情况来看,Windows Defender和Windows防火墙无法拦截PoC。目前还不清楚攻击在使用6to4 或 Teredo 这样的技术的网络中是否可以成功。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK