基于“Windows TCP/IP远程执行代码”漏洞谈网络安全问题防范
2021-07-20罗晨孙海波
◆罗晨 孙海波
(1.中国广播电视网络有限公司 北京 100037;2.国家广播电视总局广播电视科学研究院 北京 100866)
当今社会,计算机网络已深入到人们生活和工作的方方面面,承担着重要的角色。截至2020年6月,我国IPv4 地址数量为38907万个,IPv6 地址数量为50903 块/32。我国国家和地区顶级域名“.CN”数量为2304 万个,较2019年底增长2.8%[1]。互联网承载着许多重要业务和敏感信息,难免会被不法分子所觊觎。近年来,网站服务器或用户端被恶意攻击者造成蓝屏死机,导致业务系统崩溃中断的事件常有发生,造成严重后果。笔者长期从事网络安全工作,现就近期微软披露的“Windows TCP/IP远程执行代码”漏洞进行分析,浅谈如何做好计算机网络安全问题的防范,探析加强安全防护的方法措施,保障重要服务器以及终端计算机的安全。
1 事件经过
微软官网发布的2020年10月份月度补丁公告中,提到了“Windows TCP/IP远程执行代码”漏洞,影响范围非常广泛。针对该漏洞,笔者对单位内部的服务器做了相关的漏洞扫描验证,发现存在该漏洞。漏洞详细情况如下:漏洞名称为“Windows TCP/IP远程执行代码”;漏洞数量1 个;漏洞等级为高危;漏洞服务器IP 地址为192.168.83.28;漏洞描述为Windows TCP/IP 协议栈在处理ICMPv6(Internet Control Managemet Protocol Version 6,即互联网控制信息协议版本六)路由广告包时,存在远程代码执行漏洞(CVE-2020-16898),攻击者通过发送特制的ICMPv6 路由广告包到目标Windows 主机上,可实现远程代码执行。
为了进一步确认该漏洞的危害程度,笔者进行了进一步的验证工作,详细过程如下。
(1)构建攻击机。漏洞验证的前提是攻击机与受害机能够正常进行IPv6 通信,需要开启IPv6 的入站规则协议。笔者使用的是VMware 虚拟机,创建Win10 1909 版本、32 位操作系统,并在虚拟机中NAT 设置一个子网,启用IPv6 协议,如图1所示。
图1 开启IPv6 地址设置
(2)获得攻击和受害机IPv6 地址。在攻击机和受害机上分别打开命令提示框窗口,执行ipconfig 命令,查阅IPv6 地址,以便后续构造攻击代码,如图2所示。受害机IPv6 地址是fe80::4c08:452:39c9:27b1%4,攻击机IPv6 地址是fe80::8db2:3e6f:1b76:fcef%5。
图2 受害机IPv6 地址
(3)构建攻击POC 代码。根据第2 步中获取的攻击机和受害机IPv6 地址信息,替换POC 代码中的v6_dst 和v6_src 数值,其中v6_dst代表受害机的IPv6 信息,v6_src 代表攻击机的IPv6 信息。e.dns 中构造了一个Windows TCP/IP 堆栈不能正确处理的ICMPv6 的路由器广告包,如图3所示。当攻击机向受害机发送此广告包时,若受害机蓝屏死机,即说明受害机存在“Windows TCP/IP远程执行代码”漏洞。
图3 构造攻击POC 代码
(4)实施攻击。攻击机上安装Python 运行环境,笔者使用的编译工具是PyCharm Professional 2020.3。通过编译工具执行第3 步中编译好的攻击POC 代码,攻击则将构造好的特定IPv6 数据包发送给受害机,如图4所示。由于受害机TCP/IP 堆栈无法处理攻击机发送的数据包,造成自身蓝屏死机。因此,我们判定受害机存在“Windows TCP/IP远程执行代码”漏洞。
图4 Python 环境下执行攻击脚本
2 漏洞原理及危害
CVE-2020-16898 被称为“坏邻居”漏洞,造成该漏洞的原因是,当Windows TCP/IP 协议栈不能正确处理ICMPv6 路由广告包时,导致远程代码执行漏洞。具体过程为,当Windows TCP/IP 协议堆栈不能正确处理使用选项类型为25(递归DNS 服务器选项)且长度字段值为偶数的ICMPv6 路由器广告数据包时,存在此漏洞。DNS 服务器在使用选项类型为25 时,长度以8 个字节为增量进行计数,因此长度为3 的递归DNS 服务器选项的总长度应为24 个字节。DNS 服务器在使用选项类型为25 时,该选项本身包含五个字段:IPv6 递归DNS 服务器的类型、长度、保留、生存时间、地址。前四个字段始终总长度为8 个字节,但最后一个字段可以包含可变数量的IPv6 地址,每个IPv6 地址均为16 个字节。当提供一个偶数长度值的ICMPv6 路由器广告数据包时,Windows TCP/IP 堆栈错误地将网络缓冲区的前进量减少了8 个字节。这是因为堆栈在内部以16 字节为增量进行计数,因此无法解决使用非RFC 兼容长度值的情况。这种不匹配导致堆栈将当前选项的最后8 个字节解释为第二个选项的开始,最终导致缓冲区溢出,从而导致此漏洞[2]。
由此可知,CVE-2020-16898 是一个与IPv6 协议有关,类型为栈溢出的漏洞,危害严重。攻击者可通过向受影响主机发送特制ICMPv6 路由广告包,进而在目标服务器或客户端上执行代码。该漏洞影响范围较广,包括Windows 10、Windows Server 2019 等至少23 个操作系统。
3 修复及防范措施
针对“Windows TCP/IP远程执行代码”漏洞,建议采用微软官方解决方案及缓解方案来防护此漏洞。
3.1 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 更新目录”,然后在新链接中选择适用于目标系统的补丁进行下载并安装。
3.2 手动安装补丁
另外,对于不能自动更新的系统版本(如Windows 7、Windows Server 2008、Windows Server 2008 R2),可以到微软官网自行下载对应系统版本的2020年10月补丁并安装。
3.3 可以通过禁用ICMPv6 RDNSS 来缓解风险
可以使用下面的PowerShell命令禁用ICMPv6 RDNSS(Recursive DNS Server,递归域名服务器),以防止攻击者利用此漏洞。此解决方案仅适用于Windows 1709 及更高版本。
netsh int ipv6 set int *INTERFACENUMBER*rabaseddnsconfig=disable
注意:此变更无需重启系统
可以使用下面的PowerShell 命令恢复:
netsh int ipv6 set int *INTERFACENUMBER*rabaseddnsconfig=enable
注意:此变更无需重启系统。
4 结束语
随着互联网技术的迅猛发展,网络安全漏洞也越来越多。2020年上半年,国家信息安全漏洞共享平台收集整理信息系统安全漏洞11073 个,较2019年同期(5853 个)增长89.2%[1]。这次发现的“Windows TCP/IP远程执行代码”漏洞,也只是众多网络安全漏洞中的一个,虽然只是在本单位局域网内发生,但是仍然存在着巨大的威胁隐患。对于计算机内网安全来讲,按照安全级别从高到低,可以分为主机系统的应用服务安全、文件系统安全、系统服务安全、操作系统内核安全、主机系统的物理安全[3],所以计算机内网在许多方面都是存在安全隐患的,绝不能忽视。网络安全,重在防范。在制定企业内部网络安全防范措施时,应该充分分析企业内部网络安全的威胁因素,要做到最大限度保证网络安全,做到重点数据重点防范,重点人物重点监测,将管理、监测和控制有机地结合;将网络安全防范手段包括防火墙、物理隔离和网络安全监测手段集成与融合,变被动防范为主动防范,变制度防范为技术防范[4]。防止企业内部人员利用类似于“Windows TCP/IP远程执行代码”这样的安全漏洞,使得单位内部计算机造成入侵破坏。