SMC17/sovereign-offense-harness

GitHub: SMC17/sovereign-offense-harness

一款以单一 Zig 二进制交付的轻量级对手模拟运行器,执行 TTP 测试并生成带哈希的结构化审计信封,为注重数据主权的小型紫队团队提供可组合的基础组件。

Stars: 1 | Forks: 0

# sovereign-offense-harness [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/0306578a55103007.svg)](https://github.com/SMC17/sovereign-offense-harness/actions/workflows/ci.yml) [![Release](https://img.shields.io/github/v/release/SMC17/sovereign-offense-harness?display_name=tag&sort=semver)](https://github.com/SMC17/sovereign-offense-harness/releases) [![License](https://img.shields.io/github/license/SMC17/sovereign-offense-harness)](LICENSE) [![License: AGPL-3.0-or-later](https://img.shields.io/badge/License-AGPL--3.0--or--later-blue.svg)](LICENSE) [![Zig 0.16](https://img.shields.io/badge/Zig-0.16-orange.svg)](https://ziglang.org/) [Sovereign Stack](https://stax.dev/sovereign-stack) 的一部分。是 [`sentinel-sbom`](https://github.com/SMC17/sentinel-sbom) 和 [`sovereign-edge`](https://github.com/SMC17/sovereign-edge) 的 配套项目。 ## 为什么会有这个项目 业内知名的对手模拟产品 —— AttackIQ、SafeBreach、XBOW、 MITRE Caldera、Red Canary 的 Atomic Red Team —— 解决的问题 与本项目大相径庭,其规模也完全不同。 - **Atomic Red Team** 是一个包含约 1,500+ 原子测试的*库*,并提供 PowerShell + 跨平台运行器。如果你需要全面的技术覆盖, 请使用 Atomic Red Team。本项目的 v0.3 版本可以通过 `--art` 标志读取 ART 的 YAML schema(实验性 —— 仅支持 bash/sh 执行器); 它并不替代 ART 的运行器。 - **MITRE Caldera** 是一个完整的代理编排框架:包含服务器、 代理、对手 playbook 和规划器。如果你需要多主机 编排,请使用 Caldera。 - **AttackIQ / SafeBreach** 是商业平台,拥有专有的 TTP 库、ML 评分和企业级 UI。如果你有 预算并希望获得 SOC 级别的报告,请使用它们。 本项目做的那些狭窄而具体的事情是其他产品没有的:在每次运行 TTP 时发出一个 *确定性结构*的 JSON envelope,封装在一个便于审计的单一 Zig 二进制文件中,除了构建时的 Zig 和运行时的 `bash` 之外,没有任何代理、服务器或运行时 依赖。当你正在构建一个小型、可审计的紫队飞轮,并且 希望运行器本身不会成为你供应链攻击面的一部分时,这会非常 有用。 它是一个基础组件,而不是一个平台。 ## 演示 ``` $ cat ttps/examples/t1082-system-information-discovery.json { "id": "T1082", "name": "System Information Discovery", "description": "Read /etc/os-release and uname output to fingerprint the host. MITRE ATT&CK T1082 — typically the first technique post-foothold.", "platforms": ["linux"], "exec": "uname -a; cat /etc/os-release 2>/dev/null || true", "expected": { "exit_code": 0, "stdout_contains": "Linux", "stdout_excludes": [] } } $ sovereign-offense-harness run --ttp ttps/examples/t1082-system-information-discovery.json [PASS] T1082: System Information Discovery envelope: envelopes/T1082-1778111282.json duration: 12ms exit=0 $ jq < envelopes/T1082-1778111282.json { "schema": "sovereign-offense-harness/envelope/v1", "ttp": { "id": "T1082", "name": "System Information Discovery", "exec": "uname -a; cat /etc/os-release 2>/dev/null || true" }, "execution": { "started_at_unix": 1778111282, "duration_ms": 12, "exit_code": 0, "stdout_bytes": 480, "stderr_bytes": 0, "stdout_sha256": "10f0d0d7b016cd94ab0d877015448ea88ad8cc1d7d7edbe2365b33cdef9c0afa", "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }, "host": { "hostname": "edge" }, "verdict": "PASS" } ``` ## 真实对比 | | sovereign-offense-harness | Atomic Red Team | MITRE Caldera | AttackIQ | |---|---|---|---|---| | 目前的定位 | 小型 TTP 运行器 + envelope 写入器 | TTP 库 + 跨平台运行器 | 完整的代理编排框架 | 企业级平台 | | TTP 库大小 | 2 个示例 TTP | ~1,500+ 原子操作 | ~600 个 abilities | 专有,未公开 | | 运行时形态 | 单一 Zig 二进制文件 | PowerShell + 跨平台运行器;库本身是 YAML/JSON | 服务器 + 代理 + UI | 托管 SaaS + 代理 | | 多主机编排 | 无 | 手动(在每台主机上运行) | 支持(内置代理框架) | 支持 | | 自带 TTPs | 支持(JSON 描述符) | 支持(其自身的 schema) | 支持(abilities) | 大多为专有库 | | 检测 / 蓝队集成 | envelope JSON 由你自己的流水线消费 | 无内置 | 报告 + 标签 | 企业级报告 | | 开源协议 | AGPL | MIT | Apache 2.0 | 专有 | | 成熟度 | v0.3,1 位作者,约 4 天的工作量 | 成熟,庞大的社区 | 成熟,MITRE 支持 | 成熟的商业产品 | | 单一二进制供应链 | 是(Zig 二进制文件,无第三方运行时) | 否(需要 PowerShell 或运行器工具链) | 否(Python + Go + UI) | 不适用(云端) | **目前的适用场景**:一个小型团队希望在隔离的实验室中运行少量 TTP,并捕获便于审计的 JSON envelope 供 蓝队评分。主要是一个构建块,而不是成品。 **不适用的场景**:任何需要广泛 TTP 覆盖、 多主机编排、代理框架或商业报告的场景 —— 请分别使用 Atomic Red Team、Caldera 或商业平台。 ## 状态 — 已验证与未验证的内容 `v0.3.0` — 单一作者,约 4 天的工作量。约 1160 行 Zig 代码。 已可用的功能: - `zig build` + `zig build test` 绿灯通过;18 个单元测试(TTP 解析器、 missing-id 拒绝、YAML 子集解析器、ART 适配器,以及一个端到端 的 ART 适配器测试)。 - 读取 JSON TTP 描述符,通过 `bash -c` 执行,捕获 stdout/stderr/exit/duration,使用 SHA-256 哈希每个数据流, 并将 JSON envelope 写入磁盘。 - 原生 JSON 格式中附带了两个示例 TTP,均特意设计为 只读枚举(T1018 `ip neigh show`,T1082 `uname -a`)。 - 在 `ttps/examples/art-t1082-system-info.yml` 中附带了一个 ART 原子示例。 - **v0.2 安全门**:除非 `--target ` 匹配 `~/sentinel-lab/lab-targets.txt` 中的白名单 CIDR/IP,或者 传入了 `--unsafe-local`,否则 `run` 将被拒绝。白名单支持 IPv4 CIDR + 裸 IP, 允许空行和 `#` 注释。拒绝时以退出码 3 退出并附带拒绝消息。 这同样适用于 `--art` 运行 —— 没有绕过的途径。 - **v0.3 `--art` 模式(实验性)**:树内最小化 YAML 子集 解析器(块映射/序列、纯文本/带引号标量、`|` 文字 块、`#` 注释、缩进跟踪嵌套 —— 不支持锚点、标签、flow 样式、多文档或制表符)以及一个 ART → Ttp 适配器。支持 `attack_technique`、`atomic_tests[]`、`supported_platforms`、 `input_arguments..default` 替换到 `#{var}` 中,以及 仅限 bash/sh 的 `executor.{command,name}`。选择器:`--art-test first`(默认)、`--art-test index:N`、`--art-test name:`。 尚不可用的功能: - **`--art` 是实验性的,并且对上述 YAML 子集是只读的。** 锚点、标签、flow 样式的 YAML、多文档流和制表符将被 拒绝。PowerShell / `command_prompt` 执行器会被拒绝 (返回 `UnsupportedExecutor`)而不是被静默错误执行。 `cleanup_command`、`dependencies` 和 `dependency_executor_name` 将被 忽略 —— 依赖前置条件的原子操作将在 shell 执行时报错。v0.4 计划推出 `--check-deps` 模式。 - **没有 envelope schema 验证器** —— envelope 中的 schema URI 是 写入器放入的任何内容。没有 schema 强制执行,除了“这是否是有效的 JSON”之外, 消费者端也没有验证器。 - **没有多主机编排** —— 明确超出了范围。 - **没有检测工程输出** —— Sigma 规则生成和 Velociraptor artifact 存根计划在 v0.4 推出。 - **没有“本地 LLM TTP 规划器”** —— 那是 v0.5+ 的画饼(vaporware); 没有设计,没有集成,没有可运行的代码。 - **白名单中的 IPv6** —— v0.3 仍然仅支持 IPv4。 路线图详见 [STATUS.md](STATUS.md)。请将版本号视为规划 标签,而非承诺。 ## 安装 ``` git clone https://github.com/SMC17/sovereign-offense-harness cd sovereign-offense-harness zig build # produces ./zig-out/bin/sovereign-offense-harness ``` ## 使用 ``` # 验证原生 TTP descriptor 的结构 sovereign-offense-harness validate ttps/examples/t1018-remote-system-discovery.json # 运行原生 TTP — 将 envelope 输出至 envelopes/-.json sovereign-offense-harness run --unsafe-local \ --ttp ttps/examples/t1082-system-information-discovery.json # 自定义输出目录 sovereign-offense-harness run --unsafe-local \ --ttp my-ttp.json --out /var/lib/sentinel-lab/envelopes # v0.3 实验性 — 运行 Atomic Red Team atomic-test YAML。 # 与 --ttp 互斥。适用相同的安全门控。 sovereign-offense-harness run --unsafe-local \ --art ttps/examples/art-t1082-system-info.yml # 在 YAML 中选择特定的 atomic test(默认为第一个): sovereign-offense-harness run --unsafe-local --art file.yml \ --art-test 'name:System Information Discovery — Linux uname / os-release' sovereign-offense-harness run --unsafe-local --art file.yml --art-test index:1 ``` ## ⚠️ 安全须知 —— 运行前必读 TTP 的 `exec` 字段以调用用户身份通过 `bash -c` 运行。这里 没有沙箱。v0.2 增加了一个**默认拒绝的操作员失误门控**: 每次 `run` 都必须通过 `--target `(经白名单检查)或 `--unsafe-local` 显式确认目标。 **这是一个防误触门控,而不是对手门控。** 它能拦截 对错误主机的误操作 `run`;但它不会阻止 执意要运行不安全 TTP 的操作员 —— `--unsafe-local` 仅需添加 一个标志。诚实的说法是:它让失误变得显眼,而这种 显眼正是其目的。参见 [`THREAT_MODEL.md`](THREAT_MODEL.md)。 两种确认途径: 1. **`--target `** —— 在远程主机上运行。该 IP 必须在 实验室目标白名单文件中(默认为 `~/sentinel-lab/lab-targets.txt`,可通过 `--lab-targets ` 覆盖)。白名单支持 IPv4 CIDR 表示法和裸 IP; 空行和 `#` 注释将被忽略。目标 IP 会作为 `$TARGET` 暴露给 TTP,因此描述符可以编写 `ssh "$TARGET" ...` 的模式。 2. **`--unsafe-local`** —— 显式地在本地主机上运行。该 标志的名称本身就是警告:运行器会毫不犹豫地以调用用户身份执行 `exec`,且无法回滚。仅在 只读冒烟测试(附带的示例 T1018、T1082)或一次 性容器中使用。 如果没有提供这些标志之一,`run` 将以退出码 3 退出并显示拒绝消息。 ``` $ sovereign-offense-harness run --ttp examples/t1082.json error: refused by safety gate. … (exits 3) $ sovereign-offense-harness run --unsafe-local --ttp examples/t1082.json [PASS] T1082: System Information Discovery envelope: envelopes/T1082-…json duration: 11ms exit=0 ``` 白名单文件格式: ``` # ~/sentinel-lab/lab-targets.txt # IPv4 CIDR 或裸 IP;每行一个;支持 #-comments 和空行。 10.0.0.0/24 192.168.99.42 ``` 其他安全指引: - 在运行之前阅读每个 TTP 的 `exec` 行。附带的 示例是特意设计的只读枚举;其他内容并不 隐含安全。 - 绝不要在生产环境中运行此工具。绝不。 - 不要将随机的 TTP 描述符从互联网通过管道输入此工具,就像 你不会把陌生人的 bash 脚本通过管道传递给 `sudo bash` 一样。 - **不要在 TTP 描述符的 `exec` 行中嵌入凭据。** 字面 `exec` 字符串将被原样捕获到 envelope JSON 中。 请使用环境变量(运行器已经暴露了 `$TARGET` —— 其他秘密也以同样的方式传递)。envelope 是取证 证据,而不是秘密存储库。 - **envelope 会以明文形式写入主机的 `hostname`。** 对于 防御实验室 / 私有目标的工作,请将 envelope 视为 会暴露主机名的工件。`--anonymize` 标志已列入 v0.4 路线图。 - **`--art` 默认运行文件中的第一个原子操作。** ART 文件 通常包含具有截然不同风险特征的多个变体。运行器在运行前 会将选定的原子操作 + 替换后的 exec 行回显到 stderr,因此你会看到 即将发生什么 —— 但请先阅读 YAML,并在文件包含 多个原子操作时显式传递 `--art-test `。 如果你现在需要一个久经沙场的对手模拟工具,请使用 Atomic Red Team 或 MITRE Caldera。这是一个处于 v0.2 阶段的个人项目;安全性设计尚算合理,但 TTP 库只有 两个示例。 ## 路线图 - **v0.2** ✅ 已发布 —— sentinel-lab 集成:目标白名单 (除非是实验室 IP 否则默认拒绝)、`--unsafe-local` 确认标志、 拒绝时以退出码 3 退出。 - **v0.3** ✅ 已发布(实验性) —— Atomic Red Team YAML 适配器: 树内最小化 YAML 子集解析器 + ART → Ttp 适配器,`--art` / `--art-test` 标志,仅限 bash/sh 执行器。批处理模式和 `--detect-only` 推迟到 v0.4。 - **v0.4** —— 从缺口中生成 Sigma 规则 + Velociraptor artifact; envelope schema 验证器和消费者端检查器;ART 批处理模式 + `--check-deps`。 - **v0.5+** —— 本地 LLM TTP 规划器(通过 shell 调用 Ollama / vLLM,为目标 资产清单选择 TTPs,发出可重放的 plan envelope)。 - **v1.0** —— 完整的 ATT&CK 覆盖,CI 矩阵,符合国防采购要求的 参考部署。 ## 为什么构建它 2026 年的对手模拟是一个 SaaS 市场。AttackIQ、SafeBreach、XBOW 均按代理、按月、按环境收费。运行 TTP 并 捕获结果的实际技术*门槛很低 —— 不到 500 行 Zig 代码。大厂商的定价反映了打包 + 编排 + 分析师 UI 的成本,而不是底层技术。 如果你是一个注重主权、运行小型紫队飞轮的团队 —— 防御实验室、受欧盟监管的金融机构、受监管的医疗领域、大学 研究 —— 你不需要 SaaS。你需要的是一个紧凑的二进制文件,能够 运行确定性测试、捕获结构化证据,并与现有的 检测工程流水线组合使用。 这就是本项目。 ## 许可证 AGPL-3.0-or-later。详见 [LICENSE](LICENSE)。 ## 贡献 详见 [CONTRIBUTING.md](CONTRIBUTING.md)。要求使用签名提交。 安全披露:[SECURITY.md](SECURITY.md)。 ## Sovereign Stack 的一部分 这是更广泛的“不租用,自己运行”基础设施集合中的一环。 - [**sovereign-edge**](https://github.com/SMC17/sovereign-edge) —— 将 Cloudflare 级别的边缘捆绑包作为可组合的 NixOS 模块提供 - [**sentinel-sbom**](https://github.com/SMC17/sentinel-sbom) —— Nix `flake.lock` → SPDX SBOM,带有树内 narHash 验证 完整项目组合请参见 [github.com/SMC17](https://github.com/SMC17)。
标签:Atomic Red Team, EDR验证, Homebrew安装, JSON封装, MITRE Caldera, Sovereign Stack, TTP执行器, Zig语言, 安全合规, 安全工具集合, 安全测试, 对手模拟, 应用安全, 攻击性安全, 数据展示, 数据泄露检测, 紫队, 紫队框架, 红队, 网络代理, 网络靶场