B^B .. Oh

一群爱搞事情的小弱鸡

IPv6安全--扩展首部

2.2 扩展首部威胁

2.2.1 扩展首部综述

IPv6使用扩展首部(在RFC 2460中定义),给出数据包的传输层信息(TCP或UDP)或扩展协议的功能。扩展首部是以IPv6首部内部的下一首部(NH)字段加以识别的。这个字段类似于IPv4数据包中的协议字段。在IPv6首部内部,第48~55比特(8比特)形成下一首部字段,它用以识别IPv6首部后面的首部。该可选字段指明,在数据包格式中IPv6首部后面的是什么类型的信息。

为了增强IPv6网络层的各种功能,定义了扩展首部。扩展首部在IPv6首部后面,是可选字段的一个序列表。一个扩展首部的典型格式是一个8比特可选类型(在列表中所包含的下一扩展首部的数量)、一个8比特无符号整数的选项数据长度(说明首部的长度)和选项数据净荷(变尺寸的长度)。扩展首部可以组合使用,其中几个扩展首部出现在单一数据包中,但典型情况下仅有一些扩展首部可组合使用。图2-2给出一个扩展首部的结构,并描述它们是如何形成数据包净荷前面的首部链表的。有许多类型的扩展首部可用于IPv6数据包,但这个图说明它们在数据包中是如何排列的。

《IPv6安全--扩展首部》

如下规则适用于扩展首部。

除了目的地选项首部之外,每个扩展首部不应出现一次以上。

逐跳选项首部仅应出现一次。

逐跳选项首部应该是出现在列表的第一个首部,原因是它要由沿路的每个节点加以检查。

目的地选项首部应该至多出现两次(在一个路由首部之前和在上层首部之前)。

如果要使用的话,那么目的地选项首部应该是列表中的最后一个 首部。

分段首部不应出现一次以上,不应与巨型净荷逐跳选项组合使用。

如在RFC 2460中所定义的,各扩展首部有一个特定的顺序。必须以各扩展首部在数据包中出现的顺序进行处理。当一个数据包包含多个扩展首部时,顺序才是有意义的,应该使用如下顺序。

1.IPv6首部。

2.逐跳选项首部。

3.目的地选项首部。

4.路由选路首部。

5.分段首部。

6.认证首部。

7.封装安全净荷首部。

8.目的地选项首部。

9.上层首部。

每个扩展首部都有一个唯一号码,用于表示下一首部的数值。这个号码标识后跟首部的类型,使接收者知道如何分析后跟的首部。表2-1给出各种扩展首部的下一首部号码。这是由IANA定义的,与用于IPv4的协议号码保持同步。

《IPv6安全--扩展首部》

IPv6首部的结构使检查数据包成为具有挑战性的一项任务。对于路由器,它们的任务是十分简单的。它们仅寻找目的地址,并查看任何逐跳选项。因为目的地址和逐跳首部较早地出现在数据包中,所以这是比较容易的。防火墙需要完成一台路由器的所有功能,并从扩展首部一直分析到上层协议信息。这增加了过滤策略的复杂性,并加重了防火墙的负担。防火墙为的是确定数据包应该被允许通过还是被丢弃。因为接收一条IPv6数据包的末端节点必须完全地分析整个首部集合,并对其进行处理,所以该节点要做的工作最艰难。

2.2.2 扩展首部的弱点

因为协议规范没有约束扩展首部的使用,所以如果被恶意使用可能潜在地造成问题。攻击者可在扩展首部上对首部做手脚,从而制造攻击。攻击者可制造满足协议规范且在一个大型表中具有链接在一起没有限制扩展首部数量的一个IPv6数据包。像这样的一个数据包可对沿传输路径的中间系统或目的地系统产生一次DoS攻击。精心设计的数据包可能顺利通过网络而不造成任何问题。将许多扩展首部链接在一起,是攻击者避免防火墙和入侵防御系统(IPS)的一种方式。具有巨型扩展首部链的数据包可能是危险的。在单一数据包中的多个扩展首部可将净荷扩展到第二分段的数据包,而防火墙对第二分段不作检查,仅查看初始分段。

精心制造的扩展首部还可以导致目的地主机的拒绝服务。如果那台主机没有实现首部的正确检查,就可能潜在地导致一次软件失效。网络层约束检查应该将这种攻击丢弃,但一些实现却没有这样做。冗长的扩展首部由于要消耗资源,可能潜在地导致对目的地主机的拒绝服务,或可能使主机协议栈崩溃。即使在攻击者和标靶节点之间存在防火墙,因为防火墙没有对数据包进行完全检查,仍可能允许这个精心伪造的数据包通过。

应对这些攻击的解决方案包括简单地过滤扩展首部,或使具有高度专门化规则的产品仅处理应该被允许的扩展首部。应该特别注意的扩展首部是目的地选项首部、移动性首部和路由选路首部。

