Post

Suricata disable detect fileflags(ai)

Suricata disable detect fileflags(ai)

Suricata DisableDetectFlowFileFlags 分析

本文档详细分析了 DisableDetectFlowFileFlags 函数的作用、判断逻辑,以及检测引擎(Detection Engine)与应用层解析器(App-Layer Parser)之间的关系。

1. DisableDetectFlowFileFlags 的作用

DisableDetectFlowFileFlags 函数的主要作用是在检测引擎未开启或不可用时,显式禁用流(Flow)中的文件处理功能,以优化系统性能。

它会禁用以下功能:

  • 文件存储(Filestore):不提取和保存文件。
  • 文件类型检测(Magic):不进行文件魔数(Magic Number)检测。
  • 文件哈希计算(Checksums):不计算 MD5、SHA1、SHA256 等哈希值。

代码位置

  • 定义: suricata/src/detect.c
  • 调用: suricata/src/flow-worker.c

2. 判断逻辑:决策与执行

文件处理功能的禁用过程分为“决策”和“执行”两个阶段。

决策阶段:设置标志位 (Decision)

在流处理的早期阶段,系统会判断是否需要禁用文件功能。

  • 位置: suricata/src/flow-worker.c 中的 FlowWorker 函数。
  • 逻辑: 检查检测引擎上下文 det_ctx 是否为 NULL
  • 触发: 如果 det_ctx == NULL(说明检测引擎未启用),则调用 DisableDetectFlowFileFlags(p->flow)
  • 结果: 该函数将 f->file_flags 设置为 FLOWFILE_NONE(包含 FLOWFILE_NO_STORE, FLOWFILE_NO_MAGIC, FLOWFILE_NO_MD5 等)。
1
2
3
4
// suricata/src/flow-worker.c
if (det_ctx == NULL && ...) {
    DisableDetectFlowFileFlags(p->flow);
}

执行阶段:检查标志位 (Enforcement)

在应用层解析器提取文件并尝试进行操作时,会检查上述标志位。

  • 位置: suricata/src/util-file.c
  • 逻辑:
    1. 标志转换: SCFileFlowFlagsToFlags 函数将 Flow 的标志位(如 FLOWFILE_NO_STORE_TS)转换为具体文件对象的标志位(如 FILE_NOSTORE)。
    2. 具体判断:
      • FileOpenFile: 检查 FILE_NOMD5。如果设置了,则不分配 MD5 上下文,跳过哈希计算。
      • FileOpenFile / FileAppendDataDo: 检查 FILE_NOSTORE。如果设置了,则不执行文件存储逻辑。
      • FilePruneFile: 检查 FILE_NOMAGIC。如果设置了,则跳过 Magic 检测。

3. 检测引擎与应用层解析器的关系

两者是紧密的生产者-消费者 (Producer-Consumer) 关系。

核心关系

  • 应用层解析器 (Producer):
    • 负责“看见”:将原始字节流解析为结构化数据(HTTP URI, Header, Files 等)。
    • 职责:它不判断流量的好坏,只负责还原协议细节和提取对象。
  • 检测引擎 (Consumer):
    • 负责“看懂”:使用规则(Signatures)匹配解析器提供的结构化数据。
    • 职责:根据规则产生报警(Alert)或丢弃(Drop)。

执行顺序

FlowWorker 的处理循环中:

  1. 先解析 (Parse): 调用 FlowWorkerStreamTCPUpdateAppLayerHandleUdp。解析器先工作,提取出文件和元数据。
  2. 后检测 (Detect): 调用 Detect。检测引擎后工作,对解析出的数据进行匹配。

互动与优化

DisableDetectFlowFileFlags 体现了两者之间的优化互动:

  • 如果系统缺少“消费者”(检测引擎未启用,det_ctx == NULL),系统会提前通知“生产者”(解析器)。
  • 解析器收到通知(通过 Flow 上的标志位)后,就会跳过昂贵的文件提取和哈希计算操作,从而节省资源。
This post is licensed under CC BY 4.0 by the author.