简介
本文档介绍Snort 3自7.4版本开始添加的新技术。
背景信息
- Snort 3检测模块以块模式工作。尽管这种方法具有性能优势和实施简便性(相对而言),但在检测跨越多个数据块的签名方面有一定的局限性。
- 为了简化用户体验,Snort中已经进行了一些改进,即:
- Flowbits允许规则编写器使用用户定义的属性标记网络流;该属性可以在来自流的任何数据包上设置、清除和测试(它提供了一种推断数据包上某些较大签名的方法)。
- 流模块将有线分组累积为重建分组,该重建分组是比原始分组更大、更有意义的块;根据重建的数据包评估IPS规则可以更有机会看到整体情况并匹配更大的模式(签名)。
- 在某些情况下,重建的数据包不仅提供新数据,而且包括检测已处理的部分先前数据;同样,该累积数据块允许检测到向后跨越该流(在某种程度上)的签名。
- 流分离器将流分成多个块,但是这个切点可能是攻击者用来避免模式检测的薄弱点;因此,Snort实施了抖动机制,使得拆分更加不可预测。这使对攻击者的分析更加复杂。
新特性
状态签名评估是一种可以添加到签名列表的新技术。它通过在多个块上启用IPS规则评估来扩展检测能力。因此,如果当前块缺少数据,规则不会立即不匹配,而是等待更多数据到达。
支持的平台
最低软件和硬件平台
|
支持的管理器最低版本
|
受管设备
|
需要支持的最低受管设备版本
|
备注
|
|
管理中心7.4.0
|
FTD
|
7.4.0
|
仅Snort 3
|
|
设备管理器7.4.0
|
支持FDM管理的任何FTD
|
7.4.0
|
仅Snort 3
|
功能详细信息
功能功能说明
它如何运转?
检测模块工作流程如图所示。在流量处理阶段,模块已加载所有规则,并且它逐一接受数据块、评估规则并定义要对进程状态签名评估块执行的操作。

有关计划的附注:
- 一旦为当前数据块定义了规则子集,将独立于其他规则评估其中的每个规则。
- 每个数据块都独立于其他块进行评估。
- 数据块是一组IPS缓冲区的抽象,针对当前数据包进行评估。
- Action是为当前数据包评估的操作的列表;最终判决将在稍后确定。
要了解状态签名评估的工作方式,请查看如何评估常见的IPS规则,以及数据块如何形成数据流。
通用规则评估
IPS规则可以采用以下形式:
action protocol source → destination ( option_1: parameters; option_2: parameters;
option_3: parameters; gid: 1; sid: 1; meta_option_1; meta_option_2; meta_option_3; )
其中:
action — 规则触发时数据包上的IPS操作
protocol — 要匹配的协议
源、目的- IP地址和端口
option_1、option_2、option_3 -作为规则评估一部分的IPS选项
gid、sid -标识规则的唯一对(它们类似于元数据选项)
meta_option_1、meta_option_2、meta_option3 — 规则元数据(如消息、类类型或引用),这些选项不参与规则评估。
- 协议、源和目标组成规则报头。它充当网络流(接受用于评估的流)的过滤器。 括号中的所有内容都是规则体。来自规则主体的IPS选项(规则元数据除外)是为数据块评估的选项。它们符合以下声明:
- 选项按从左到右的顺序严格评估。
- 可以是两种主要类型之一。
- buffer setter,选项为当前数据包选择IPS缓冲区。
- 其他(模式搜索、数学运算、游标操作、flowbit运算)
- 光标用于跟踪所选IPS缓冲区中的位置。
- 选项可以是:
- “absolute”,表示它不依赖于游标位置
- “relative”,表示它从光标位置开始计算
- 如果某个选项尝试将光标从所选IPS缓冲区设置出来,则该选项会失败,并且整个规则不匹配(由于缺少数据)
- 最后一点是检测模块的局限性。如果Snort可以拥有无限的资源,则当数据可用时(有更多有线数据包到达),它会缓存所有被视为要重新评估规则的数据。
数据流和IPS缓冲区
- 数据流是来自同一源的连续格式字节流。它是一种支持状态评估的新概念。块之间的规则评估必须在同一逻辑数据内完成(无论是文件、纯TCP数据流还是JavaScript文本)。
- 一般来说,检测模块接收的数据块可以:
- 来自不同的IPS缓冲区(例如,pkt_data和file_data不同)
- 属于另一个流
- 不形成流(从原始数据包生成的缓冲区)
- 不形成连续流(ICMP、UDP)
- 不按顺序(HTTP部分响应)
- 包含重复数据(累积数据块,如http_inspect.script_detection或HTTP分块响应)
- 检测模块可以只对同一数据流中的块进行排序,否则,评估过程会看到来自交错块的不需要的干扰。