为了控制不同扩展首部,在一个标准Internet操作系统(IOS)IPv6访问控制列表(ACL)中会存在差异巨大的选项。从 IOS 版本12.2(13)T和12.0(23)S开始,Cisco路由器已经能够基于扩展首部实施过滤。例2-2给出在一个访问控制表中可以使用的各种首部配置选项。

《IPv6安全--扩展首部》

应该在接收到含有扩展首部的数据包的所有路由器或“中间设备”中,执行完全的扩展首部链分析。这项附加安全的代价是处理这些扩展首部的额外负担。快速地过滤扩展首部要求在硬件中执行完整的首部链分析。这即使不是不可能,也是困难的,原因是整个首部结构是不确定的。这项建议也与RFC 2460发生冲突,在该RFC中声称仅有逐跳选项首部由沿数据包路径的路由器加以分析。但是,希望提供额外安全的厂商可能违反这个RFC,并深入到内部,检查扩展首部。而且,如果在流中间的防火墙丢弃未知的扩展首部,当开发、实现并部署新的扩展首部时,就可能导致问题出现。

下面各节讲解绝大多数这些选项首部的安全隐含意义。但是,直到第 8 章才讨论AH和ESP首部。

2.2.3 逐跳选项首部和目的地选项首部

逐跳选项首部和目的地选项首部(DOH)具有相同结构,但它们的目的却不同。逐跳选项首部必须由沿数据包路径的每个节点进行检查,而目的地选项首部仅由目的地节点进行检查。这两类首部都遵循选项首部的典型结构,有一个8比特(1字节)的下一首部字段、一个8比特(1字节)的首部长度字段和一个可变长度的选项字段。选项字段有一个1字节选项类型字段、一个选项长度字段和其他的选项数据。选项类型字段的前两个比特确定节点将如何处理数据包,具体内容如下。

00:忽略选项。

01:丢弃数据包。

10:丢弃数据包,但向源发送一条ICMPv6参数问题(代码2)响应。

11:丢弃数据包,但向源发送一条ICMPv6参数问题(代码2)响应(仅当目的地不是一个多播地址时)。

选项类型的第3个比特告诉节点在每跳处该选项是否改变(1=它改变了,0 =它没有改变)。

目前仅定义了一些逐跳/目的地选项。

Pad1选项:将一个字节的填充插入到首部的选项部分。

PadN选项:将数量变化的字节填充插入到首部的选项部分。

隧道封装首部选项:在IPv6数据包内部封装其他数据包。

路由提示选项:沿路的所有路由器都必须处理这个选项首部。

巨型净荷选项首部:指明一条巨型数据包。

家乡地址选项:包含移动节点家乡地址的移动IPv6数据包。

在任何IPv6数据包内部仅应出现一次逐跳选项首部,但数据包可包含的选项数量却没有限制。在单一逐跳首部内部,可能有许多选项,这些选项可以任意顺序出现。在首部内部也可能有定制的、但还未知的选项,沿路的节点将会忽略这些选项,原因是它们不知道如何分析这些选项。另外,对于不能这样分析的IPv6节点而言,未知选项可能导致问题出现。Pad1和PadN选项也可出现多次,且是变长尺寸的。

在逐跳选项首部或目的地选项首部中,使用填充可确保一个IPv6数据包在一个字节边界结束。因为首部和选项首部已经在一个八进制边界对齐,所以典型情况下不需要填充。要求PadN选项具有一个0字节净荷,所以如果这些字段包含任何信息,那么它就是一项错误的或存心制造的东西。这些填充选项可用作包含一条隐蔽信道组成部分的信息。如果这些填充选项使用不当,也可导致其他问题,例如防火墙资源消耗。因此,要求防火墙检查PadN选项不包含净荷,以及填充内部的数据不是某种类型攻击的组成部分就是一种不错的思路。

为了理解这种类型的隐蔽信道是如何工作的,您可实施一项测试,方法是:产生一个IPv6数据包,该数据包有一个大型的PadN逐跳选项首部。对于这个例子,您可使用Scapy6工具。Scapy是一个 Python 程序,包含精心构造数据包的各种定义。在Scapy原始数据包生成库之上,Scapy6添加了IPv6能力。Scapy6数据包篡改脚本可生成具有特定伪造首部的定制数据包。Scapy6可容易地生成格式、语法上正确的数据包,或与标准不一致的数据包,作为一项攻击或用于安全研究。您可使用像Scapy6等的 工具 来测试您的配置,从而验证让您可防止某些类型的数据包穿越您的网络。

图2-3给出一个测试网络的配置,其中攻击者在 VLAN 11 上,受害者在VLAN 22上。这张图将用于本章其他几个例子中,所以您也许偶尔会回来看看。例2-3包含输入到Scapy6中的几条命令。首先定义一个目的地“dest”,并产生带有期望选项的一个数据包“hbhpkt”。在本示例中,您将产生满足如下条件的一个数据包:有逐跳选项首部,在一个PadN选项中有150个字节的数据,之后跟有一个TCP首部,目的为端口80。之后通过输入一条hbhpkt.show2()命令,您就能够清晰地在数据包内容中看到多个X。发送这个数据包之后,从Web服务器接收到一条响应,没有关于净荷中X的信息。

