0x01缘由
目前的产品开发过程中,涉及到了对应用层协议类型的检测。考虑到要构建高效的规则匹配引擎,于是再次研究了snort的规则引擎。
主要目的还是开阔下设计思路和借鉴一些方法。
0x02 规则制定
良好的规则设计是今后配置规则和扩展的基础。
Snort 采用数据结构 RuleTreeNodes(RTN) 和 OptTreeNodes(OTN) 存储规则数据, 形成二维链表结构。有关 Snort 所用到的数据结构参考源码数据包 rules. h 文件。RTNs 组成横向链表, 每个RT N节点下又由多个OTNs组成纵向链表, 进而构成1棵规则树, 这样每1个OTN节点就对应1条规则。规则逻辑图如下图所示。1个RTN对应着若干个OTN, 这就是Snort组织规则库的特点。如果在1个规则文件中定义了N条检测X攻击活动的规则, 而且它们具有相同的源/目的的IP(Src/Des IP)和端口号(Src/ Des Port), 为了加快检测速度, 这N条检测规则就共用1个链表头(chain header) , 其中记录了源/目的 IP 和端口号, 而每条规则的检测特征将保存到不同的链表选项(chain option) 结构中, 这样在进行规则检测时只检测 1 次 RTN。
摘录:Snort规则库的研究与改进_王喆.pdf
0x03 规则构建
规则树的生成,如果Snort以网络入侵检测的模式运行,在对网络数据包进行检测前,首先要对规则文件(snort.conf)进行解析,建立规则库。在组织规则库时,首先按规则类型(规则行为:Alert,Pass,Log,Activation,Dynamic)分类,针对每种规则类型按协议类型(Ip/Tcp/Icmp/Uolp)分成相应链表。所有的规则都会被分配到这些链表中。通过源码分析,这一过程用到的主要函数是ParseRulesFile(),ParseRule(),Pro-cessHeadNode()和ParseRuleOptions()。ParseRule()处理单个规则。它对规则语句进行分解,提取规则类型,如果是alert,pass,log,active或dynamic类型,则利用ProcessHeadNode()和ParseRuleOptions(),按协议的不同完成相应链表头和链表选项的添加,从而形成规则树。在按规则类型进行处理还有preprocess,output等类型,遇到这些类型的规则,则调用相应的函数对其进行预处理插件或者输出插件的解析。
摘录:Snort规则及规则处理模块分析.pdf
0x04 规则优化
在 Snort 的入侵检测模式中,基于规则的模式匹配是其检测的核心机制。它的入侵检测流程分成
两大步:第一步是规则的解析流程,包括从规则文件中读取规则和在内存中组织规则;第二步是使
用这些规则进行匹配。为了提高规则匹配的速度, Snort 采用了 Boyer-Moore 字符串匹配算法、二维
列表递归检索( RTN 和 OTN)以及函数指针列表等方法。在保持这些方法的基础上,本文试图对规
则匹配的次序进行动态调整,以提高数据包匹配效率,从而提高 Snort 的整体性能。
0x05 规则匹配
利用高效的AC匹配算法;
针对跨包是将一条流多个包组合层一个大包,不支持跨包;
0x06 总结
1、规则引擎的构建需要以上几个步骤完成;良好的规则设计可以方便以后针对漏洞的暴露添加规则;
2、规则高效的数据结构组织;
3、如何优化规则匹配算法;
4、对于跨包的检测;