当前位置: 首页 > news >正文

suricata之规则去重

一、环境和背景

1.1 环境

OS: Ubuntu 22.04.5 LTS
IDE: vscode
suricata: suricata 7.0.5

1.2 背景

在添加规则时,为了给规则分类,将不同类别的规则写入不同的文件。
在规则加载时两条不同的规则却被认为是重复的,因此记录一下去重逻辑。

a.rule

alert ip any any -> any any (msg:"SURICATA Applayer Mismatch protocol both directions"; flow:established; app-layer-event:applayer_mismatch_protocol_both_directions; flowint:applayer.anomaly.count,+,1; classtype:protocol-command-decode; sid:2260000; rev:1;)

b.rule

alert http any any -> any any (msg:"SURICATA HTTP unknown error"; flow:established; app-layer-event:http.unknown_error; flowint:http.anomaly.count,+,1; classtype:protocol-command-decode; sid:2260000; rev:1;)

suricata.yaml

rule-files:- a.rule- b.rule

请添加图片描述

二、 Suricata 规则去重

suricata 规则通过一个hashtable进行去重。

2.1 hashtable 建立

// src/suricata.c
PostConfLoadedDetectSetup// src/detect-engine.c-> DetectEngineCtxInit// src/detect-engine.c-> DetectEngineCtxInitReal// src/detect-parse.c-> DetectParseDupSigHashInit// src/suricata.c-> LoadSignatures
int DetectParseDupSigHashInit(DetectEngineCtx *de_ctx)
{de_ctx->dup_sig_hash_table = HashListTableInit(15000,DetectParseDupSigHashFunc,DetectParseDupSigCompareFunc,DetectParseDupSigFreeFunc);if (de_ctx->dup_sig_hash_table == NULL)return -1;return 0;
}

2.2 检测重复

// src/detect-parse.cSignature *DetectEngineAppendSig(DetectEngineCtx *de_ctx, const ch
{// 1. 解析规则Signature *sig = SigInit(de_ctx, sigstr);if (sig == NULL) {return NULL;}// 2. 检测重复/* checking for the status of duplicate signature */int dup_sig = DetectEngineSignatureIsDuplicate(de_ctx, sig);...
}static inline int DetectEngineSignatureIsDuplicate(DetectEngineCtxSignature *sig)
{/* we won't do any NULL checks on the args *//* return value */int ret = 0;SigDuplWrapper *sw_dup = NULL;SigDuplWrapper *sw = NULL;/* used for making a duplicate_sig_hash_table entry */sw = SCMalloc(sizeof(SigDuplWrapper));if (unlikely(sw == NULL)) {exit(EXIT_FAILURE);}memset(sw, 0, sizeof(SigDuplWrapper));sw->s = sig;/* check if we have a duplicate entry for this signature */sw_dup = HashListTableLookup(de_ctx->dup_sig_hash_table, (void *)sw, 0);/* we don't have a duplicate entry for this sig */if (sw_dup == NULL) {...}...
}

2.3 重复条件

static char DetectParseDupSigCompareFunc(void *data1, uint16_t len1, void *data2,uint16_t len2)
{SigDuplWrapper *sw1 = (SigDuplWrapper *)data1;SigDuplWrapper *sw2 = (SigDuplWrapper *)data2;if (sw1 == NULL || sw2 == NULL ||sw1->s == NULL || sw2->s == NULL)return 0;/* sid and gid match required */if (sw1->s->id == sw2->s->id && sw1->s->gid == sw2->s->gid) return 1;return 0;
}

sidgid作为重复条件,全部相等时则认为重复,不看具体的规则内容。

三、总结

  1. suricata规则通过sidgid进行去重,并不关注规则中的具体内容
  2. 通过sidgid唯一区分规则,整个工程里对规则的处理相较于字符串,整数值处理更简单高效
  3. 如果需要将规则拆分成多个文件时,需要注意sid的值
http://www.xdnf.cn/news/393661.html

相关文章:

  • 力扣刷题(第二十三天)
  • LLMs之MCP:2025年5月2日,Anthropic 宣布 Claude 重大更新:集成功能上线,研究能力大幅提升
  • 关于在使用getOutputStream()方法后续没有用到write()
  • 普通IT的股票交易成长史--20250511 美元与美股强相关性
  • 微服务架构中如何保证服务间通讯的安全
  • 实践官方的 A2A SDK Python
  • 理解c++中explicit关键字的作用
  • Ai学习之LLM
  • python-Pandas库详细教程
  • C++蓝桥杯真题(题目+解析+流程图)(特殊运算符+四叶玫瑰数+质因数的个数+最大的矩形纸片+数字游戏+活动人数)
  • ADC接口
  • 职场心得总结(1)-如何获得晋升
  • Java快速上手之实验七
  • 2025-05-11 Unity 网络基础11——UnityWebRequest 使用
  • 【数据结构】前言
  • JVM内存结构有哪些?HashMap和HashTable的区别?
  • 编程技能:字符串函数02,strcpy
  • 解决SSH连接华为云服务器ESC经常性断连问题
  • 数据结构实验9.1:静态查找表的基本操作
  • C++:template(函数模板)
  • GitLab搭建与使用(SSH和Docker)两种方式
  • [学习]RTKLib详解:convkml.c、convrnx.c与geoid.c
  • HTTP 错误状态码以及常用解决方案
  • C++进阶--使用红黑树封装map和set
  • 原型链与继承机制:继承背后的秘密
  • Baklib内容中台的核心架构是什么?
  • 蓝桥杯14届国赛 班级活动
  • 反向代理对于 网络安全中服务器的一些思考
  • MiniMind:3块钱成本 + 2小时!训练自己的0.02B的大模型。minimind源码解读、MOE架构
  • JS | 正则 · 常用正则表达式速查表