本文解决 Yara 规则中三个特征码任意顺序且距离受限的检测问题,给出从基础数学模块到全匹配迭代的两阶段方案,指出首版规则因仅取首次匹配会漏报,经嵌套遍历所有匹配位置后可覆盖多重出现场景。
**基础规则:数学模块限定首匹配跨度**
首个规则 three_body_problem_3 导入 math 模块,定义三个十六进制模式 $x={11 11 11 11}、$y={22 22 22 22}、$z={33 33 33 33}。条件段使用 math.max(math.max(@x,@y),@z) - math.min(math.min(@x,@y),@z) <= 16,计算三个模式首次匹配偏移的最大值与最小值之差,若不超过 16 字节则命中。优势是无需预设顺序即可限定首尾跨度;劣势是当文件包含额外同类模式时,孤立出现的匹配会成为新的首尾端点,拉大跨度导致漏报,原文 Figure 2 演示了该失效场景。
**进阶规则:三层迭代遍历全量匹配组合**
针对上述缺陷,three_body_problem_4 引入 Yara 数组迭代器。#x、#y、#z 分别表示各模式的匹配总数,条件段嵌套三层 for any 循环:for any i in (1..#x) 嵌套 for any j in (1..#y) 再嵌套 for any k in (1..#z),在最内层对 @x[i]、@y[j]、@z[k] 再次应用相同的 max-min 距离判断。这样可逐一校验所有匹配位置的任意组合,只要存在一组三元组满足跨度阈值即命中,原文 Figure 1 对应的多重匹配场景由此覆盖。
**取舍与工程意义**
迭代方案消除了漏报,但引入立方级组合爆炸:若三模式各出现 N 次,需评估 N³ 次距离计算。原文未给出具体性能数据,但在大文件或高频模式下规则耗时将显著上升。工程上可考虑在外层加入文件大小、熵值或关键字预过滤,或将阈值从 16 字节调大以减少深层循环触发频率。
对运维与网络工程师而言,掌握 math 模块与数组迭代可将单一匹配扩展为全组合校验,在样本变种、壳码混淆等多模式无序分布场景下显著降低漏报;但嵌套循环随匹配数增长呈立方级复杂度,实际部署需权衡规则性能与检测完整性,必要时配合条件裁剪或外部预过滤。
原文: APNIC Blog(2022-03-16)|编译自 APNIC Blog,事实以原文为准。
来源:APNIC Blog