国际互联网是由许许多多的网络连接在一起而构成的。这些相互连接在一起的网络往往拥有不同的最大传输单元(MTU)。为了使IP数据包能够在MTU不同的网络之间无差错传递,IP提供了对IP数据包进行分段和重组的功能。即为了将IP数据包发往MTU较小的网络,IP以目的网络的MTU为IP包的最大包长,将本地生成的较大的IP数据包分成若干个分段,发往目的主机。当这些IP分段数据包到达目的主机的IP时,目的主机的IP发现到来的IP数据包不是一个完整的数据包,就会将这些IP数据包先缓冲起来,一旦这些IP数据包全部到齐,IP就将这些IP数据包组合成一个完整的IP数据包,交给上层协议处理。IP头的标识域(Identification field )、协议域(Protocol field)、源地址域(Source addreee field)、目的地址域(destination address field)这四个域可用来唯一标识同属于一个完整的IP数据包的所有IP分段数据包。IP头中的标志域(Flag field)的DF位表示是否允许分段,MF位表示该IP数据包是否是一个IP分段数据包。IP头的分段偏移域(Fragment offset field)表示该分段在完整IP包中的位置。IP就是根据这六个域来对IP数据包进行分段和重新组合的。重新组合的过程是将所有标志域的MF位为1的同属于一个完整IP包的IP分段合并成一个IP包,直收到最后一个MF位为0的IP分段。重新组合而成的IP数据包长度由各个IP分段的数据长度累加而成。IP头中的数据包长度域只有16位,这就限制了IP包的长度最大为65535。如果到来的IP分段的累加长度大于65535,而IP又没有进行检查,IP会因溢出而处于崩溃或不能继续提供服务的状态。通常情况下不会出现这种情况,但是常常有攻击者利用这样的隐患发动攻击,很多网络操作系统都有这种隐患。著名的Ping攻击就是利用这一安全隐患进行攻击的。Ping是一个用来诊断网络状况的常用诊断程序,它实际上是依据互联网控制报文协议,通过向目的主机发送类型为请求响应(ECHO_REQUEST)的ICMP包,如果目的主机的ICMP模块接收到该包,会向源主机发回一个类型为响应回答(ECHO_RESPONSE)的ICMP包。如果在规定的时间内ICMP响应回答包没有返回,ping就超时显示目的地址不可到达。Ping攻击也是向被攻击主机发送请求响应包,但是请求响应包是由攻击者手工生成的一系列IP分段数据包构成,并且这一系列IP分段数据包的累加和大于65535。其目的是造成目的主机的IP对这些IP分段数据包进行重新组合,使其面对如何处理长度大于65535的IP包这一不正常情况。
解决方法:重组IP数据分段时,要加入对大于65535的IP包的判断和处理。如果发现已经收到的IP分段数据包的累计长度已经大于65535,则将已经收到的IP分段数据包全部丢弃,并且释放它们所占的资源