(ZT)IPv6分片重组在入侵检测系统中的实现

hunle 2013-01-30 04:17:59
IPv6分片重组在入侵检测系统中的实现
责任编辑:王炯作者:协议分析网 2007-06-19
文本Tag: 网络接入 宽带接入
Web技术推动因特网以惊人的速度发展。10年前,关注未来因特网扩展性能的人们就开始担心IPv4网络本身的局限性将难以支撑因特网的持续发展。为此IETF推出了新一代因特网协议——IPv6。与IPv4相比,IPv6提供了许多全新的特性,如地址空间扩展、安全性设置以及自动配置等。

  IPv6的发展得到众多设备制造商的支持,甚至提高到国家层面来开展基于IPv6的研究和部署。美国国防部的IPv6部署进度表显示:2005-2007年,IPv6和IPv4协议共同运行;2008年实现美国本土全面的IPv6计划。欧洲和日、韩在IPv6相关领域也展开了大量研究,各种实验网和试验性商用IPv6网纷纷开通。200陴年3月,我国第一个下一代因特网主干网——CERNET2正式开通并提供服务,成为目前世界上规模最大的IPv6国家主干网。

  随着IPv6的逐渐普及,针对下一代因特网的安全防范问题也被提到议事日程上来。本项目正是基于这一考虑而开展的。受国家计算机网络与信息安全中心委托,本项目主要进行基于IPv6骨干网的入侵检测技术研究,为IPv6时代的国家计算机网络信息安全研究做技术储备。

  本文将就IP分片攻击在IPv6中的表现形式、IPv6的分片重组机制以及如何防范IPv6的分片攻击展开详细的讨论。

一、IP分片攻击在IPv6中的表现形式

  总的来说,在IPv4下的所有分片攻击都能在IPv6中重现,只是在实现的具体机制上有所不同。

  当需要传输的IP数据包超过链路所能支持的最大传输单元(MTU)时,一个原始IP数据包将被拆分成多个分片包;当属于同一个原始IP数据包的分片包到达目的节点之后,由目的节点完成分片包的重组。与IPv4不同的是IPv6的分片操作只能在源节点进行,而前者在沿途的中间节点(如中间路由器)上也可以进行。IP分片包可以独立地通过不同的路径转发,到达目的节点的顺序也不一定能保持从源节点出发时的顺序。由于目标系统能够完成IP分片数据包的重组,因此网络入侵检测系统也必须具备对IP分片数据包重组的能力,否则将不能正确检测通过IP分片方式进入受保护网络的攻击数据。

  IP分片攻击在IPv6下的表现形式与在IPv4下相似。首先是攻击者故意打乱IP分片包到达目的节点的顺序。如果入侵检测系统以为IP分片包总是严格按照分片顺序到达,那么在重组的过程中就不能正确识别各个分片包的先后顺序,会造成对攻击数据漏报。

  其次是分片包缓冲处理机制问题。在属于同一个原始IP数据包的所有分片包到齐之前,入侵检测系统必须将所有先期到达的分片包放到一个缓冲区中。分片攻击机可能通过故意不发送属于同一个原始IP数据包的一个分片包或者故意发送多个分片包,造成入侵检测系统的IP分片重组模块因为消耗掉所有内存而遗漏攻击数据甚至崩溃。

  第三种情况是IP分片包重叠问题,这也是最难处理的一个问题。无论是在IPv4还是IPv6网络中,分片包都有一个类似于分片偏移量(fragment offset)的域来标志每个分片包在原始数据包中的偏移量,故意构造错误的分片包偏移量就能造成分片包的重叠。解决这个问题的第一种策略是完整保留后期到达的分片包,让后期到达的分片包覆盖先期到达分片包的重叠区域;第二种策略是完整保留先期到达的分片包,而仅仅部分采用后到达的分片包数据以消除重叠,不同系统的主机和不同的入侵检测系统可能会采取不同的取舍策略。分片包重叠的直接后果就是使入侵检测系统陷入取前还是取后的两难境地。因为无论采取何种策略,都有可能造成入侵检测系统因为与被保护网络的主机采取不同的丢弃策略而造成对攻击数据漏报。