《IPv6安全--扩展首部》

例2-3 Scapy6逐跳扩展首部测试

《IPv6安全--扩展首部》

这个数据包由目的地成功接收,利用协议分析器,您就能够观察到大型的PadN选项。从运行在目的地机器上的 Apache 服务接收到的数据包是一个SYN/ACK数据包(标志=SA),这验证了数据包是由目的地节点上的应用接收并做出响应的。您能够看到如何利用IPv6首部各部分来产生一条隐蔽信道。因此,防火墙应该丢弃具有多个填充选项的数据包和填充大于 5 个字节的数据包。另外,防火墙也应该丢弃数据字段中为非0填充的数据包。

1 IPv6扩展首部破坏(Fuzzing)

还有另一种工具,可用来产生精心构造的IPv6数据包,称为IP栈完整性检查器(ISIC)。这是产生随机数据包的一个工具,目的是测试IP栈是否正确执行。它像一个协议破坏器(fuzzer,起毛器),其中一个软件程序产生随机数据,称为fuzz(起毛),测试接收软件的约束检查(bounds checking)。这个工具允许产生带有各种选项的IPv4和IPv6(isic6)、ICMPv4/ICMPv6(icmpsic6)、TCP(tcpsic6)和UDP(udpsic6)数据包。例2-4给出isic6是如何产生各种数据包的:源于VLAN 11上攻击者的计算机,目的地为VLAN 22上的一台计算机。-m参数表明该工具将产生最大带宽5kB/s。-H参数表明isic6将100%发送具有随机的或无效逐跳选项的数据包。-F、-V和-P参数分别表示没有分段、不良(bad)版本或随机净荷的数据包。

《IPv6安全--扩展首部》

isic6产生网络上的大量流量,目的地接收到带有随机选项类型的多个数据包。这些数据包中的多数作为“未知选项”被拒绝,使用ISIC将一条ICMPv6错误响应数据包发回 Linux 主机。

2 路由器提示攻击

在逐跳选项首部内部,路由器提示选项也是一个潜在的安全问题。这个选项的存在是向一台路由器指明,应该仔细地查看数据包首部的内容。如果使用不当,对于接收到大量包含路由器提示选项的数据包的路由器而言,可能导致性能问题。因为路由器没有大量的空闲CPU周期,所以您应该将宝贵的CPU资源留给重要的任务,并限制上述类型的数据包消耗资源。这种类型的攻击,消耗沿流量路径节点上的资源以及目的地节点上的资源。IANA维护一个已分配路由器提示选项数值的列表,已经分配的仅是数值0~35。应该拒绝36~65535之间的路由器提示选项。

可以使用Scapy6执行一个测试,并产生一个路由器提示目的地选项首部。例2-5给出如何产生一个这种类型数据包的一个例子。产生下一首部为60的一个数据包“rapkt”,即带有路由器提示选项的一个目的地选项首部。这个数据包向目的地“dest”发送,dest上运行着一个Web服务器应用。

例2-5 Scapy6路由器提示数据包制造过程

《IPv6安全--扩展首部》

现在,您可在Cisco 2811路由器上创建一条新的ACL,阻塞这种攻击。如例 2-6 所示的这条具体ACL,可针对路由器提示选项指定准确的目的地选项类型5。

例2-6 阻塞路由器提示数据包的访问控制列表

《IPv6安全--扩展首部》

在例2-6中,拒绝路由器提示选项的ACE激活了日志功能。在一条ACE上执行日志功能会导致路由器CPU利用率上升。在这个例子中记录的日志仅仅图解说明您如何能够观察到被伪造的数据包。

Cisco IOS ACL可使用如下访问控制列表可选的关键字,具体地设置允许或拒绝逐跳或目的地选项首部。

《IPv6安全--扩展首部》

在表2-2中解释过滤非预期的目的地选项首部的关键字。

《IPv6安全--扩展首部》

现在当Scapy6测试再次运行时,它产生路由器提示数据包,在路由器上您可看到如下日志表项。

《IPv6安全--扩展首部》

在Scapy6测试再次运行之后,ACL计数也增加1,如例2-7所示。

例2-7 路由器提示数据包匹配的访问表计数器

《IPv6安全--扩展首部》

现在您有了可选择地允许或拒绝逐跳首部或目的地选项首部的技术。您可在您的网络设备内部使用该技术,可帮助您防护这些类型的攻击。

2.2.4 路由首部

