学术研究Acade信息安全与通信保密・2007.265邓子宽,范明钰,王光卫,朱大勇(电子科技大学计算机科学与工程学院,四川成都610054【摘要】文章通过分析Snort入侵检测系统的源代码,剖析了snort入侵检测系统的TCP流重组的原理及实现,给出了相关数据结构和算法流程,介绍了针对流重组模块的攻击及Snort对此的防御策略,最后指出现有TCP流重组技术几点不足及若干新的研究方向。【关键词】TCP重组;Snort;Hash表;Splay树;入侵检测【中图分类号】TP393【文献标识码】A【文章编号】1009-8054(200702-0065-03ResearchOnTCPreassemblyinSnortIDSDENGZikuan,FANMingYu,WANGGuangwei,ZHUdayong(SchoolofComputerScienceandEngineeringUESTC,Chengdu610054,China【Abstract】BaseonthestudyonthesourcecodeofSnort,analyzetheprincipleandimplementationofTCPassemblyinSnortIDS,presentrelateddatastructuresandarithmetic.IntroduceattacksthattowardsTCPassemblymoduleandtheprotectionmethodsSnortadopted.IndicateseveralweaknessesofTCPassemblyandsomenewresearchfieldsofit.【Keywords】TCPreassembly;Snort;Hashtable;Splaytree;IntrusiondetectionSnort入侵检测系统中TCP流重组的研究在网络安全领域,将分散的TCP包按其所隶属的会话重组成一个连续的TCP会话流再与攻击特征库进行匹配是发现和防御某些攻击的有效方法。1Snort工作流程Snort是一款开源的跨平台、轻量级的分布式入侵检测系统[1],其4种工作方式如下:嗅探器模式(sniffermode、包记录模式(packetlogger、网络入侵检测模式(NetworkIn-trusionDetectionSystemMode、线内模式(Inlinemode。入侵检测和线内模式集成了重组IPfragment、重组TCP会话及状态协议分析的功能。线内模式通过iptables替代libcap获得数据包,从而使系统变成具有过滤和放行数据包能力的IPS(IntrusionPreventionSystem[2]。图1是Snort的工作流程。2流重组Snort使用stream4模块进行TCP流的重组和状态分析[3]。Stream4由MartinRoesch于2001年公布,包含两个可配置预处理模块stream4和stream4_reassemble,发布的初衷是为解决snort针对snot攻击报警过于频繁的问题[3]。由于TCP重组的实现依赖于TCP/IP协议,在应用中受到TCP/IP协议先天安全性不足的局限。因此,MartinRoesch在这两个模块中增添了许多抗攻击的功能,并设计成可供用户通过配置选择使用。配置选项的说明请参照snort用户手册[1]。下面分析TCP流search学术研究www.cismag.com.cn66重组的过程及使用的数据结构。目前Snort通过两种方式缓存重组前的数据包:Hash表与SplayTree。2.1Hash表方式Hash表方式是snort的默认方式,其以会话的源IP、目的IP、源端口、目的端口4个参数为key计算得出一个tableindex,该table[index]指向一个双向链表,链表的每一个节点即为一个Hash节点。一个Hash节点里面包含有一个会话的信息,若需要查找一个会话的信息,只需根据该会话或者该会话中的一个TCP包的key计算tableindex得出table[index],再利用table[index]中所存地址找到双向链表,遍历该链表,查找与key匹配的节点即可找到会话信息。数据包与会话的匹配流程如图2所示,Hash表用作储存会话信息的数据结构如图3(a,Hashnode节点的内部数据结构如图3(b,session节点的内部数据结构如图3(c,stream流的内部数据结构如图3(d。使用Hash表及双链表结构的形式来存储及查找可以加快重组时数据包匹配会话的速度,在高流量的环境下,对每一个TCP包的快速处理是十分必要的。重组过程中,当下述三种情况之一出现时(对以SplayTree储存的情形同样适用,Snort将会把Hash表或二叉树中属于一次会话的所有数据包组合成一个大数据包(仍以Packet结构定义:当一个会话结束、当内存耗尽、当收集了某个数量大小的数据(该大小值为随机数,以免被攻击者识破。组合大数据包时,Snort将遍历Hash表节点中指向的双向链表的每一节点(以StreamPacketData结构定义,将节点中的payload拷贝到大数据包中data指向的缓存(在Stream4模块初始化时Snort已分配一特定大小的内存于该缓存中,并将大数据包传递给余下的预处理模块处理,当所有的预处理模块处理完毕,Snort才将该会话包交给规则检测引擎作...