yogimy03/detection-engineering-lab

GitHub: yogimy03/detection-engineering-lab

一个检测工程实验室,通过重放攻击与正常活动来验证 Sigma 检测规则是否真正生效,并提供 CI 门禁在规则回归失效时自动阻断构建。

Stars: 0 | Forks: 0

# 检测工程实验室 **一条规则只有在真实攻击中触发,并且在正常活动中保持安静时,才算作真正的覆盖。** 大多数检测项目停留在“我为技术 X 写了一条规则,所以 X 已被覆盖”的阶段。这只是一个声明,而不是事实。在真实的 SOC 中,很大一部分规则从未按人们预期的那样触发,因为日志字段被重命名了,工具将命令记录在规则未曾关注的地方,或者规则是从博客上复制来的,从未针对真实数据进行过测试。直到真实的安全事件直接绕过规则时,才有人注意到这一点。 这个实验室证明覆盖范围,而不是仅仅声称它。它重放攻击者的技术和正常活动,对两者都运行检测规则,只有当规则的**在攻击中触发**并且**在正常流量中保持静默**时,才将该技术标记为已覆盖。然后,它将检测视为代码:如果一条曾经能够捕获攻击的规则悄悄地不再捕获它,一个小的 CI 门禁就会让构建失败。 整个演示使用 Python 标准库运行。无需安装,无需 Docker,无需 API key。它在 Windows、macOS 和 Linux 上运行方式相同,并涵盖 Linux、Windows、云和网络检测。 ## 30秒内尝试 ``` python3 demo/run_demo.py ``` 你会得到以下结果(真实输出,绝无伪造)。覆盖范围涵盖 Linux、Windows、云和网络: ``` DETECTION COVERAGE (proven vs claimed) -------------------------------------------------------------------------- STATUS TECHNIQUE SCENARIO ATTACK BENIGN -------------------------------------------------------------------------- BROKEN T1003.001 LSASS credential dump 0 0 BROKEN T1105 Ingress tool transfer 0 0 NOISY T1552.001 Reading credential files 1 1 PROVEN T1053.003 Cron persistence with pay… 1 0 PROVEN T1059.001 PowerShell encoded command 1 0 PROVEN T1059.004 Download and run a script 1 0 PROVEN T1070.001 Clearing Windows event lo… 1 0 PROVEN T1070.002 Clearing system logs 1 0 PROVEN T1071.004 DNS tunneling 25 3 PROVEN T1078.004 AWS root console login 1 0 PROVEN T1110 SSH password brute force 8 2 PROVEN T1547.001 Registry Run key persiste… 1 0 PROVEN T1548.003 Sudoers file tampering 1 0 -------------------------------------------------------------------------- Claimed: 13 Proven: 10 Noisy: 1 Broken: 2 => 76.9% real coverage ``` 基本计数显示 13 项技术中有 13 项已被覆盖。事实是只有 10 项。一条规则因为太嘈杂而不可信,另外两条则默默失效了。演示还会写入: - `reports/coverage.html`(在浏览器中打开) - `reports/coverage.md` - `reports/navigator-layer.json`(在 [mitre-attack.github.io/attack-navigator](https://mitre-attack.github.io/attack-navigator/) 上传,查看矩阵亮起绿色、橙色、红色) ``` make demo # same thing make test # run the tests (standard library only) ``` ## 为什么这不同于“我设置了一个 SIEM” 每个 SIEM 都自带默认规则。你可以下载成百上千条 Sigma 规则,Navigator 热力图也会愉快地将你的覆盖率涂成绿色。所有这些都显示了*声称的*覆盖。几乎没有人去检查这些规则是否真的会触发。 这个实验室让声明经得起检验。对于每一条规则,它都会运行两个实验: | 实验 | 重放的内容 | 规则必须 | |---|---|---| | **触发测试** | 匹配的攻击 | 报警 | | **静默测试** | 正常的管理员、CI 和云活动 | 保持静默 | 只有两条测试都通过的规则才会被计算在内。这产生了三种诚实的测试结果: - **已证实(PROVEN)**  在攻击中触发,在正常活动中保持静默。真正的覆盖。 - **误报过多(NOISY)**   在攻击中触发,但也会在正常活动中触发。存在误报,不可信。 - **已失效(BROKEN)** 在其对应的攻击中从未触发。声称的覆盖并非真实存在。 ## 故意失效的规则 实验室自带一条嘈杂的规则和两条失效的规则,以便你查看验证器捕获了什么。这些都是检测工程师每周在 Linux 和 Windows 上都会遇到的真实 bug。 **误报过多(NOISY),T1552.001(读取凭证文件,Linux)。** 该规则标记了对 `.ssh/` 下文件的任何读取操作。这也匹配了管理员运行 `cat ~/.ssh/known_hosts` 的正常行为,因此它会在正常活动中触发。一条“狼来了”的规则会被静默,那时它就不是真正的覆盖了。修复方法是将范围缩小到私钥和凭证文件,而不是整个 `.ssh` 文件夹。 **已失效(BROKEN),T1105(使用 wget 下载工具,Linux)。** 该规则依赖于以 `/wget` 结尾的进程映像。但是当攻击者运行 `bash -c "wget http://.../tool"` 时,记录的进程映像是 `/bin/bash`,而 `wget` 仅出现在命令行中。该规则查找了错误的字段,因此永远不会触发。你还会发誓你已经覆盖了它。修复方法是匹配命令行,而不是映像。参见 [rules/linux_wget_ingress.yml](rules/linux_wget_ingress.yml)。 **已失效(BROKEN),T1003.001(LSASS 凭证转储,Windows)。** 该规则依赖于文件名 `procdump.exe`。将工具重命名为 `p64.exe` 的攻击者会直接绕过它。修复方法是匹配 Sysmon 在重命名后仍会报告的原始文件名,或者是针对 LSASS 的访问本身。参见 [rules/win_lsass_dump.yml](rules/win_lsass_dump.yml)。这种重命名二进制文件的技巧是真实检测被绕过的最常见方式之一。 这三点正是覆盖率热力图所掩盖、而这个实验室所揭示的问题。 ## 将检测视为代码:在 CI 中捕获回归 第一次运行会记录今天已证实的 `baseline.json`。此后: ``` python3 demo/run_demo.py --gate ``` 如果任何曾经被证实的技术停止被证实,程序将会以非零退出代码失败。将其接入 CI(参见 [.github/workflows/detections-ci.yml](.github/workflows/detections-ci.yml)),一个悄悄破坏检测的 pull request 会导致构建失败,就像损坏的单元测试一样。规则会随着时间的推移而发生偏移;这可以防止这种偏移悄无声息地发生。 ``` $ python3 demo/run_demo.py --gate # after someone breaks a rule DETECTION REGRESSION: these techniques were proven and no longer are: - T1059.004: PROVEN -> BROKEN A rule stopped catching an attack it used to catch. Failing the build. ``` ## 工作原理 ``` rules/*.yml real Sigma detection rules emulation/attacks/* attacker techniques as log events (rule must fire) emulation/benign/* normal activity as log events (rule must stay quiet) │ ▼ engine/sigma.py a small Sigma engine: log source match, field modifiers (contains/startswith/endswith/re), and/or/not conditions, count() aggregation │ ▼ engine/prover.py fire test + quiet test -> PROVEN / NOISY / BROKEN │ ▼ engine/report.py console + Markdown + HTML engine/navigator.py MITRE ATT&CK Navigator layer (color coded) ``` 一切都是磁盘上的普通文件。打开任何规则即可查看逻辑,打开任何 `.jsonl` 即可查看正在测试的精确事件。没有任何隐藏内容。 ## 项目结构 ``` detection-engineering-lab/ ├── engine/ the Sigma engine, the prover, and the reporters (pure stdlib) ├── rules/ 13 real Sigma rules across Linux, Windows, cloud, network ├── emulation/ │ ├── attacks/ one attacker scenario per technique │ ├── benign/ normal Linux, Windows, cloud, and network activity │ └── manifest.yml maps scenario -> technique -> the rule that should catch it ├── demo/run_demo.py the offline demo and the CI gate ├── tests/ tests that run with the standard library ├── infra/ the full lab: real Splunk + cross-platform ingest + a self-contained option ├── .github/workflows/ detections-as-code CI gate └── baseline.json what is proven today (used by the CI gate) ``` ## 想要体验真实环境?(Splunk,支持任何操作系统) 演示使用了实验室自身的微型引擎,因此可以在任何地方运行。如果你想要一个真实的 SIEM,`infra/` 会启动 **Docker 中的 Splunk**(Windows、macOS 或 Linux),并且设计上是开放的:Splunk 是核心枢纽,任何可以与其 HTTP Event Collector 或 forwarder 通信的内容都可以向其输入数据。有两种运行方式: ``` make infra-up # Splunk only: point your own hosts at it (Windows Sysmon, Linux auditd, CloudTrail, Zeek) make infra-selfcontained # Splunk plus a container that streams the lab's events in, no extra host needed make infra-verify # one command to confirm it is up and accepting events make infra-down # stop and wipe ``` 接下来,你可以使用 `sigma-cli` 将 Sigma 规则转换为 Splunk 搜索,在 Windows 或 Linux 主机上运行真实的 [Atomic Red Team](https://github.com/redcanaryco/atomic-red-team) 技术,并导入 ATT&CK Navigator 层。完整的跨平台步骤请参见 [infra/README.md](infra/README.md)。 简而言之:**演示**在几秒钟内无需安装即可验证概念;**完整的实验室**更接近真实的 SOC,并且可以在你拥有的任何机器上运行。 ## 诚实的局限性 - 模拟的事件是为了贴近真实而手工编写的,并非从实时主机捕获。`infra/` 中的完整实验室才是你引入真实遥测数据的地方。 - 内置的 Sigma 引擎支持常见的规则特性,但并非支持所有的 Sigma 选项。在生产环境中,你需要将规则转换为你的 SIEM 格式并让 SIEM 运行它们;这个引擎的存在只是为了让演示能够在零设置的情况下验证这个概念。 - 这里的 Windows 检测是在离线状态下编写和测试的。要向它们输入真实的 Windows 遥测数据,你需要一台运行 Sysmon 的 Windows 主机。在 Apple Silicon 上,添加一台的最简洁方式是使用一个小型的云端 Windows 机器,而不是本地 VM。 - 这证明了一条规则可以抵御已知的攻击。它不能保证一条规则能捕获该攻击的所有变种。它提高了防御下限,但并非防御上限。 ## 技术 Python 3(演示和测试仅使用标准库)、Sigma 规则格式、MITRE ATT&CK 和 Navigator、Sysmon 和 Zeek 日志格式、用于完整实验室的 Splunk 和 Atomic Red Team,以及用于 CI 门禁的 GitHub Actions。支持在 Windows、macOS 和 Linux 上运行。
标签:Cloudflare, MITRE ATT&CK, OpenCanary, Sigma规则, 安全助手, 安全运营, 开源框架, 扫描框架, 持续集成, 目标导入, 网络信息收集, 请求拦截, 逆向工具