IETF标准(RFC 2460)中写道:所有节点(路由器和主机)必须能够处理接收和转发包含一个路由首部的一个IPv6数据包。当前有两种类型的路由首部:类型0和类型2。IPv6类型0路由首部(RH0)类似于IPv4中源路由的概念。IPv6类型2路由首部(RH2)用于移动IPv6,将在第9章中讨论。

在流量到达目的地之前,路由首部可用于反射流量,将其穿过一台中间主机。对于最终目的地来说,这可使数据包看起来像是从中间主机发出的,也可用来旁路不检查路由扩展首部是否存在的防火墙。路由首部可用来作为发起中间人攻击的一种方式,或反弹/中继数据包到/出一个潜在的受害者。

对于IPv6 RH0路由首部的使用是存在安全问题的,原因是在数据包中的目的地地址可以被处理路由首部的每个三层节点加以替换。对于需要确定数据包的实际目的地并将之与防火墙的策略进行比较的防火墙而言,这是困难的。

1 RH0攻击

在本节,您可看到攻击者是如何精心制造一个RH0数据包的。在到IPv6数据包最终目的地址的沿途路径上的一个中间节点处,可使用RH0数据包反弹流量。图2-4所示为,当一条RH0数据包得以产生并发送到一个网络上时,一组节点和网络设备是如何交互的,以及它可能会有什么结果。这个网络可有几台计算机、数台路由器以及一个防火墙。在这个网络中,有一台Fedora Linux计算机、一台FreeBSD 6.2计算机和一台Windows XP Pro SP2计算机。这个例子说明,攻击者如何在Linux计算机上产生一个RH0数据包,并将数据包弹射离开FreeBSD计算机到Windows XP计算机的。当Windows XP计算机接收到该数据包时,将应答发送到Linux主机。Cisco 2811路由器和Cisco ASA防火墙都不能增强任何安全性;它们只是简单地转发数据包而已。在前面的例子中,数据包流经Cisco 2811路由器。在这个例子中的路由器使用Cisco IOS版本12.4(15)T4高级企业特征功能集。

《IPv6安全--扩展首部》

图2-4中的步骤给出在这种类型的攻击中,不同数据包是何时发出的。

步骤1 攻击者向满足如下条件的主机发送一个RH0数据包:正在处理路由首部数据包,并与目的节点有一种信任关系。

步骤2 脆弱的主机处理RH0数据包,并依据路由首部的内容转发该数据包。

步骤3 如果攻击者将其真实IPv6地址作为攻击的源地址的话,则该数据包的目标节点将产生一条发往攻击者的响应。

例2-8给出Scapy6配置,它产生包含ICMPv6回声请求的一个RH0数据包。该数据包源于Linux计算机(US),由FreeBSD计算机(MIDWAY,中间节点)弹射,最终目的地为Windows XP计算机(TARGET,目标)。

例2-8 Scapy6路由首部测试

《IPv6安全--扩展首部》

这个RH0数据包通过网络传输,在Linux计算机处接收到返回数据包,可以使用Scapy6观察得到。采用协议分析器,您可在目标计算机上观察到捕获的RH0数据包。因为具有路由首部的IPv6数据包可由接收节点的相同接口进行转发,所以FreeBSD计算机将该数据包发回到LAN中,发往Windows XP计算机。图2-5给出在目标Windows XP计算机上捕获的RH0数据包。

《IPv6安全--扩展首部》

这种类型的攻击也可用于将DoS攻击匿名地反射出一个未知的中间系统。这种类型的攻击也可用于在IPv6Internet上弹射流量,并当数据包在IPv6Internet上两个高速连接的节点之间重复地弹射时,导致放大攻击。如果攻击者以不同数量的环路精心制造数据包,使所有数据包在相同时间从延迟环路发送出来,到达受害者,那么从延迟环路来的最终流量就可被定向发送到受害者(即DoS攻击的目标)。

考虑到RH0具有的安全问题以及在一个运行网络中可以避免使用它,所以2007年IETF决定放弃使用RH0(RFC 5095)。

2 防止RH0攻击

当流量通过Cisco ASA防火墙时,攻击就不能发挥作用。这是因为Cisco ASA 8.0防火墙默认情况下阻塞RH0数据包。要防止这种数据包通过Cisco ASA防火墙,是不需要进行配置的。

在一个IPv4网络中,典型情况下,路由器和防火墙是禁止转发源路由数据包的。而且,计算机操作系统在其IP栈内部禁止源路由。可在IPv4路由器上采用如下命令禁止这项源路由功能。

《IPv6安全--扩展首部》

直到Cisco IOS版本12.4(包括该版本),才可以使用no ipv6 source-route命令禁止IPv6节点将路由器用作源路由。不使用这条命令的情况下,路由器默认地处理源路由的IPv6数据包。这条命令防止路由器转发满足如下条件的RH0数据包:该数据包在路由选路首部数据包内部将路由器的接口IP地址包括在节点链(string)中。下面是这条命令的IPv6版本,它可阻止所有类型0和类型2路由选路首部数据包由路由器加以处理。

