家用路由器IPv6邻居表资源耗尽攻击与防护
2022-10-13肖举诸葛建伟
◆肖举 诸葛建伟
(1.数字工程与先进计算国家重点实验室 河南 450012;2.清华大学网络科学与网络空间研究院 北京 100084)
IPv6凭借“一粒沙子一个地址”及内嵌安全能力等技术优势,天生匹配万物互联[1]。与IPv4相比,IPv6在安全性方面进行了预先设计和充分考虑,但仍存在一些难以解决的安全风险。首先,128位的地址规模及临时地址机制,使得基于IPv6的攻击在追踪溯源、信息处理等存在着处理时效上的困难。其次,由于IPv6的报文结构与IPv4不一致,现有网络安全工具不能兼容IPv6,使得IPv6具有攻击媒介检测上的难点。再次,IPv6/IPv4过渡机制及IPv6协议新特性使得IPv6具有新部署协议风险规避上的难题。文献[2]分析了IPv6部署过程和使用过程中存在的信息泄露、拒绝服务、网络欺骗等安全威胁。文献[3]和文献[4]灵活运用了THC-IPv6[5]攻击套件对IPv6协议进行了详细的测试研究,实验证实了当前主流操作系统如Windows、Linux中大量关于IPv6协议本身存在的重定向、泛洪等漏洞。文献[6]和文献[7]提出了双栈机制下将会无形增加安全暴露面,漏洞攻击的方式和载荷将会更加多样。本文通过对多款智能家庭网关、家用Wi-Fi路由器进行实验测试,发现当前设备普遍存在IPv6邻居表资源耗尽安全问题,并基于Scapy编写了相关脚本,探讨了有关攻击的报文类型,并给出了该类攻击的有效防范措施。
1 IPv6邻居表资源耗尽
IPv6邻居表在二三层流量转发中扮演重要角色。然而,通过发送恶意流量操作能够使得被攻击子网络由器每秒仅能解析有限数量的IPv6和MAC地址,导致邻居表表项处理功能处于超时状态,从而无法为其他正常报文提供服务。该拒绝服务有两个引发路径,分为本地IPv6邻居表资源耗尽和远程IPv6邻表资源耗尽。
1.1 本地IPv6邻居表资源耗尽
一个IPv6节点的邻居表包含与之通信过的IPv6节点,并显示其IPv6地址、MAC地址、主机名(如果已知)及其接口。与IPv4的ARP表类似,在本地链路上传送数据时,也是根据MAC地址寻找目的主机。
如图1所示,在同一IPv6子网中,攻击节点如果使用该子网前缀下的任一地址(可能不存在)并不断向这一地址发送IPv6数据包,能够导致拒绝服务攻击。攻击原理如图2,攻击者发送的IPv6数据包的目的地址及其MAC地址并不在攻击者和子网IPv6路由器的邻居表中,该子网IPv6路由器有义务通过发送邻居请求包来解析这个目的地址。当攻击者发送大量源地址随机的IPv6数据包时,子网IPv6路由器忙于处理攻击者所发报文,导致邻居表表项处理功能处于超时状态,使得试图加入子网的合法IPv6节点将无法从IPv6路由器获得邻居发现服务,从而阻止该合法节点获得IPv6网络连接。
图1 本地IPv6邻居表资源耗尽攻击
1.2 远程IPv6邻居表资源耗尽
与本地IPv6邻居表资源耗尽异曲同工,如图3所示,当远程攻击者向受害IPv6子网下任一地址(可能不存在)不断发送IPv6数据包时,能够导致拒绝服务攻击。
图3 远程IPv6邻居表资源耗尽攻击
数据包要想到达该IPv6地址,需要IPv6路由器的指引与转发。如图4所示,当攻击者发送攻击数据包后,由于IPv6目的地址及其MAC地址同样不在攻击者和各IPv6路由器的邻居表中,因此,需要首先找到目的地址所在IPv6子网络由器,进行数据包重定向,然后由该IPv6子网络由器发送邻居请求包来解析这个目的地址。当攻击者发送大量源地址随机的IPv6数据包时,子网IPv6路由器忙于处理攻击者所发报文,导致邻居表表项处理功能处于超时状态,使得试图加入子网的合法IPv6节点将无法从IPv6路由器获得邻居发现服务,从而阻止该合法节点获得IPv6网络连接。
图4 远程IPv6邻居表资源耗尽原理
1.3 攻击报文的选择
(1)本地链路攻击
ICMPv6报文是攻击报文首选,因其种类多,同时也是保证IPv6协议运行的重要基础协议。如图5所示,ICMPv6报头中的Type字段表示该ICMPv6报文具体的消息类型,0至127表示差错报文,128至255表示消息报文;Code字段则是基于Type字段区分一个粒度更小的ICMPv6报文。当前正在使用的ICMPv6报文类型共有38个,其中使用最多的是类型1至4的错误消息,128、129的请求与应答消息,以及133至137的邻居发现协议消息。
图5 ICMPv6攻击报文
(2)远程子网攻击
ICMPv6报文大多是基于本地链路的,除了类型为128、129的请求与应答消息(IPv6的ping),其他都不能穿透路由,只能在子网内部传输。因此,进行远程IPv6子网攻击的数据包必须是使用IPv6全球单播地址的上层数据包,基于TCP或者UDP等,只要能够进行路由转发即可,该报文也同样适用本地链路攻击。
1.4 与IPv4的ARP泛洪的区别
与IPv4的ARP泛洪类似,IPv6系统同样维持着一个IPv6地址和MAC地址匹配的邻居缓存表。在本文攻击中,当IPv6泛洪还没填充完全IPv6表时,就因为IPv6邻居表表项处理超时而导致了拒绝服务的攻击效果。
当然,理论上,当一个IPv6节点与IPv6路由器建立连接开始通信时,路由器将会添加该IPv6节点至IPv6邻居表,通过发送带有/64前缀范围内的随机IPv6地址的相关报文到路由器,一方面,路由器将一直处理IPv6邻居表条目,从而导致路由器流量拥挤,并不能承受住264个条目的处理压力;另一方面,IPv6邻居表也面临与IPv4一样的ARP表项被占满的情况。
然而,IPv6的攻击报文与IPv4的相比在数量与类型上有明显优势。一是IPv4主要包括ARP、RARP的请求与应答报文,远远少于IPv6的攻击报文类型。二是IPv6子网划分往往是/64,数量级远远高于IPv4的/24子网。在数量与类型的双重叠加下,防火墙等防御手段在计算能力上往往无法防范此类恶意流量。IPv6邻居表资源耗尽与IPv4 ARP泛洪的异同如表1所示:
表1 与IPv4 ARP泛洪的区别
2 攻击脚本实现
在THC-IPv6攻击套件已有该类攻击相关脚本,但是该脚本基于Linux编写,读取Linux的MAC缓存,不能良好测试其他系统的IPv6协议实现。本文的漏洞攻击利用脚本通过Scapy[8]来实现。Scapy是一个Python程序库,允许用户专注于构造指定字段的数据包,其余部分由程序库自动完成。
在本地链路攻击中,选择发送ICMPv6协议类型为4的意味着
参数问题的攻击数据包,关键代码如下:
在远程子网攻击中,选择发送基于TCP连接的IPv6攻击数据包,关键代码如下:
3 实验
3.1 环境搭建
在实际环境中,实施IPv6邻居表资源耗尽攻击的可能是非法接入的主机、被滥用的应用程序或远程入侵的黑客等,甚至拿一根网线直接连接网络即可进行此类操作。本文构建一个模拟实验环境进行对家用路由器设备进行安全测试,如图6所示,使用家庭智能网关为上层ISP路由器,其LAN口作为Internet输入接入家用路由器的WAN口,形成一个二层路由的实验网络。其中,ISP路由器和家用路由器能够分发全球IPv6单播地址,相互之间能够正常通信。
图6 攻击实验网络分布
3.2 本地链路攻击
实行本地链路攻击时,本地攻击者位于家用路由器的网络中,然后任选该IPv6子网中的某一地址作为目的地址,利用Scapy的循环发送函数sendp()或者sendfast()进行恶意数据包发送。此时,尝试ping该路由器时,发现该路由器已经处于UNREACHABLE状态。
3.3 远程子网攻击
实行远程子网攻击时,远程攻击者位于ISP路由器网络中,与家用路由器处于平行状态,然后任选家用路由器子网中的某一地址作为目的地址,利用Scapy的循环发送函数sendp()或者sendfast()进行恶意数据包发送。此时,尝试ping该路由器时,发现该路由器也已经处于UNREACHABLE状态。
3.4 总结
在搭建的实验环境中,本文的实验测试对象包括基于Linux的ASUS、D-Link、TP-Link、TOTOLINK等厂商的多款家用路由器,以及基于eCos的Tenda AC8路由器,测试对象均存在被IPv6邻居表资源耗尽攻击拒绝服务的漏洞,相关设备漏洞已申报CNVD国家信息安全漏洞共享平台,如表2所示。
表2 家用路由器IPv6邻居表资源耗尽漏洞编号
4 防范措施
与IPv6协议的路由欺骗、邻居欺骗等拒绝服务攻击不同,如采用源地址验证协议SAVI、安全邻居发现SEND等安全措施,其本身的计算量已经可观,而在需要检测大量的攻击报文时将直接导致拒绝服务。如果改变子网划分由/64调整为/120,将会违背无状态地址自动配置SLAAC的标准。如果对IPv6报文进行数量统计,在一定时间内数量超出了预定阈值,超出部分路由器将不作任何处理,既能满足邻居表动态学习需求,也能避免源地址验证带来的资源损耗。因此,限制IPv6报文速率将是一个较好的防御措施选择。
5 结束语
本文基于Scapy编写了IPv6邻居表资源耗尽导致拒绝服务攻击的脚本,对多款家用路由器进行了测试,发现均存在本地及远程IPv6邻居表资源耗尽的安全问题。而该类问题由于恶意报文类型更加复杂多元,IPv6地址空间也更庞大,容易被忽视,需引起家用路由器厂商的重视以进行有效防范。