matt869/detection-validation-pipeline
GitHub: matt869/detection-validation-pipeline
一个端到端的 Detection as Code 流水线,通过三态模型持续模拟攻击、验证 SIEM 规则有效性并量化遥测数据缺口。
Stars: 0 | Forks: 0
# 检测验证流水线
证明你的检测确实触发了——如果没有触发,说明*原因*。
大多数检测测试报告只是简单地判定通过或失败。这掩盖了一个关键的区别:
一条规则没有触发是因为其**逻辑错误**,需要检测工程师介入;而一条规则没有
触发是因为**遥测数据根本没有到达**,这需要平台团队解决。针对不存在的数据
去调整规则比什么都不做更糟糕,因为它最终会在依然存在的缺口旁边留下一个绿勾。
因此,每个验证用例都会归结为以下三种状态之一:
| | | |
| --- | --- | --- |
| **`detected`** | 规则匹配到了行为产生的事件。 | 控制措施有效。 |
| **`visible`** | 遥测数据已到达;但规则没有匹配到任何数据。 | **检测缺口** → 修复规则。 |
| **`blind`** | 所需类型的遥测数据未到达。 | **可见性缺口** → 修复数据采集。 |
完整推理见 [`docs/three-state-model.md`](docs/three-state-model.md)。
## 试一试
无需 SIEM、实验室、凭据或配置。它会重放已录制的遥测数据,且不执行任何操作:
```
$ pip install -e .
$ dvp run --profile quick-smoke
```
```
[+] detected lsass_memory_access / T1003.001-lsass-handle-open 9.0s
[+] detected powershell_encoded_command / T1059.001-powershell-encoded 2.0s
[x] blind defender_exclusion_added / T1562.001-defender-path-exclusion
[+] detected run_key_persistence / T1547.001-run-key-appdata 4.0s noisy(1)
...
detected 15 ######################.. the control works
visible 0 ........................ telemetry present, rule silent - detection gap
blind 1 ##...................... no telemetry - visibility gap
detection rate 94% telemetry visibility 94%
detect latency p50 4.0s p95 5m 31s
noisy rules 1 rule(s) also match quiet-baseline activity
pass no-errors no cases errored
pass expectations-met every case matched its documented expectation
PASS all gates satisfied
```
那个 `blind` 结果并不是失败。`defender_exclusion_added` 声明了
`expect: blind`,因为 Defender 频道尚未接入——该缺口已被记录、分配负责人并
注明日期,因此它报告为 `pass`,同时会在覆盖报告中保持可见状态,直到其被真正
修复。
`noisy(1)` 是一个真实的发现:该规则在静默的基线时间窗口内,也匹配到了一个
Teams 自动启动项。一条规则可以同时处于 `detected` 和 noisy 状态,
而同时具备这两种状态的规则并不是一个有效的控制措施。
## 它的工作原理
```
plan ─> baseline ─> emulate ─> settle ─> collect ─> classify ─> score
```
1. **Plan** — 将 profile 解析为用例(一条规则 × 一次模拟测试)。
2. **Baseline** — 在模拟行为*之前*,在一个静默时间窗口内运行每条规则,以
测量其自身产生的噪声。
3. **Emulate** — 在默认拒绝的安全策略下,产生行为。
4. **Settle** — 等待数据接入(对于已录制的语料库会跳过此步骤)。
5. **Collect** — 每个用例执行两次查询:规则的逻辑查询,和遥测探针查询。
6. **Classify** — 三态模型判定。
7. **Score** — 覆盖率对比目标,与上次运行的差异对比,质量门禁。
## 命令
```
$ dvp doctor --backends # config, content and connectivity
$ dvp rules lint # pre-commit hook material
$ dvp rules compile lsass_memory_access --dialect splunk
$ dvp rules score --explain # per-rule quality grades
$ dvp run --profile quick-smoke --plan-only
$ dvp coverage --gaps visibility # what is not being logged
$ dvp coverage --navigator layer.json
$ dvp runs diff # what changed since last time
$ dvp report --latest --format html
$ dvp dashboard # local read-only review UI
```
退出代码是稳定的,因此 CI 可以区分“检测发生回归”(1) 和 “无法访问 SIEM”(5)。参见 [`docs/architecture.md`](docs/architecture.md#exit-codes)。
## 规则
Sigma 形态的 YAML,包含三个附加字段:`telemetry:`(该规则依赖的日志源——
这正是实现三态模型的关键),`validation:`(如何验证规则),和 `tuning:`(保
留在检测逻辑之外的本地例外情况)。
```
title: LSASS process memory accessed with credential-dumping rights
severity: critical
attack:
tactics: [credential-access]
techniques: [T1003.001]
telemetry:
- sysmon_process_access
detection:
selection_handle:
EventID: 10
TargetImage|endswith: '\lsass.exe'
GrantedAccess: ['0x1410', '0x1fffff']
filter_known_good:
SourceImage|endswith: ['\MsMpEng.exe', '\wmiprvse.exe']
condition: selection_handle and not filter_known_good
validation:
emulation: [T1003.001-lsass-handle-open]
expect: detected
max_latency: 3m
```
一条规则会编译为所有方言。`rulekit` 会拒绝编译而不是进行近似处理——
如果一条规则会静默丢失其 `not filter` 子句,它会编译失败,而不会被
部署。
```
$ dvp rules compile lsass_memory_access --dialect splunk
index=windows sourcetype="XmlWinEventLog:...Sysmon/Operational" EventCode=10
(EventID="10" AND TargetImage="*\\lsass.exe" AND (GrantedAccess="0x1410" OR ...))
AND NOT (SourceImage="*\\MsMpEng.exe" OR SourceImage="*\\wmiprvse.exe")
```
支持平台:**Splunk** (SPL),**Elastic/OpenSearch** (Lucene),**Microsoft
Sentinel/Defender** (KQL),以及 **fixture**——后者会编译为一个 Python
谓词,这也使得整个流水线能够在 CI 中离线运行。
## 安全性
该流水线旨在执行攻击者形态的行为,因此其默认状态是完全不执行任何操作。在
执行任何单个命令之前,必须满足八个条件——
包括 `host_allowlist` 不为空(**空列表意味着全部拒绝**),
已记录授权引用,以及交互式地传递了 `--execute` 参数。破坏性技术
(T1485/T1486/T1489/T1490/T1561) 被永久列入黑名单,无法通过 profile 启用。
本仓库不包含任何攻击性载荷。测试要么是产生相同形态遥测数据的良性
模拟,要么是 `executor: manual`——
测试框架会预留一个时间窗口并对结果进行评分,但操作员会在其自身的权限
下执行该操作。
在使用 `--execute` 运行之前,请阅读
[`docs/threat-model.md`](docs/threat-model.md)。
## 目录结构
```
detections/ Rules, by platform and tactic
mapping/ ATT&CK reference, telemetry catalogue, coverage targets
fixtures/ Emulation test definitions + recorded event corpora
config/ Settings, backends, validation profiles
baseline/ What "quiet" looks like, and what noise is accepted
harness/ The pipeline: core, backends, emulation, analysis, reporting
rulekit/ Rule parsing, linting, scoring, query compilation
storage/ SQLite schema and migrations
dashboard/ Local read-only review UI
infra/ Sysmon config, auditd rules, CloudTrail terraform
docs/ Architecture, three-state model, threat model, ADRs
```
## 环境要求
Python 3.11+。**PyYAML 是唯一必需的依赖项**——报告、HTML
渲染器和仪表板均使用标准库构建,因此它可以运行在没有网络
访问的加固主机上。`httpx` 仅用于实时 SIEM 后端
(`pip install -e '.[live]'`)。具体原因见
[ADR 0003](docs/adr/0003-minimal-dependencies.md)。
## 开发
```
$ pip install -e '.[dev]'
$ pytest
$ ruff check .
$ dvp rules lint --dialect splunk --dialect elastic
```
离线测试套件无需任何基础设施。`make ci` 会运行与
`scheduler/jobs.yml` 中的流水线相同的检查。
## 许可证
Apache 2.0。
标签:Detection as Code, LNA, Python, 安全运营, 恶意代码分类, 扫描框架, 攻击模拟, 无后门, 运行时操纵, 逆向工具, 驱动签名利用