《IPv6安全--扩展首部》

这条命令是首次在Cisco IOS版本12.2(15)T和12.0(32)S中引入的,所以如果您正在使用一个较陈旧的IOS版本,这条命令也许就是不可用的,这时您也许希望升级IOS。随着时间的消逝,这种类型的命令将经常使用,以致Cisco公司将它们集成到较新的IOS版本的默认设置中。这条命令可能成为未来的默认设置——为了增强RFC 5095,可能在较早的版本12.5中就成为默认设置。

单靠这条单一命令是不能阻止Scapy6 RH0数据包的。您仍然需要配置一条ACL,从而防止RH0数据包通过路由器,即使路由器的IP地址在RH0首部内部没有使用也是如此。为了完全阻止RH0,您需要创建一条ACL,使路由器的所有接口都在其中(物理的、全局的、环回的等等接口),并拒绝目的地为那些地址的路由选路首部数据包。因为源路由只有依据数据包的目的地才能实施,所以您需要在路由器的各接口上配置一个访问控制表,从而完全地防护网络。因此,您需要在所有物理接口的入口方向上应用这条ACL。例2-9给出将这种机制部署在具有两个接口的Cisco 2811路由器上的例子。

例2-9 阻止所有路由选路首部攻击的访问控制表

《IPv6安全--扩展首部》

关键字routing可阻止类型2和类型0路由选路首部攻击。如果您正在使用移动IPv6,您也许希望允许RH 2,但拒绝RH 0。如果路由器上的IOS比12.4(2)T新,则routing-type ACL关键字就可用于阻止RH0攻击,如例2-10所示。

例2-10 阻止RH0攻击的访问控制表

《IPv6安全--扩展首部》

在例2-10中,产生一条ACL,之后将之应用到Cisco 2811路由器的两个接口上。将这组命令输入到Cisco 2811路由器的运行配置之中,可帮助防止RH0数据包到达FreeBSD计算机。如果当RH0数据包被阻止时想记录日志的话,那么可将log关键字添加到ACL表项。但是,针对ACL记录日志,可能存在严重的性能隐患。因此,针对ACL表项使用日志功能要非常小心。

在产生这个访问控制表并应用到接口之后,您可使用show ipv6 access-list命令观察访问表的状态和每条规则所具有的匹配数量。

现在再次运行传输RH0数据包的Scapy6脚本。您可在例2-11中观察到Scapy6脚本的结果。

例2-11 Scapy6路由选路首部测试失败

《IPv6安全--扩展首部》

这条ACL阻止RH0 Scapy6攻击,虽然这次返回的错误码和以前的一样,但ICMPv6错误消息的源是Cisco 2811路由器(2001:db8:10::2)的最近接口,而不是远端的目标主机。现在您可在路由器上看到一条日志消息,原因是路由器遇到一个被ACL禁止的RH0数据包。

《IPv6安全--扩展首部》

在例2-12中,在访问控制表项上也将观察到IPv6 RH0数据包的一个匹配。

例2-12 观察RH0访问控制表数据包匹配——在测试之后显示的情况

《IPv6安全--扩展首部》

3 其他路由器首部攻击应对技术

应对路由选路首部攻击的其他方式,还要求通信的中间节点详细检查各数据包。路由选路首部攻击通过的路由器或防火墙应该深入查看IPv6数据包,分析所有的首部和选项,并在转发数据包之前,确定数据包是否存在任何问题。这些节点可查找满足如下条件的数据包:在路由选路首部中具有重复的航路点地址。这可能是一条RH0数据包已经在多个节点间被设定为ping-pong(兵乓)节点的指示信息,会导致一种资源消耗攻击。即使数据包满足规范,一个合法的IPv6数据包包含一次以上的相同航路点地址也是没有理由的。

即使比较新的操作系统已经在它们的IPv6栈内部禁止了RH0功能,但一些系统仍然容易受到RH0攻击。多数较陈旧的操作系统会对RH0数据包做出响应,并继续转发数据包。许多较新的操作系统已经打上补丁,这些主机是足够智能的,知道什么类型的数据包能够做什么。FreeBSD系统容易受到RH0攻击,多数路由器可处理RH0数据包。Cisco路由器可选择性地禁止该项功能,Cisco防火墙可简单地丢弃数据包。例如Windows XP SP2和Vista的微软操作系统不转发RH0数据包。既然RFC 5095已由IETF同意作为一项标准实践,所以任何新的实现将不包括RH0。

采用RH0的数据包,随着数据包在网络中传输,数据包中的目的IPv6地址在每一跳都发生变化。因此,依据地址过滤这些数据包是有挑战的。但是,如果IPv6Internet上的每个组织机构都从进出其站点的数据包中过滤RH0数据包,这个问题将是容易解决的。进出过滤也将防止具有无效源/目的地址的数据包进出一个组织机构的站点。