二、IPv6分片及其重组机制

  与IPv4不同,IPv6的包分片操作只能在源节点进行,这简化了中间节点对包的处理,有利于提高中间节点的包转发速率;IPv6的分片重组操作则与IPv4一样,也是在目的节点进行。通过使用路径最大传输单元(MTU)发现机制,源节点可以确定其到目的节点之间的整个路径中能够传送的最大包长度,从而可以避免在中间节点进行分片处理。IPv6规范中要求最大传输单元的值至少为1280 byte,并建议将链路配置为至少可以传送包长为1500byte的包。

  IPv6规范建议在发送任意长度的包之前,必须检查由源节点到目的节点的路径,计算出可以无需中间节点分片而发送的最大包长度,也就是获得路径最大传输单元。当需要传输的数据包长度超过路径最大传输单元时,源节点就实施分片操作,而目的节点将两个或者多个分片包重组成分片包前的数据包。

  从数据包分片的角度看,一个完整的IPv6数据包可以分成不可分片部分(unfragmentable part)和可分片部分(fragmentable part)。

  不可分片部分包括原始数据包的IPv6基本头和每个分片包中必须携带的三种可能出现的IPv6扩展头。这三种可能出现的IPv6扩展头分别是:逐跳扩展头(hop-by-hop header)、目的地选项扩展头(destination options header)和路由扩展头(routing header)。这三种扩展头如果在原始数据包中出现,每个分片头中都必须携带该扩展头。

  可分片部分包括可能出现的其他IPv6扩展头和数据载荷部分。这里所谓的其他扩展头是指除了必须包含在不可分片部分的三种扩展头之外的所有其他类型的扩展头,例如认证扩展头(authentication header)、封装安全载荷扩展头(encapsulating security payload header)等。

  不可分片部分必须出现在每个分片包中,而可分片部分则被切成两个或者两个以上的部分出现在不同的分片包中,这些分片包拥有相同的分片标志,但是分片偏移量各不相同。因此对于每一个分片包,必须包含三个部分,依次是原始数据包的不可分片部分、分片扩展头(fragment header)、原始数据包的可分片部分的某一个分片。

1.IPv6分片扩展头

根据RFC24603,IPv6分片扩展头的格式如图1所示。




  下面介绍分片扩展头中各部分的功能。

·下一个头:8bit,表示原始数据包可分段部分的第一个扩展头(或者第四层协议,如TCP、UDP等)的类型。

·保留1,8bit,发送时初始化值为0,接收时忽略。

·分片偏移量:13bit的无符号整数。偏移量以8byte为单位,表示该扩展头后所跟的数据相对于未分片原始数据包可分片部分的偏移量。

·保留2:2bit,发送时初始化值为0,接收时忽略。

·M:1bit,M=1表示还有后续分片包,M=0表示这是最后一个分片包。

·分片标志:32bit,是源节点和目的节点之间区分不同原始数据包的惟一标志。

2.举例说明IPv6分片重组机制

  下面用一个具体的例子来解释IPv6的分片重组机制。如图2所示,假设某一个IPv6数据包的原始包长为320byte,其中包括40byte的IPv6基本头、4个30byte的IPv6扩展头(2个属于不可分片部分,2个属于可分片部分)和160byte的数据载荷。通常情况下传输该长度的数据包是不需要进行分片操作的,这里使数字简单化以便于说明其分片机制。假设通过路径最大传输单元发现机制获得的值为230byte,由于不可分片部分必须包含在每一个分片包中,这样一共需要三个分片包来传送160byte的数据载荷。



  各个分片包的具体组成如下:

