微软在10月的补丁日修复了87个安全漏洞,其中一个是Windows IPv6 协议栈中的安全漏洞。漏洞CVE编号为cve-2020-16898,CVSS评分为9.0分。攻击者可以利用恶意伪造的包在远程系统上执行任意代码。
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 这样的技术的网络中是否可以成功。