如果企业正着手准备部署IPv6,那么一定要了解“友邻发现(ND)”及其漏洞。
IPv6友邻发现是IPv6协议套件的一个核心部件。它可用于IPv6解析和IPv6无状态地址自动配置。本文主要介绍各种基于友邻发现(ND)的攻击,以及阐述IT管理员如何使用一个开源IPv6工具套件来评估所有可能受此类问题影响的安全设备的有效性。
IPv6友邻发现(ND)是IPv6协议套件的一个关键组件,它部署在IPv6节点,包含许多的功能:
· IPv6地址解析
· 无状态地址自动配置
· 重复地址检测
· 友邻中断检测
IPv6地址解析包括将一个友邻节点的IPv6地址映射到相应的链路层地址上。在IPv4中,执行相同功能的是地址解析协议(Address Resolution Protocol, ARP)。无状态地址自动配置(Stateless address autoconfiguration, SLAAC)包括发现邻近路由器和获取用于建立IPv6连接的网络配置信息。重复地址检测(Duplicate address detection, DAD)是一个在部署一个IPv6网络通信地址之前用于检测重复IPv6地址的功能。最后,友邻中断检测(NUD)可用于评估一条通向相邻节点路径的可达性。在遇到节点中断时,可以部署一条替代路径。
友邻发现使用互联网控制消息协议v6消息控制它的所有功能;它不同于ARP,后者直接运行在底层的链路层协议之上。虽然这种设计方式看起来“更整洁一些”(因为ND不会绑定到任何一种链路层技术上),但是这里也包含一些重要影响。例如,任何用于监控ND流量或防御ND攻击的设备或技术都必须应对IPv6数据包的多样性及其复杂性。又例如,IPv6碎片和IPv6扩展头信息就被证实可能会影响任何ND安全性、监控设备或技术。
IPv6地址解析及其工作方式
当IPv6数据包发送到本地链路时,一个相邻节点的IPv6地址(可以是最终目标或中间路由器)需要映射到相应的链路层地址。
想要搞坏地址解析功能的最简单方法是部署nDisc6 IPv6诊断工具的ndisc6工具(开源)。ndisc6工具可以破坏两个功能:解析得到的IPv6地址和用于执行地址解析的网络接口。例如,它可能将IPv6地址fc00:1::1解析为下面的链路层地址:
图1:解析一个IPv6地址
一个IPv6实现在一个名为友邻发现缓存(与之对应的是IPv4的ARP缓存)中保存着IPv6地址到链路层地址的映射列表。在手工评估一个节点是否下载了错误地址映射(可能由攻击造成的错误)的过程中,检查友邻缓存是非常有用的。所有IPv6实现都提供了用于检测友邻缓存的方法或工具。例如,在GNU/Linux系统中,使用“ip”命令就可以检查友邻缓存:
图2:检查友邻发现缓存
结果中每一行包含一个IPv6地址、友邻所在的网络接口、相应的链路层地址、表示地址是否指向一个路由器的关键字(router)和这个记录的状态(例如,友邻是否可达、映射信息是否失效等)。
在BSD系列操作系统中,则可以使用ndp检查友邻缓存的内容:
图3:在BSD系统中检查友邻缓存
注意,虽然上面的结果与Linux有一些不同,但是两者的信息是基本一致的。
如果有攻击者能够在友邻缓存中加入一些非法映射,那么他就能够将本地数据包随意引流到任意节点,然后执行中间人(MITM)攻击或分布式拒绝服务(DDoS)攻击。决定最终的攻击属于MITM还是DDoS的因素是受攻击地址映射的目标链路层地址:如果攻击者能够将受攻击的IPv6地址映射到自己的链路层地址,那么他执行的就是MITM攻击。如果他将受攻击地址映射到一个不存在的链路层地址,那么这就是DDoS攻击。
另一个诊断工具是SI6 Networks的IPv6 Toolkit,它是一个开源IPv6安全评估和故障修改综合工具,它支持各种操作系统(包括GNU/Linux、BSD和Mac OS)。它包含许多实用工具,如可用于发送伪造友邻广告(NA)消息的na6工具。
na6可用于执行前面提到的MITM或DDoS攻击。例如,如果将通向IPv6地址fc00:1::1的所有流量转发到链路层地址11:22:33:44:55:66,攻击者可以执行下面的na6命令:
na6 -i eth0 -W fc00:1::1 -E 11:22:33:44:55:66 -L -v –o
按前面介绍的方法手工检查友邻缓存,就可以看到这个工具对于ND缓存的攻击效果。
正如前面所提到的,攻击者可能利用IPv6扩展头和/或碎片去回避安全控制。因此,如果攻击者想要绕开一些无法处理整个IPv6头信息的安全设备,那么他可以执行下面的命令,发送一些恶意NA消息:
na6 -i eth0 -W fc00:1::1 -E 11:22:33:44:55:66 -L -v -o
-u 64
显然,这个命令只是在前一条命令的基础上添加了选项“-u 64”,它的作用是在规定的IPv6头信息之后插入一条64字节的目标选项头信息。
最后,理论上ND消息(包括NA消息)都采用了碎片机制。虽然RFC 6980禁止在ND中使用碎片,但是一些未更新的实现可能仍然接受这些数据包。在评估一个IPv6网络或实现时,我们应该检查是否可以使用带有IPv6碎片的ND去绕开安全控制。这里有两个不同的测试例可以使用:发送一个IPv6原子碎片格式的NA消息和发送一个超大IPv6头信息链的NA消息。
RFC 6946定义的IPv6原子碎片实际上是一些包含偏移值为0和MF(更多碎片)位为0的IPv6碎片头信息的IPv6数据包——即包含一个碎片头但只有一个碎片的数据包。执行下面的命令,就可以在na6工具中发送原子碎片格式的数据包:
na6 -i eth0 -W fc00:1::1 -E 11:22:33:44:55:66 -L -v -o
-y 500
其中,选项“-y 500”表示工具会将友邻广告消息分割为500字节为单位的碎片——但是由于整个NA消息远远小于500字节,所以最终发送的消息将采用原子碎片格式。
第二个测试例是一个超大IPv6头信息链。如果一个数据包已经分割为碎片,并且第一个碎片不包含所有协议头信息,包括从第一个规定的IPv6头信息到最上层协议(如传输协议头信息),那么这个数据包就是一个超大IPv6头信息链。下图显示的就是一个超大IPv6头信息链。
图4:一个超大IPv6头信息链
RFC 7112定义了超大IPv6头信息链,反对使用这种头信息,并且明确规定在遇到时允许丢弃相应的数据包。然而,一些过时的IPv6实现可能仍然接受这些数据包,因此不可能认为受攻击节点一定会丢弃这些数据包。使用na6工具,执行下面的命令就可以以超大IPv6头信息链的格式发送NA消息:
na6 -i eth0 -W fc00:1::1 -E 11:22:33:44:55:66 -L -v -o
-u 500 -u 100 -y 400
这实际上就是前面使用的同一个攻击命令,只是增加了两个目标选项头信息(一个是500字节,后面紧跟一个100字节的头信息),以及一个将NA消息分割为最大400字节碎片的请求(“-y 400”选项)。因此,第一个碎片的大小不足以传输整个IPv6头信息链,因此IPv6头信息链会被分割为两个碎片。
作为IPv6网络安全评估的一部分,我们可以执行这里的每一个测试例,从而评估所部署的安全控制措施是否能应对这些攻击方式。
原文发布时间为:2015年02月10日