·第一个分片包:开始是100byte的不可分片部分,接着是30byte的分片扩展头,最后是100byte的可分片部分(包括2个各30byte的可分片扩展头和40byte的数据载荷)。分片扩展头中分片偏移量为0,M=1,还剩下120byte的数据载荷。

·第二个分片包:同样包括100byte的不可分片部分,接着是30byte的分片扩展头,然后是100byte的数据载荷(从第40-139byte)。分片扩展头中分片偏移量为40byte,M=1,还剩下20byte的数据载荷。

·第三个分片包:包括100byte的不可分片部分,接着是30byte的分片扩展头和最后20byte的数据载荷。分片扩展头中分片偏移量为140byte,M=0。

  三个分片扩展头中的分片标志字段为同一个32bit无符号整数,标志着这三个分片包属于同一个原始数据包。

三、IPv6分片重组在SNORT中的实现

  本节将结合IP分片攻击的表现方式和IPv6的分片重组机制来讨论IPv6分片重组在SNORT中的实现细节。

1.选用SNORT来实现IPv6入侵检测的原因

之所以选用SNORT软件来实现IPv6入侵检测是因为它具有如下特点:

  ·SNORT是一个遵循GPL(General Public Liense)的并源软件,该项目自创立起发展十分迅速,现在已升级到2.3.0版。

  ·SNORT是一个轻量级但功能强大的网络入侵检测系统。它具有实时流量分析和IP网络数据包日志纪录能力,能够进行规则匹配报警,具有网络协议分析功能,还能够正确识别因特网上的大多数攻击形式和攻击事例。

  ·SNORT软件组织采用插件形式,具有良好的扩展性和可移植性,非常适合通过在标准版本基础上加载新的插件来检测新的攻击。这也是我们选择它的最重要原因。

2.SNORT插件机制

  启动SNORT的初始化过程中有一个非常重要的环节,就是主程序SnortMain(int argc,char*argv[])通过调用InitPreprocessors()函数来完成所有预处理插件的初始化。InitPreprocessors()会调用SetupFrag2Ip6()来完成IPv6分片重组插件的注册,SetupFrag2Ip6()会调用RegisterPreprocessor(“frag2ip6”,Frag2Ip6Init)函数将IPv6分片重组插件初始化函数Frag2Ip6Init注册到预处理插件列表中,实际上是将关键字frag2ip6注册到一个预处理插件关键字列表中。当对系统配置文件snort.conf进行解析时,如果看到Frag2ip6这个关键字,就表示要启用IPv6分片重组预处理插件,也就会调用Frag2Ip6Init函数来完成分片重组中一些全局变量的设置,例如该插件所能分配到的最大内存空间、每个分片包在内存中所能驻留的最长时间等。Frag2Ip6Init函数的最后一步就是调用AddFuncToPreprocList(Frag2Defrag)函数将具体进行分片重组动作的Frag2Defrag函数注册到预处理函数列表中,以后每收到一个包都会调用Frag2Defrag函数来判断该包是否是一个有效的IPv6分片包,如果是就进行IPv6分片重组工作,如果不是,处理流程会把控制权直接交给下一个预处理插件。

3.分片包的处理策略

  对于每一个新接收的IPv6分片包,Frag2Defrag(Packet*p)函数首先从该包中解析出如下数据:

·分片偏移量:p->frag_offset=ntohs(p—>ip6fh->ip6frag_off)&~Ox07;

·是否还有后续分片的标志量:p->mf=ntohs(p->ip6fh->ip6frag_off)&IP6_MF;

·分片净载荷的起始指针:p->data=(u_int8_t*)(p->ip6fh+1);

·分片净载荷的长度:p->dsize=(u_short)(ntohs(p->ip6h->s_ip6_plen)-((u_int8_t*)(p->ip6fh+1)-(u_int8_t*)(p->ip6h+1)))。

  SNORT利用二叉树的数据结构来存储和搜索每一个分片包。SNORT根据源地址、目的地址、分片标志和下一个头的类型这四个元素来惟一地标志属于同一个原始IP数据包的所有IP分片包,通过在二叉树中以这四个元素为依据来搜索和存储每一个分片包。在将新收到的分片包插入到二叉树之前,系统会实施一系列的检查,主要是检查是否发