注意:此处的示例展示HTTP客户端同时上传和下载多个文件的情况。
- 目前,只有两个IPS缓冲区可以代表一个流:pkt_data和file_data,其中:
- pkt_data形成TCP协议的两个数据流(客户端到服务器和服务器到客户端方向)
- file_data必须形成文件、MIME附件和其他协议数据(如HTTP HTML页面和/或其他Content-Type)的流
- 状态评估严格在数据流内完成。
规则延续
- 前面的部分以一条语句结尾,该语句表示,如果将IPS选项从当前IPS缓冲区中设置为游标,则不匹配。但是,当IPS缓冲区形成数据流时,状态签名评估功能会逐步进入,并将规则评估上下文保存在Snort流对象中。保存的评估上下文(状态)称为规则继续。状态签名评估会延迟规则的最终判定,直到有更多的数据可用。
- 规则继续包含三个主要部分:IPS缓冲区名称、缓冲区源和目标游标位置(缓冲区源是数据流的唯一标识符)。
- 当检测模块处理数据块时,后续操作发生:-
- 状态签名评估会创建规则延续,并在以下情况下将其附加到流:
- IPS选项(byte_jump、content、pcre或其他任何可更新光标位置的选项)在当前IPS缓冲区后面设置光标
- 当前IPS缓冲区支持数据流。
- 当前IPS缓冲区会形成数据流。
- 状态签名评估会撤销刚刚创建的规则延续,并在以下情况下将其从流中删除:
- IPS规则已在当前数据块上触发(规则匹配块的其他位置)
- 有状态签名评估拒绝待处理的规则连续性,并在以下情况下将其从流中删除:
- IPS缓冲区不形成连续的数据流(例如,数据块中有重复的数据,或者存在间隙(部分数据丢失或者数据块顺序混乱)。
- 有状态签名评估使用新的可用数据更新目标光标位置,条件是:
- 来自规则继续的缓冲区源与选定的缓冲区源相同
- IPS缓冲区形成连续的流
- 在以下情况下,状态签名评估会将规则继续发送回IPS规则引擎:
- 目标光标定位点在选定IPS缓冲区内(也就是说,它最终收到了完成规则评估所需的所有数据)。
用户配置
- 由于规则连续会占用内存,Snort无法存储无限数量的内存。有一个配置选项用于控制限制:
- Detection.max_continuations_per_flow = 1024:流中同时存储的最大连续数{ 0:65535 }
- 当状态签名评估达到限制时,它用新规则替换最旧的规则延续。
- 驻留在流的最早的规则继续时间太长,这意味着它仍然不满足恢复规则评估的条件。
- 此外,还有大量挂钩计数可用于微调IPS规则(必须成为主要焦点)和限制(如果需要):
- detection.cont_creations:创建的连续项总数(总计)
- detection.cont_recalls:已召回的连续出版物总数(总计)
- detection.cont_flows:使用连续值的流总数(总计)
- detection.cont_evals:符合条件的连续项总数(总计)
- detection.cont_matches:匹配的连续项总数(总计)
- detection.cont_mismatches:不匹配的连续项总数(总计)
- detection.cont_max_num:每个流的同时连续峰值数(最大)
- detection.cont_match_distance:匹配连续跳转的总字节数(sum)
- detection.cont_mismatch_distance:不匹配连续跳转的总字节数(sum)
故障排除
此功能是对现有检测过程的增强,因此无法显式进行故障排除。如果检测失败,则必须检查规则、配置或流量。
示例问题
问题:描述
问题:解决方案
规则将按以下方式评估:
第1个数据包(大小为8kB)携带文件报头和正文的一部分:
- 已选择IPS缓冲区file_data。光标指向第0字节e1。
- fast pattern选项匹配并设置光标位置,紧跟幻数,指向字节7f。
- byte_jump选项读取两个字节的文件体大小。游标按这两个字节更新。然后,byte_jump计算超过32768个字节的跳跃。
- 有状态签名评估可创建规则延续,其中需要多24578字节(32768 — (8kB - 4字节报头 — 2字节正文大小))。
- 整个规则不匹配,因为byte_jump选项无法将游标位置设置得那么远。
第2个数据包(大小为16kB)上携带文件正文部分:
- 状态签名评估将看到待处理的规则延续。
- 它按名称选择缓冲区,并看到file_data可用且新数据大小为16384。
- 更新的游标显示仍需要8194个字节(24578 - 16384)
- 规则未恢复。
第3个数据包(大小为8198个)传输文件正文部分和元数据:
- 状态签名评估将看到待处理的规则延续。
- 它按名称选择缓冲区,并看到file_data可用,新的数据大小为8198。
- 更新的游标显示缓冲区有足够的数据,游标位置是8194。
- 状态签名评估会删除规则的继续性。
- 状态签名评估从第2个内容选项恢复规则评估,光标指向字节01。
- content选项在搜索到的第2个字节上查找匹配项。
- 整个规则终于触发。
限制详细信息和常见问题
限制和其他注意事项
- 由于状态签名评估实施,Snort会在重新加载其配置时丢弃所有待处理的规则连续性。请注意,尽管规则被丢弃,但继续操作仍会占用Snort内存,直到下一个数据块发送到检测模块为止。
- 状态评估中IPS规则的规则延迟功能的作用与普通规则评估相同。总结了不同数据块上规则部分的评估时间。如果时间超过限制,则规则评估会执行短路,提前退出。
- Flowbits操作保留其意义,但它们仍然像“静态”选项一样执行。
在当前已知环境中执行flowbit设置/清除/测试操作。因此,如果在规则继续中评估flowbit选项,它将考虑当前环境(flowbits集),而不是规则开始评估时的环境。
此外,规则编写器必须注意快速模式位置。
即使它可以在规则的任何部分,也会在整个规则之前评估fast-pattern选项。它触发规则评估。对于基于状态签名评估的规则,这意味着规则延续点必须位于fast-pattern选项之后。
此外,IPS规则在其评估中可以有多个规则连续性(一个接一个,而不是同时)。 由于规则正文中的任何选项都可以继续使用,因此规则编写器可以使用同一IPS规则在数据流中的不同位置执行额外检查。