suricata之规则去重

打印 上一主题 下一主题

主题 1781|帖子 1781|积分 5345

一、情况和配景

1.1 情况

OS: Ubuntu 22.04.5 LTS
IDE: vscode
suricata: suricata 7.0.5
1.2 配景

在添加规则时,为了给规则分类,将不同类别的规则写入不同的文件。
在规则加载时两条不同的规则却被以为是重复的,因此记录一下去重逻辑。
a.rule
  1. 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
  1. 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
  1. rule-files:
  2.     - a.rule
  3.     - b.rule
复制代码

二、 Suricata 规则去重

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

  1. // src/suricata.c
  2. PostConfLoadedDetectSetup
  3.     // src/detect-engine.c
  4.     -> DetectEngineCtxInit
  5.         // src/detect-engine.c
  6.         -> DetectEngineCtxInitReal
  7.             // src/detect-parse.c
  8.             -> DetectParseDupSigHashInit
  9.     // src/suricata.c
  10.     -> LoadSignatures
复制代码
  1. int DetectParseDupSigHashInit(DetectEngineCtx *de_ctx)
  2. {
  3.     de_ctx->dup_sig_hash_table = HashListTableInit(15000,
  4.                                                    DetectParseDupSigHashFunc,
  5.                                                    DetectParseDupSigCompareFunc,
  6.                                                    DetectParseDupSigFreeFunc);
  7.     if (de_ctx->dup_sig_hash_table == NULL)
  8.         return -1;
  9.     return 0;
  10. }
复制代码
2.2 检测重复

  1. // src/detect-parse.c
  2. Signature *DetectEngineAppendSig(DetectEngineCtx *de_ctx, const ch
  3. {
  4.     // 1. 解析规则
  5.     Signature *sig = SigInit(de_ctx, sigstr);
  6.     if (sig == NULL) {
  7.         return NULL;
  8.     }
  9.     // 2. 检测重复
  10.     /* checking for the status of duplicate signature */
  11.     int dup_sig = DetectEngineSignatureIsDuplicate(de_ctx, sig);
  12.     ...
  13. }
  14. static inline int DetectEngineSignatureIsDuplicate(DetectEngineCtx
  15.                                                    Signature *sig)
  16. {
  17.     /* we won't do any NULL checks on the args */
  18.     /* return value */
  19.     int ret = 0;
  20.     SigDuplWrapper *sw_dup = NULL;
  21.     SigDuplWrapper *sw = NULL;
  22.     /* used for making a duplicate_sig_hash_table entry */
  23.     sw = SCMalloc(sizeof(SigDuplWrapper));
  24.     if (unlikely(sw == NULL)) {
  25.         exit(EXIT_FAILURE);
  26.     }
  27.     memset(sw, 0, sizeof(SigDuplWrapper));
  28.     sw->s = sig;
  29.     /* check if we have a duplicate entry for this signature */
  30.     sw_dup = HashListTableLookup(de_ctx->dup_sig_hash_table, (void *)sw, 0);
  31.     /* we don't have a duplicate entry for this sig */
  32.     if (sw_dup == NULL) {
  33.         ...
  34.     }
  35.     ...
  36. }
复制代码
2.3 重复条件

  1. static char DetectParseDupSigCompareFunc(void *data1, uint16_t len1, void *data2,
  2.                                   uint16_t len2)
  3. {
  4.     SigDuplWrapper *sw1 = (SigDuplWrapper *)data1;
  5.     SigDuplWrapper *sw2 = (SigDuplWrapper *)data2;
  6.     if (sw1 == NULL || sw2 == NULL ||
  7.         sw1->s == NULL || sw2->s == NULL)
  8.         return 0;
  9.     /* sid and gid match required */
  10.     if (sw1->s->id == sw2->s->id && sw1->s->gid == sw2->s->gid) return 1;
  11.     return 0;
  12. }
复制代码
以sid和gid作为重复条件,全部相等时则以为重复,不看具体的规则内容。
三、总结


  • suricata规则通过sid和gid进行去重,并不关注规则中的具体内容
  • 通过sid和gid唯一区分规则,整个工程里对规则的处理相较于字符串,整数值处理更简单高效
  • 假如必要将规则拆分成多个文件时,必要注意sid的值

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

拉不拉稀肚拉稀

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表