2.2.5 分段首部

分段是将一个IP数据包切分成较小数据包的过程,从而可使数据包在不能传输大型数据包的数据网络上得以传输。分段发生在接口MTU具有不同尺寸的网络中。如果一台路由器在一个接口上接收到一个大型IPv4数据包,而外出接口的MTU尺寸太小,则在传输之前,需要将该数据包分成较小的数据包。每个数据包分段分配一个唯一的标识符(分段ID),将之与所有其他分段加以区分。为每个数据包分段也赋予以字节数表示的一个偏移数值,表示该分段到原始数据包最初可分段部分的距离。接收主机重新组装各分段,方法是将所有分段按顺序放回原位,之后将得到的完整IP数据包上送到协议栈。这是网络上的一个正常过程,但它也可能导致安全问题。

1 数据包分段问题的综述

分段的一个主要问题是高层信息也许并没有包含在第一个分段内部。有一个分段包含TCP或UDP首部,这是防火墙做出数据包是否可接受决策所需要的。因此,在做出一个准确的判断之前,防火墙必须查看多个数据包。执行组装并执行数据包的详细分析,将耗费防火墙的计算资源。但是,期望防火墙能够就具有不充分的协议信息数据包分段做出一个判定。

攻击者可使用IPv4或IPv6分段来隐藏他们的攻击或攻击一个节点。通过将攻击放到许多小的分段之中,攻击者就可躲过过滤或检测系统。要确定攻击的真实意图需要重新组装所有的数据包。攻击者可将数据包分成许多小型分段,从而使每个分段看来都是合法的,且防火墙不能察觉整个攻击。

针对一台终端主机用以重新组装各分段的方法中的弱点,攻击者也可以利用分段进行攻击,这种攻击的例子是重叠分段(其中在偏移中存在重叠)和乱序分段(其中分段ID不能正确地匹配数据)。另一种类型的分段攻击是攻击者发送分段的一个不完全集合,强迫接收节点等待集合中的最后分段。默认分段超时是60秒,并会消耗中间节点上的资源,这些系统在最终接收节点上重新组装和扫描数据包。分段攻击也可能采用嵌套的分段或分段内部的分段,其中IPv6数据包有多个分段首部。其他攻击是在一个隧道内使用分段,使外部IPv6首部掩盖如下事实:分段正在隧道内部使用。典型情况下,黑客使用工具(例如Whisker、Fragrouter、Teardrop和Bonk)实施分段攻击。

在IPv6中,中间路由器从来不会执行分段,而是由端节点自己进行分段。在IPv6中,仅允许端主机产生和重组分段(RFC 2460)。路由器和中间节点不应产生分段,但它们需要允许端节点采用分段的数据包进行通信,并允许各节点发现最优的数据包尺寸。由IPv4到IPv6的这个变化出现的原因是,协议开发人员考虑到中间路由器分段导致的性能影响。因为路由器也是节点,所以它们能够合法地分段由它们发起的数据包,并组装目的地为它们的分段数据包。

图2-6说明大型数据包(顶层)如何根据需要分段为两个较小型的数据包(底层)。原始数据包是由包含原始IPv6首部的不可分段部分组成的。数据包的可分段部分包含其他扩展首部和上层净荷。对可分段部分进行分段,生成多个数据包,每个数据包都有不可分段部分和一个分段首部。

《IPv6安全--扩展首部》

因为路由器不再执行分段和重组,试图穿越一台路由器的大型数据包就会被丢弃。作为响应,路由器向发送大型数据包的源节点发送一个ICMPv6数据包太大(类型2)的消息。进而,包含多个分段首部集(嵌套的分段)的数据包是不应该出现的。在一个IPv6数据包内应该仅有一个由源节点产生的分段首部。

端节点首先必须发现可用于它们之间的数据包尺寸,或就大于某个尺寸而执行数据包分段达成一致。这个过程称为路径MTU发现(PMTUD),这是IPv6采用ICMPv6协议提供的一项特征。在RFC 1191中定义的PMTUD是首次针对IPv4发明的,其机制为主机可确定它们之间传输用的最大数据包尺寸,从而可避免中间路由器进行分段。

IPv6中的PMTUD是在RFC 1981中描述的,定义了从一台中间路由器发回源(节点)的ICMPv6类型2(数据包太大)消息的用法,因为路由器的MTU尺寸较小。路由器以建议的数据包尺寸向源(节点)发回错误消息,从而使源(节点)可使用PMTUD机制降低源节点正在发送的数据包尺寸。

2 分段攻击

因为IPv6针对每种IPv6链路定义具有大于或等于1280字节的MTU,所以应该怀疑非常小型的分段(会是一个攻击)。使用大量极小型分段的工具等同于破坏行为,是应该加以防止的。在IPv6中,没有理由使一个分段小于1280字节,除非该数据包是最后分段,且更多分段的“m”比特设置为“0”。微小分段可被攻击者用来将他们的攻击内容压入后续数据包,防火墙也许不能检测到这点。这些数据包也会被允许通过,原因是防火墙仅查看不可分段部分中的信息。为了做到更安全,防火墙应该丢弃小于某个尺寸的所有分段。例外的情况是最后一个分段,该分段较小是合法的。