生分片重复和存在分片空洞。具体如下:

  如果(p->mf && p->frag_offset==0)为真就表示收到了第一个分片包;如果(!p->mf && p->frag_offset>0)为真就表示收到了最后一个分片包,无论是收到第一个包还是收到最后一个包,相应的分片标志纪录位都会被置位。比较新收到的分片包与二叉树中已经存储的分片包的分片偏移量,如果两者相等说明发生了分片重复,我们保留早到的分片包,将后到的包丢弃。

  将每一个分片包插入二叉树的对应节点之后,就应该检查是否所有的分片包都已经到达。分片到齐的首要条件是第一个分片包和最后一个分片包已经到达,接着就要检查该二叉树上属于同一个原始IP数据包的所有IP分片包了,实际上是检查每一个分片包的分片偏移量是否正好等于上一个分片包的分片偏移量加上一个分片包的分片大小。如果检查完所有分片包后发现没有空洞存在,那就表示所有的分片包都已经到齐,可以进行重组操作了。

4.分片包的重组策略

  将所有到齐之后的分片包重组起来的操作由RebuildFrag(FragTracker*ft,Packet*p)函数来完成。对此需要重点考虑下述三个问题。

  首先是不可分片部分的确定与保留问题。必须且只保留第一个分片包的不可分片部分,而所有后续分片包的不可分片部分必须排除在外,这可以通过移动拷贝源地址指针来完成。在具体确定第一个分片包的不可分片部分、分片扩展头、可分片部分时,不能简单地认为IPv6基本头之后就是分片扩展头,因为在IPv6基本头之后、分片扩展头之前还有可能包含有逐跳扩展头、目的地选项扩展头和路由扩展头中的一种或者多种,因此确定不可分片部分的结尾(也就是分片扩展头的开始位置)必须依靠逐层检查下一个头是否是分片扩展头。

  其次是重组完成之后的IP数据包中不能包含有分片扩展头。所以在拷贝数据的时候必须将分片扩展头也排除在外。

  最后是必须将不可分片部分的最后一个头的下一个头指示域设置为可分片部分的第一个头的类型。该类型原本在分片扩展头的下一个头指示域中,所以在排除分片扩展头之前应该将该域保存下来。

  只有这样,重组完成后得到的IP数据包才和未分片的原始IP数据包完全一致。

四、测 试

  具体的测试工作由国家计算机网络与信息安全中心委托第三方进行,其中重点测试了IPv6分片重组功能。入侵检测服务器在启用了IPv6分片重组插件之后,分片重组测试项目包括以下几个方面:

·IPv6超大包ping命令;

·将敏感信息放在不同的分片包中,通过编写专用分片程序来发送该类型的IPv6分片包;

·编写专用分片程序来发送分片重叠的IPv6分片包;

·编写专用分片程序来发送存在空洞的IPv6分片包。

  测试结果表明系统顺利通过以上四个测试项目,能正确完成分片包的重组并检测出隐藏在分片包中的敏感信息。

五、结 语

  测试结果表明在新一代因特网中,依然存在各种各样的入侵。系统不仅能检测到通过发送IPv6分片包实施分片攻击确实存在,而且能通过加载IPv6分片重组插件正确识别这些攻击。

  由于当前IPv6尚未普及,利用IPv6展开的入侵也并未在因特网上传开,因此后续工作将主要围绕提高系统稳定性和处理性能展开,并跟踪国内外IPv6入侵检测领域的最新动态,及时更新特征规则库和各种处理插件。
...全文
447 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

4,451

社区成员

发帖
与我相关
我的任务
社区描述
云计算 云安全相关讨论
社区管理员
  • 云安全社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