本节书摘来异步社区《IPv6安全》一书中的第2章,第2.1节,作者:【美】Scott Hogg , Eric Vyncke,更多章节内容可以访问云栖社区“异步社区”公众号查看
2.1 IPv6协议首部
IPv6安全
IETF在RFC 2460中定义了IPv6协议首部。这个标准讲解了在Internet协议新版本中使用的IPv6首部格式。首部基于32比特边界,以便于32比特处理器利用首部结构进行处理。IPv6首部具有不同于IPv4首部的许多改变,而且由于这些改变,IPv6变成与IPv4完全不同的协议。图2-1给出IPv6协议首部及其字段。
2.1 IPv6协议首部
在IPv6首部内部的每个字段都有非常具体的职责。下面列出这些字段及其用途。
版本:对于IPv6而言总是等于6。
流量类型:识别数据包的优先级和服务类型。
流标签:保留字段,识别一个唯一流(flow,断续流)、连续流(stream)或连接组成部分的数据包。
净荷长度:以字节(8比特)定义的IPv6首部后面的数据包长度。
下一首部:识别IPv6首部后面的首部类型。
跳数限制:数据包能够穿越的剩余跳数计数器。
源地址:发出这条数据包的节点的IPv6地址。
目的地址:这条数据包要发往的IPv6地址。
IPv6 的协议和首部自身没有任何安全弱点,而恰是这些数据包的创建和处理方式才导致安全问题。IPv6数据包并不破坏计算机;黑客破坏计算机。
隐蔽信道是可能导致IPv6安全实践人员头痛的一个领域。黑客通过伪装他们的数据包,试图隐藏他们的通信。通过将一种协议内嵌在另一种协议内部,也可以创建形成隐蔽信道。这样的一些通信不易被检测到。使用IPv6协议自身作为一个隐蔽信道也是可能的。在IP首部内部的字段或传输层首部内部的字段可用于隐蔽信道。IPv6地址、流标签、错误消息、控制消息、额外内嵌的首部、TCP序列号和许多其他字段都可用来隐藏通信。这些字段中的比特可用来在两台主机这两台主机正在发送数据包之间发送数据。隐蔽信道几条具备任何协议的性能,所以它一点都不新。许多年来,人们一直使用IPv4 ICMP作为应用之间隐藏从多其他类型信息或通信的一种方法。但是,对于IPv6协议这是人们需要知道的。
自从支持IPv6的最早IOS版本以来,Cisco的设备一直就能够在接口层过滤IPv6流量。采用ipv6 access-list命令,在Cisco的路由器中实现访问控制列表(ACL)。ACL是数据包分类机制,定义被允许或拒绝的实际网络流量。ACL由访问控制项(ACE)组成,ACE是ACL策略内部的各项配置命令。因此,当将ACL施加到接口配置时,这些访问列表允许网络设备实现网络安全策略。
对于一个IPv6数据包,存在许多组成元素,为了成功地构建一个细粒度级的安全策略,您需要扩展的ACL选项。在一个网络设备上的过滤操作,要求过滤系统分析首部,并跳过几个扩展首部,到达高层信息,以确定该协议数据包是否应该通过。IPv6过滤器需要处理分段,并确定一个数据包分段是合法的还是多数据包攻击的组成部分。过滤设备必须能够在一个数据包的首部、扩展首部、高层信息和净荷上实施过滤。
IPv6 数据包内部的各字段是本章的关注点。但是,在深入探讨这些首部字段的安全隐含意义之前,必须首先描述ICMPv6和多播的主题。
2.1.1 ICMPv6
对于IPv6的正确运行,RFC 4443定义的ICMPv6是一个非常重要的协议。IPv4通信不一定需要IPv4的ICMP,与此不同的是,ICMPv6对IPv6是必备元素。ICMPv6具有独立的IPv6扩展首部类型号58,所以它虽然在IPv6之上作为一个协议运行,但与IPv6一起才能发挥作用。
ICMP 历史上是作为一个协议被开发的,在IPv4网络的测试和排错中起辅助作用。ICMP提供有用的功能(例如ping和traceroute),帮助验证端到端的IP连接性。ICMP也向节点提供有关通信出错的回馈信息。对于IPv4仅需要ICMP的部分功能。但是,因为ICMP没有内置的安全性,所以它具有与IPv4协议自身类似的弱点。随着时间消逝,攻击者试图使用ICMP得到好处,网络管理人员不得不采取完全地过滤该协议,从而防止这些攻击。因为禁止了ICMP的有用功能,所以也制约了该协议的有效性。
注释
多数防火墙管理人员倾向于阻止IPv4的所有带内ICMP消息。这可能是一种过度反应,原因是虽然一些ICMP流量可能是危险的(像ECHO_REQUEST(允许对网络进行破坏)或REDIRECT(可取得类似源路由的一种结果)),但有几种 ICMP 消息还是有用的和必需的,其中最著名的是路径MTU发现(PMTUD)。IPv4防火墙不应该阻塞所有进入的ICMP流量,而应该允许一些特定的ICMP数据包。
下述各节描述ICMPv6的功能、ICMPv6消息类型以及可利用ICMPv6的 攻击。
1 ICMPv6功能和消息类型
ICMPv6提供如下功能。本书通篇讨论这样的几种功能,所以对ICMPv6和它所提供的功能有一个良好深入的理解是具有重要意义的。
邻居发现协议(NDP)、邻居通告(NA)和邻居请求(NS)提供与IPv4地址解析协议(ARP)功能对应的IPv6功能。
路由器通告(RA)和路由器请求(RS)帮助各节点确定有关它们的LAN的信息,例如网络前缀、默认网关和可帮助它们通信的其他信息。
回声请求(Echo Request)和回声应答(Echo Reply)支持ping 工具。
PMTUD确定通信用的合适MTU大小。
多播侦听发现(MLD)为通信IP 多播加入和退出提供类似IGMP的功能。
多播路由器发现(MRD)发现多播路由器。
节点信息查询(NIQ)在各节点间共享节点的信息。
安全邻居发现(SEND)帮助邻居间进行安全通信。
移动IPv6用于移动通信。
ICMPv6消息包含一个类型(1 个字节)和一个代码(1 个字节),从而将消息的细节与消息类型关联起来。ICMPv6数据包有一个校验和(2 个字节)和净荷(尺寸是变化的)。ICMPv6错误消息将连接中发生的任何错误的有用信息返回到IPv6通信的源。错误消息使用类型0~类型127,而信息消息使用类型128~类型255。IANA维护ICMPv6类型号码的一个列表。
限制ICMPv6数据包(在一个LAN上发送)传播的是,许多数据包将它们的跳限制设定为最大值255。因此,三层设备应该检查:某些类型的ICMPv6数据包不以任何小于255的值设置跳限制。所有IPv6节点应该丢弃/忽略跳限制小于255的任何NDP数据包。而且,如果接收者接收到跳限制小于255的一个数据包,则该接收者就知道这条数据包可能是精心伪造的,应该拒绝该数据包。
将跳限制设定为255的这些链路特定的ICMPv6消息,会被路由器和防火墙自动地丢弃。因此,为了防止这些数据包在这些设备间转发,不需要执行任何动作。默认情况下,在一台三层设备不转发源地址为链路本地地址的ICMPv6消息和跳限制等于255的ICMPv6消息。
与攻击及其跳限制数值有关的还有一个问题。跳限制能够防止数据包通过太多的跳数进行发送,或陷入无终止的循环。当一台路由器或防火墙接收到跳限制等于 1 的一个数据包,则它就丢弃该数据包,原因是该数据包超过了跳限制约束。当路由器或防火墙丢弃数据包时,它向数据包的源发回一条 ICMPv6超时消息。如果一名攻击者知道这是一台防火墙的默认行为,则这个人就能产生大量数据包,这些数据包到达防火墙时恰恰它们的跳限制减到0。这可能是在防火墙上导致资源消耗攻击的一种技术。
如下消息必须将它们的跳限制设定为255。
RS:类型133,RA:类型134。
NS:类型135,NA:类型136。
重定向:类型137。
逆向邻居发现请求:类型141。
逆向邻居发现通告:类型142。
证书(Certificate)路径请求(SEND):类型148。
证书路径通告(SEND):类型149。
PMTUD和其他ICMPv6错误消息是上述规则的例外,原因是这些消息具有可用于穿越网络的跳限制。
您也必须检查一条ICMPv6数据包的源和目的IPv6地址。通常情况下ICMPv6错误消息包含形成该错误的数据包的一部分内容。在ICMPv6错误消息的净荷内部包含那个原始的ICMPv6首部。如果错误消息的目的地址与内嵌ICMPv6数据包的源地址不匹配,则该数据包就是有问题的。这种类型问题的另一个例子是多播侦听发现(类型130、131、132、143)消息。这些数据包应该有链路本地源地址。如果它们没有链路本地源地址,就应该丢弃这些数据包。
当然,对于监视ICMPv6数据包合法源地址和目的地址的规则而言,总是存在一些例外。典型情况下,ICMPv6消息有单播源地址。但是,在无状态自动配置情形下,源地址有时可以是非指定地址(::)。MLD ICMPv6消息以链路本地地址作为它们的源地址。ICMPv6消息的目的地典型情况下是单播地址;但是,对于 NDP消息,它们也可以是被请求节点的多播地址。RA消息也可发送到所有节点地址FF02::1。
2 ICMPv6攻击和应对技术
因为ICMPv6是IPv6通信的一个重要组成部分,所以它也就成为攻击的焦点。这些攻击可以是ICMPv6消息的简单欺骗,或可直接用以攻击网络基础设施。无论在哪种方式下,都必须仔细地控制并保障ICMPv6的安全。本节包括在网络上不同节点允许何种消息通过的建议。
一种技术是简单地阻塞所有还没有被IANA分配的ICMPv6消息类型。下述ICMPv6消息类型不应该在任何网络上看到,应该加以丢弃。
未分配的错误消息:类型5~99和类型102~126。
未分配的信息消息:类型155~199和类型202~254。
试验性消息:类型100、101、200、201。
扩展类型号:类型127、255。
但是,如果IANA分配了新消息类型,则必须对这些过滤器进行调整。
对源于贵组织机构之外IPv6地址的ICMPv6回声请求数据包加以拒绝,是一项最佳实践。如果您要采用ICMPv6,则对如何过滤不必要的ICMPv6消息必须更加小心谨慎,原因是正常运行IPv6网络仍然需要ICMPv6的一些功能。在确定哪些ICMPv6消息是必要的之后,您应该考虑有选择地过滤ICMPv6消息。因为ICMPv6用于许多合法目的,所以必须允许几类消息通过您的网络周边设备。下述消息落在这个类别之内,应该允许它们进出Internet。
类型1:目的地不可达。
类型2:数据包太大——PMTUD。
类型3:超时。
类型4:参数有问题。
您也许考虑允许其他类型消息通过您的网络周边设备。如果您能够控制ICMPv6类型128和类型129(回声请求和回声应答)消息数据包的源和目的地,则可考虑允许所有这些类型的消息通过。考虑到扫描这样一个大型地址空间的困难性,您也许觉得双向允许这两种消息通过是可接受的一个风险。
如果您的网络没有使用某个特定的功能,则您可以过滤那种ICMPv6 消息的类型。这种消息类型的一个例子是IPv6的路由器重新编址选项(RFC 2894)。这项特征功能使用ICMPv6类型138的消息,可用于对路由器进行重新编址。如果攻击者利用这项功能,则将是危险的。不应允许这些数据包通过您的网络周边设备,它们不应穿越站点边界。这些消息可以通过 IPSec 作为一个选项进行鉴权,限制与这些消息有关的问题,但这需要花费一定的代价。因为这些数据包具有多播站点范围地址或站点本地目的地址,所以这些数据包可被其他防火墙规则捕获,并默认地丢弃掉。因为站点本地地址已经被弃用,所以那些规则将匹配这些数据包(进而丢弃这些数据包)。
节点信息查询消息(类型139、140)是应该在网络周边和网络内部丢弃的ICMPv6消息的另一个例子。在本章后面给出了使用这个协议存在偶然泄露有关计算机信息的风险。如果这项功能在您的网络上没有被使用,则简单地让这些数据包通过您的过滤策略,并匹配默认的拒绝规则。
如前所述,ICMPv6错误消息可在净荷内部包含导致错误的原始数据包的一部分。因为在IPv6网络上最小的最大传输单元(MTU)是1280字节,所以极可能原始数据包的整体内容都包含在ICMPv6错误数据包的净荷内部。在这个净荷中存在的问题可被用作两个节点之间的隐蔽信道。因此,防火墙应该检查ICMPv6错误数据包内部的数据包分段,判断数据包分段是否合法。如果错误数据包分段没有包含合法的IPv6地址,或如果ICMPv6错误数据包不是在相反方向传输的错误的无状态发送的响应,则应该丢弃这条数据包。
一种可能的攻击手段可能是,通过产生大量不合法的数据包(例如极大型数据包,或在路径终止(path expiring)情况下的跳计数)并将那些数据包发送到一台网络设备,简单地产生一次拒绝服务(DoS)攻击。网络设备需要对那些数据包中的每个数据包以一条ICMPv6错误消息作出响应,从而人为地增加这台网络设备的工作量。如果要产生足够多的错误数据包,这台设备的CPU利用率就可能达到很高的程度,导致设备性能降级,甚至出现故障。好消息是,您可以控制一台路由器产生IPv6 ICMP错误消息的速率。路由器产生ICMPv6错误消息的速率可使用ipv6 icmp error-internal milliseconds命令加以限制。在第6章中详细讲解这条命令。
多数过滤系统的默认动作是丢弃没有被显式允许通过的数据包。因此,仅准确地允许您想转发的ICMPv6消息,将拒绝所有其他消息。相比于试图显式拒绝贵组织机构不使用的所有ICMPv6,这种方法是比较简单的。除了依据消息类型外,许多过滤系统也依据ICMPv6消息的码(code)进行过滤。在ICMPv6如何操作使用方面,这种方法能够给予您非常小的控制粒度。
后续章节将更加详细地讲解ICMPv6的安全。但是,欲了解关于这个主题的更多信息,请见RFC 4890,该RFC文档是专门针对ICMPv6安全策略的。
2.1.2 多播安全
当IPv6设计人员起草该协议时,他们希望避免使用低效率的广播机制。IPv6依赖于多播实现IPv4中由广播实现的许多功能。事实上,IPv6没有数据包转发的广播方法,相反,它使用多播,将之用于所有的一对多通信。IPv6将多播用于邻居发现、动态主机配置协议(DHCP)和传统的多媒体应用。因为IPv6极度依赖多播,所以攻击者如果将流量发送到多播地址将肯定会出现问题。在本章后面给出一个例子,说明攻击者如何向链路本地所有节点多播地址FF02::1发送数据包,并观察哪些节点做出响应。像FF05::2(所有IPv6路由器)和FF05::1:3(所有DHCPv6服务器)等多播组将是攻击目标。DHCPv6必然是攻击者的一个目标,因此控制哪些系统可与DHCPv6服务器通信是有重要意义的。
如果一名攻击者向多播组发送流量,作为该组成员的所有系统将做出响应,这会向该攻击者提供进一步攻击可使用的信息。攻击者将拥有IPv6网络内部所有路由器和所有DHCPv6主机的信息。这对攻击者确定什么样的其他计算机存在于网络将是至关重要的,得到信息的方法如邻居缓存、绑定更新或DHCPv6日志。我们甚至可以认为,对于 IPv6,破坏阶段将不再是必需的。为了发起针对所有DHCPv6服务器的盲攻击(无需返回流量),攻击者仅需向FF05::1:3发送数据包即可。
多播不仅可以直接用作破坏网络的平段,而且可以用作放大DoS攻击流量的一种方法。在目的地为一个多播地址的数据包中的伪造的源地址,将导致发向被伪造源地址的返回流量放大(考虑一下Smurf攻击)。好消息是RFC 2463声明“一条ICMPv6错误消息,决不能因为接收到一条目的地为一个IPv6多播地址的数据包而发送出去”,所以Smurf攻击不能针对一个IPv6网络发起攻击。哎(令人遗憾的是),RFC 2463同时声称存在两个例外……这在安全方面打开了潜在的漏洞。针对DoS的应对技术,是限制发送这两种ICMP消息类型的速率。
能够加以实施的一项技术是检查数据包的源地址,而不是仅检查数据包的目的地址。这种方法将拒绝使用多播地址作为源地址的任何数据包。发送到多播地址的各数据包典型地以多播服务器的单播地址作为数据包的源地址。RFC 4443 也声称,接收到一条多播源地址数据包的节点不应该发回任何类型的ICMPv6错误消息。
另一项技术是在网络周边阻塞所有全局范围多播数据包和站点本地范围多播数据包。这是采用IPv6访问控制表完成的,该表阻塞进或出整个多播地址范围FF00::/16的所有流量。之后这个访问控制表可用于处在网络边界的接口。例2-1给出在Cisco路由器上的实现方法,同时仍然允许邻居发现和路由协议所要求的链路本地多播通信。
如果在环境中没有使用MLD,就可防止通过防火墙发送该类数据包。无论什么情况,在网络周边都必须丢弃进出目的地为任何多播地址(FF05::/16)的所有流量。
从历史角度来看,保障多播的安全就一直是一项挑战。多播的本质是单一源发送到多个接收者。因此,考虑到源将会被“反馈”流量压垮,所以接收者不能发送任何类型的消息确认。需要双向通信的保障机制很难使用多播。因为公共密钥的问题,所以多播安全是难以解决的一个问题。事实仍然是,如果你告诉每个人密钥是什么,那么密钥就不再是秘密了。尽管如此,最佳实践仍然是防止不必要的流量发往这些多播组。