如何避免IPv6“友邻发现”威胁?

  图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头信息链会被分割为两个碎片。