攻击者可利用IPv6网络中的分段绕过安全措施。分段可以混淆数据,使防火墙放行信息,即使在分段组装之后防火墙没有解析数据包的真实内容之前也是如此。这也是一项入侵检测系统/入侵防御系统(IDS/IPS)的规避技术。典型情况下,路由器和无状态数据包过滤防火墙仅查看包含首部信息的第一个分段。

例2-13使用Scapy6生成一个精心制造的数据包分段,并将其发往目的地。IPv6首部将其下一首部设定为44,表示一个分段首部跟在这个IPv6首部后面。这个数据包存在一个参数问题,原因是它小于1280字节,且不是最后分段。这个数据包的响应是一条ICMPv6错误消息,表示存在由一个错误首部导致的参数问题。

例2-13 Scapy6精心制造的分段数据包测试

《IPv6安全--扩展首部》

3 防御分段攻击

当检查一个IPv6数据包时,在检查分段首部(FH)功能确定分段标志和偏移之前,必须通过检查下一首部(NH)扩展首部。在到达TCP或UDP首部之前,会存在一个额外的下一首部(NH),从而确定在第一分段的数据包内部是否包含足够的高层协议(ULP)首部信息。这使得在第一分段的数据包上进行策略匹配是非确定的,这不会产生数据包的ACL或防火墙策略匹配或数据包许可通过。

Cisco IPv6 ACL有一个fragments关键字,这意味着ACL匹配非初始的IPv6分段,就像fragments关键字在IPv4中执行的情况一样。典型情况下,初始分段是包含三层和四层信息协助策略匹配的数据包。如果由于它是另一条数据包而不能确定协议,则fragments关键字也匹配第一个数据包分段。Cisco IOS也支持fragments value ACL参数,它会匹配后跟标准IPv6首部的非初始分段扩展首部的存在状态。针对具有一个非零分段偏移的各分段而言,该数值的范围是从0~1048575。

使用fragments关键字的Cisco路由器ACL允许非初始分段通过,甚至在它们不包含四层信息时也如此。因此,在ACE动作(允许/拒绝)中采用fragments关键字的一个三层/四层ACE被认为是“保守的”。这意味着由于担心拒绝一条合法的被分段数据包,而过度允许发生ACL错误,原因是没有充足的信息来确定是应该允许数据包还是拒绝数据包。这是可接受的,原因是如果目的主机不能重新组装所有的分段,则正在接收分段的节点就会丢弃该数据包。仅当存在所有分段并是有意义的情况下,目的节点才能重新组装数据包,并允许它上传到IPv6协议栈。

为了说明这一点,您可在Cisco 2811上创建一条ACL,这会阻塞来自攻击者计算机的且目的地为VLAN 22的各分段。fragments关键字用在这样的ACE上,阻塞来自任意网络发往2001:db8:22::/64网络中目标节点的网络流量。例2-14说明这条ACL,并表明它如何应用到最接近攻击者的接口上。

例2-14 阻塞分段的ACL

《IPv6安全--扩展首部》

在使用Scapy6再次发出被分段数据包之后,该数据包被阻塞。例2-15显示Scapy6产生的输出。您可看出,这次被返回的数据包在管理上是被禁止的。

例2-15 Scapy6精心制造的分段数据包重发

《IPv6安全--扩展首部》

如您在例2-16中所看到的,对于包含分段关键字的ACE,ACL计数器增加了。因为数据包是一个非法分段,路由器就会阻塞这个数据包。

例2-16 分段ACL匹配计数器

《IPv6安全--扩展首部》

攻击者也可使用分段发起针对如下端系统的攻击,这些端系统不能正确地处理分段。一些主机也许不能正确地处理分段,这些分段的数据包将导致主机的拒绝服务。采用分段的一个典型DoS是针对内核内存的;对于每条新的分段数据包,OS内核分配一些内存结构来处理重组过程。如果攻击者发送大量分段(伪装成不同数据包的组成部分),则内核可能耗尽它的内存,就会拒绝其他合法的分段数据包。与OS相关,重叠分段可能潜在地使一台主机崩溃,所以应该拒绝重叠分段。包含65536字节(ping-of-death)的分段可能导致不能正确检查分段的接收节点的拒绝服务。65536字节的含义是它比单一IP数据包净荷的最大65535字节多一个字节。

假使网络设备不产生分段,仅有端节点产生分段。希望路由器和防火墙帮助防御分段攻击。即使在IPv6 RFC中没有记录,您也许希望一台网络设备重组分段,之后检查最后数据包的安全状态。如果防火墙能够收集所有的分段,然后使用它的统一威胁管理(UTM)特征扫描数据包,检测四层到七层的问题,那也将是不错的选择。但是,为了使路由器和防火墙快速地执行这项任务,您需要使用硬件资源。

