AshwinNHacker/detection-drift-tracker

GitHub: AshwinNHacker/detection-drift-tracker

一款检测工程工具,通过语义对比 Sigma 规则版本并在样本事件上模拟匹配,在 CI 阶段提前发现并量化报告检测覆盖范围的偏移。

Stars: 0 | Forks: 0

# 检测 Drift Tracker **检测软件/内容更新间的检测规则行为差异——包括字段级*和*行为级。** 检测规则(Sigma、SIEM 关联规则、EDR 内容)始终在悄然发生偏移(drift):供应商重命名了二进制文件,“清理”提交缩小了 `contains` 匹配范围,条件被重构且布尔逻辑发生细微变化。对 YAML 文件进行普通的 `git diff` 只能告诉你*某些东西*变了。它不会告诉你**该规则现在捕获到了什么以前没捕获到的东西——或者更糟的是,它以前能捕获而现在却捕获不到什么。** Detection Drift Tracker 通过以下方式回答了这个问题: 1. **解析**每个规则版本(Sigma 样式的 YAML)为结构化模型。 2. **语义化对比字段**——新增/移除/修改的选择(selections)、条件更改、日志源(logsource)更改——忽略装饰性的 YAML 干扰信息(键顺序、空格)。 3. **将两个规则版本在样本事件语料库上进行模拟**,并对比*匹配结果*:哪些事件是新匹配上的,哪些不再匹配(覆盖范围丢失),哪些保持稳定。 4. **对偏移进行 0-100 评分**,并划分严重性等级(`none`/`low`/`medium`/`high`/`critical`),其权重设置使得悄然的覆盖范围丢失主导得分——因为停止触发的规则远比变得更嘈杂的规则危险得多。 5. **生成报告**,输出为独立的 HTML 文件(无 CDN 调用,离线安全)以及用于 CI 门控 / SOAR 摄取的 JSON。 它可以直接对比两个文件,或者遍历规则的整个 **git 历史记录**,并报告每次提交转换时的偏移——因此你可以将其指向你的 Sigma 分支或内部 detection-as-code 仓库,并获得完整的偏移时间线。 ``` $ drift-tracker diff --old rule_v1.yml --new rule_v2.yml --events events.json === Suspicious PowerShell Encoded Command Execution :: old -> new === Severity: CRITICAL Score: 75.7/100 Behavioral: 1 lost, 2 gained, 1 stable (of 7 sample events) - Detection condition logic changed. - 3 selection field value(s) added/removed/modified. - 1 metadata field(s) changed (level/status/tags/id). - COVERAGE LOSS: 1/7 sample event(s) that used to match no longer do. - 2/7 sample event(s) now match that didn't before (possible expanded coverage or new false positives). ``` ## 为什么这很重要 如今,大多数检测偏移的发现都经历了一个艰难的过程:事件响应人员注意到某个规则*本应*触发却没有触发,并将其追溯到几个月前的一次内容更新。该工具将这种发现“左移”(提前)到了代码审查 / CI 阶段——它在每次更改时针对具有代表性的遥测数据运行实际的规则逻辑,而不仅仅是粗略查看文本差异。 其典型的应用场景包括: - **detection-as-code 仓库的 Pre-merge CI 检查**:如果任何规则更改的得分为 `HIGH`/`CRITICAL`,则使构建失败(或要求签核)。 - **更新后的 SOC 审计**:在 SIEM/EDR 内容包更新后,对比供应商的旧版和新版规则导出文件,查看发生了哪些悄然的变更。 - **检测工程 QA**:搭配一个不断增长的回归语料库(包含真实经过脱敏处理的攻击遥测数据和良性噪声),将其视为你检测项的单元测试套件。 ## 安装说明 ``` git clone https://github.com/AshwinNHacker/detection-drift-tracker.git cd detection-drift-tracker pip install -e . ``` 需要 Python 3.9+。唯一的运行时依赖是 `PyYAML`。 用于开发(测试): ``` pip install -e ".[dev]" pytest ``` ## 用法 ### 1. 直接对比两个规则文件 ``` drift-tracker diff \ --old path/to/rule_v1.yml \ --new path/to/rule_v2.yml \ --events path/to/sample_events.json \ --html report.html \ --json report.json ``` `--events` 是可选的——省略它则仅进行字段级别的对比(不进行行为模拟)。请参阅 [`examples/sample_events/events.json`](examples/sample_events/events.json) 了解预期的格式要求:一个包含扁平事件对象的 JSON 列表(或 `{"events": [...]}`),为了报告的易读性,每个对象最好携带一个 `_id` 键。 ### 2. 遍历规则的 git 历史记录 ``` drift-tracker history \ --repo /path/to/rules-repo \ --rule-path sigma/windows/process_creation/proc_creation_win_powershell_enc.yml \ --events path/to/sample_events.json \ --html history_report.html ``` 这会找到涉及该文件的所有提交(`git log --follow`),并将每个版本与前一个版本进行对比,这样你就能获得完整的偏移事件时间线,而不仅仅是前后的快照对比。 ### 3. 运行内置演示 ``` drift-tracker demo --html demo_report.html ``` 运行包含的示例规则对(见下文)并直接打开报告——这是查看该工具实际运行效果的最快方式。 ### 退出代码(用于 CI 门控) | 所有结果中的最严重等级 | 退出代码 | |---|---| | none / low / medium | `0` | | high | `1` | | critical | `2` | 将其接入 CI 作业中: ``` - name: Check detection rule drift run: drift-tracker diff --old rules/old/x.yml --new rules/new/x.yml --events tests/events.json ``` 遇到 high/critical 级别的偏移时,非零退出码将使作业失败。 ## 本仓库内置的示例 [`examples/rules/suspicious_powershell_v1.yml`](examples/rules/suspicious_powershell_v1.yml) 和 [`suspicious_powershell_v2.yml`](examples/rules/suspicious_powershell_v2.yml) 模拟了一次真实的内容重构: - **新增**了 `pwsh.exe` (PowerShell 7+) 到进程匹配中——真正拓宽了覆盖范围。 - **缩小**了编码命令(encoded-command)的匹配范围,从 `-enc`(纯子字符串)更改为 `-enc `(要求带有尾随空格),其假设是这“与以前一样,只是更干净了”。实际上,这悄悄地导致它不再匹配完整的 `-EncodedCommand` 拼写,而分析人员和恶意软件目前都仍在使用这种完整拼写。 - **新增**了一个 `-nop -w hidden` 选择,并将条件从简单的 `and` 重写为混合了 `and`/`or`/`1 of` 的表达式。 运行 `drift-tracker demo`,你会清楚地看到:一个曾经匹配的事件不再匹配(覆盖范围丢失),两个新事件现在匹配上了(因为 pwsh.exe 的范围扩大),并且整体更改的得分为 `CRITICAL`——这是正确的,因为在真正的改进中悄然混入了一个检测漏洞。 ## 规则匹配的工作原理(及其局限性) 本项目实现了 [Sigma 规范](https://github.com/SigmaHQ/sigma-specification) 的一个**实用子集**——足以对真实的检测逻辑进行建模,但它并不是一个经过认证的、完全符合规范的 Sigma 引擎。如果你需要完全兼容 Sigma 标准(所有后端、所有修饰符、诸如 `count()`/`near` 等聚合函数),请将此工具与 [`pySigma`](https://github.com/SigmaHQ/pySigma) 搭配用于转换步骤,并将 Detection Drift Tracker 作为在此之上的偏移/回归检测层使用。 支持: - 条件语句中的 `and` / `or` / `not` / 括号 - `1 of ` / `all of ` - `1 of them` / `all of them` - `1 of *` / `all of *` 通配符选择组 - 字段修饰符:`contains`、`startswith`、`endswith`、`re`、`all`、`base64`、`cased` - 普通字段值中的通配符(`*`、`?`) - 列表值作为 OR 组;选择映射(selection-maps)列表作为 OR 组 不支持(目前还不行——见 [路线图](#roadmap)): - Sigma 聚合条件(`count() by ... > N`,`near`) - 关联规则(Sigma 较新的多规则关联规范) - 字段间对比(`|fieldref`) ## 架构 ``` ┌──────────────┐ rule v1 ────▶ │ │ │ parser.py │ Sigma-style YAML → Rule model rule v2 ────▶ │ │ └──────┬───────┘ │ ┌──────────────┼────────────────────┐ ▼ ▼ ┌────────────────┐ ┌──────────────────┐ │ diff_engine.py │ │ simulator.py │ │ field-level │ │ compiles condition│ │ semantic diff │ │ runs vs sample │ └────────┬────────┘ │ event corpus │ │ └─────────┬──────────┘ │ field changes │ match delta └───────────────┬─────────────────────┘ ▼ ┌───────────────┐ │ scorer.py │ 0-100 drift score + severity └───────┬───────┘ ▼ ┌───────────────┐ │ report.py │ HTML (self-contained) + JSON └───────────────┘ git_source.py pulls historical file versions from a repo and feeds pairs of Rule objects through the same pipeline (see analyzer.py). ``` 有关每个模块和评分依据的更深入讲解,请参阅 [`docs/architecture.md`](docs/architecture.md)。 ## 项目布局 ``` detection-drift-tracker/ ├── src/drift_tracker/ │ ├── models.py # Rule, FieldChange, MatchDelta, DriftResult dataclasses │ ├── parser.py # Sigma-style YAML → Rule │ ├── diff_engine.py # semantic field-level diff │ ├── simulator.py # condition tokenizer/parser + event matching │ ├── scorer.py # drift scoring + severity buckets │ ├── git_source.py # git history retrieval (subprocess, no GitPython dep) │ ├── analyzer.py # orchestration (diff + simulate + score) │ ├── report.py # HTML / JSON report generation │ └── cli.py # `drift-tracker` command-line entry point ├── examples/ │ ├── rules/ # example v1/v2 rule pair used by `demo` and tests │ └── sample_events/ # example event corpus ├── tests/ # pytest suite (parser, diff, simulator, scorer, e2e) ├── docs/architecture.md └── .github/workflows/ci.yml ``` ## 路线图 - [ ] 支持 Sigma `count()`/聚合和关联规则的偏移检测 - [ ] 在相同的 `Rule` 模型下支持可插拔的规则格式(Suricata/Snort、YARA) - [ ] 输出 Markdown/SARIF 报告以用于 GitHub PR 标注 - [ ] 历史趋势视图(跨整个仓库查看每个规则随时间变化的偏移分数) - [ ] 可选集成 `pySigma` 以进行完全规范的条件评估 欢迎贡献——请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。 ## 许可证 [MIT](LICENSE)
标签:DevSecOps, 上游代理, 安全规则引擎, 安全运营, 恶意代码分类, 扫描框架, 网络安全研究, 逆向工具