snort 的 TCP Stream reassembly实现
TCP Stream reassembly是snort 预处理中 stream5 的一部分,按理说这块应该由两块组成:流监视、流重组。通过学习代码,我发现流的监视部分调用是在 detect.c 文件的 Preprocess函数中:
PreprocEvalFuncNode *idx = policy->preproc_eval_funcs; 为获得所有预处理模块入口函数的链表头,idx->func(p, idx->context);对于 TCP stream来说实际的函数为 Stream5Process。
下来就是应该是 reassembly 部分,但是怎么找不到 rpkt_idx->func()的实际定义在什么地方实现的?好几天了,还是找不到 reassembly 的实现代码,是我代码理解错了还是什么?熟悉这里的朋友能否帮个忙,万分感谢呀?
我目前分析的版本是snort-2.8.6
PreprocEvalFuncNode *idx = policy->preproc_eval_funcs; 为获得所有预处理模块入口函数的链表头,idx->func(p, idx->context);对于 TCP stream来说实际的函数为 Stream5Process。
下来就是应该是 reassembly 部分,但是怎么找不到 rpkt_idx->func()的实际定义在什么地方实现的?好几天了,还是找不到 reassembly 的实现代码,是我代码理解错了还是什么?熟悉这里的朋友能否帮个忙,万分感谢呀?
我目前分析的版本是snort-2.8.6
作者: anjing83830 发布时间: 2011-11-02
Snort的TCP reassembler被称为Stream4和它的作品相当不错IDS模式,但是它有一些严重的问题在内嵌模式。最大的和最重要的问题是,Snort_inline不能阻止攻击,如果是在重组流检测 。Snort_inline 2.4,我们做了我们的第一个尝试修复与stream4inline修改。
Stream4从未设计要使用内联。这是旨在帮助Snort的IDS模式的检测能力。这有一个大的后果负责设计。Stream4,传入的数据包存储在每流的数据包列表,通常前的数据包处理 。经过的数据包数量已经越积越多这样,流被刷新。这冲洗建立一个伪数据包ack'd列表中的所有数据包的有效载荷。这个伪数据包是通过检测引擎运行,看它是否包含攻击 。IDS模式,这工作得很好,因为这样的攻击可以在重组后的流检测 。
内联运行时这个概念有一个很大的缺陷。内联模式,我们可以用行动下降。这一行动使确保底层子系统(netfilter的IPFILTER)丢弃该数据包,确保它不会到达目的地。与Stream4的问题是,伪包检查时,其内容是已经接受并通过终端主机ack'd。当然,这种情况是非常不满意的。
要在Snort_inline 2.4处理这个问题,我们创建stream4inline选项。此选项是一个简单的重组对于收到的每一个数据包的流Stream4修改。重组的流,而不是正常的数据包,然后每一次扫描。这种方法有两个性能问题。首先,我们调用函数建立的每一个数据包,我们收到的伪数据包。由于这个函数遍历每次包列表,这是昂贵的。
Stream4从未设计要使用内联。这是旨在帮助Snort的IDS模式的检测能力。这有一个大的后果负责设计。Stream4,传入的数据包存储在每流的数据包列表,通常前的数据包处理 。经过的数据包数量已经越积越多这样,流被刷新。这冲洗建立一个伪数据包ack'd列表中的所有数据包的有效载荷。这个伪数据包是通过检测引擎运行,看它是否包含攻击 。IDS模式,这工作得很好,因为这样的攻击可以在重组后的流检测 。
内联运行时这个概念有一个很大的缺陷。内联模式,我们可以用行动下降。这一行动使确保底层子系统(netfilter的IPFILTER)丢弃该数据包,确保它不会到达目的地。与Stream4的问题是,伪包检查时,其内容是已经接受并通过终端主机ack'd。当然,这种情况是非常不满意的。
要在Snort_inline 2.4处理这个问题,我们创建stream4inline选项。此选项是一个简单的重组对于收到的每一个数据包的流Stream4修改。重组的流,而不是正常的数据包,然后每一次扫描。这种方法有两个性能问题。首先,我们调用函数建立的每一个数据包,我们收到的伪数据包。由于这个函数遍历每次包列表,这是昂贵的。
作者: 此人伤不起 发布时间: 2011-11-03