4 虚拟分段重组

Cisco的IPv6防火墙和IOS防火墙特征功能集具有一个称为虚拟分段重组的特征功能(VFR)。当路由器看到一条带有类型44的分段首部的数据包时,它就切换到分段检查状态。这项特征功能重组分段数据包,检查乱序分段,并将各分段恢复到正确的序列。之后VFR检验来自单一源的各分段,并将最终数据包沿协议栈向上传递。如果分段存在问题,则阻塞该数据包。

在路由器上激活VFR功能之前,可能发现没有端口具备这项特征功能。您可在接口配置块之下配置这条命令,并查看设置VFR参数的不同选项。接下来,在例2-17中您将看到在Cisco 2811的两个接口上如何配置基本的VFR,之后可看到它已被激活。

例2-17 虚拟分段重组

《IPv6安全--扩展首部》

当VFR特征功能在一个接口上被激活时,该接口就可工作并检查分段数据包。但是,VFR功能仅在输入ACL已检查进入数据包并允许数据包通过时,才查看数据包。因此,ACL具有在VFR之前检查分段的优先机会。例2-18显示您可用于查看VFR计数器的命令,并看到有多少分段已经通过接口。

例2-18 观察VFR计数器

《IPv6安全--扩展首部》

针对这项测试,您可重新运行Scapy6分段数据包生成器,如例2-19所示。您可看到关于参数问题的响应是来自于路由器本身,而不是目的主机。在目的主机上使用嗅探器(sniffer),可以确认它根本就没有接收到分段数据包,而是由路由器的VFR特征功能处理被精心制造出的数据包。

例2-19 Scapy6分段测试

《IPv6安全--扩展首部》

在配置具备VFR功能的Cisco 2811路由器上,您可看到产生如下错误日志消息。

《IPv6安全--扩展首部》

如果您使用debug ipv6 virtual-reassembly调试命令,可以看到有关被丢弃数据包的更多详细信息。例2-20显示发送Scapy6分段时,来自debug命令的输出。debug输出显示分段长度无效,被丢弃数据包不是一条现有连接的组成部分。

《IPv6安全--扩展首部》

可以看到VFR是在可能发生分段问题的网络中的关键点激活的一项重要的IPv6安全特征功能。它对连接状态更敏感,因此在寻找分段错误和防止这种类型的分段攻击方面,比ACL工作得更好。

2.2.6 上层首部

对于IPv4和IPv6,下面的链路层和上面的应用层没有变化(例外情况是ICMP)。许多相同的应用存在于IPv6和IPv4之上。因此,在一个IPv4网络中的应用上可实施的攻击,仍然会在IPv6网络中的应用上起作用。例如,缓冲溢出、SQL注入和交叉站点脚本,都仍然是针对IPv6 服务器 的有效攻击。Spam(垃圾电子邮件)已经存在于IPv6网络之上。不幸的是,电子邮件仍然是针对IPv6的一种有效的攻击载体。基于域名系统(DNS)的黑洞列表和根块列表仍然是IPv4和IPv6网络上垃圾电子邮件攻击波(tide)来源的工具。

存在如下可能,即在双栈部署中,一名攻击者利用一个IP版本攻击另一IP版本。当系统同时运行两种协议(双栈)时,该系统就容易遭遇到两种协议内部的弱点。因此,如果IPv6是较弱的链路,则应用攻击可能使用IPv6地址作为目标。当应用被攻击时,正在使用什么协议栈是无关紧要的。也存在如下问题,相同服务默认地绑定到两种协议栈。例如,一台Web服务器可能同时在IPv4地址和IPv6地址上的TCP端口80上进行侦听,因而需要管理配置。如果一个防火墙只防护IPv4地址,针对IPv6地址却没有过滤,则Web服务器仍然是脆弱的。

最初情况下,仅支持IPv6的应用数量较小。但是,许多应用开发商的当前目标是使他们仅支持IPv4的应用对于IPv6和双栈主机也能够正确地运行。IPSsec不能防止IPv6应用攻击,原因是当流量被解密并沿服务器的协议栈向上发送之后,该数据包仍然能够在应用层造成危害。

采用IPv6,追捕攻击者可以是比较容易的,原因是IPv6本质上的地址层次结构。但是,如果攻击者使用私有地址或伪造的MAC地址,则地址的节点部分对于追捕攻击者也是无用的。进/出过滤和路径过滤检查可帮助减少欺骗的IPv6攻击。

因为IPv6不针对应用层的安全性,必须继续使用各种防御机制,帮助应对较高层协议的攻击。结果就是,不管是否运行IPv4或IPv6,仍然需要保障应用和服务器本身的安全。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注