febrezo/spuc

GitHub: febrezo/spuc

SPUC 是一个用 Rust 编写的 STIX 2.1 模式解析与多引擎检测规则转换工具,解决了威胁情报在不同安全平台间难以复用的问题。

Stars: 1 | Forks: 0

# SPUC(STIX 通用模式转换器) SPUC 是一个 Rust CLI 工具,用于解析 STIX 2.1 模式,将其规范化为 IR,并输出适用于 EQL、KQL、Sigma、Snort、Suricata 和 YARA 的检测内容。 当 `sigma` 可用时,SPUC 还会自动发现兼容的 Sigma 后端,并将其暴露为 `sigma-to-<后端>` 目标。 ``` flowchart LR A[STIX Pattern] --> B[Parser] B --> C[AST] C --> D[Normalize] D --> E[IR] E --> F[Verify Command] E --> G[Translate Command] E --> H[Emulate Command] E --> I[Plan Command] G --> J[EQL/KQL/Sigma/Snort/Suricata/YARA] J --> K[sigma-to-] H --> L[spuc-agent/bash/powershell/atomic-red-team/mitre-caldera] I --> M[Intrusion Set Artifacts] N[Catalog Cache] <--> G N <--> H O[Web/TUI] --> N O --> G O --> H O --> I classDef core fill:#edf4ff,stroke:#3b82f6,stroke-width:2px,color:#1e3a8a classDef command fill:#eafaf0,stroke:#16a34a,stroke-width:2px,color:#166534 classDef outputs fill:#fff8eb,stroke:#d97706,stroke-width:2px,color:#9a3412 classDef storage fill:#f1f5f9,stroke:#64748b,stroke-width:2px,color:#334155 classDef ui fill:#f5f3ff,stroke:#7c3aed,stroke-width:2px,color:#4c1d95 class B,C,D,E core class F,G,H,I command class J,K,L,M outputs class N storage class O ui ``` ## 状态 - 解析器:使用 `pest` 语法的 STIX 风格表达式解析。 - 规范化:AST 到 IR(`IrExpr`、`IrPredicate`)的转换,包含语义验证。 - 发射器: - EQL 和 KQL,用于终端/EDR 风格的狩猎查询。 - Sigma,用于 SIEM 风格的检测。 - Snort 和 Suricata,用于 IDS 网络签名。 - YARA,用于内容/恶意软件风格的签名。 ## STIX 范围 - 仅支持 STIX 2.1。 - 对象路径在发射器评分/转换之前进行验证。 ## 使用方法 ``` spuc translate --rule "[ipv4-addr:value = '127.0.0.1']" --to sigma --to eql --to kql spuc translate --rule "[network-traffic:src_ref.value = '10.0.0.5'] AND [network-traffic:dst_port = 443]" --to snort --to suricata spuc translate --rule "([process:name = 'cmd.exe'] FOLLOWEDBY [process:name = 'powershell.exe']) WITHIN 300 SECONDS" --to eql spuc translate --rule "[ipv4-addr:value ISSUBSET '198.51.100.0/24']" --to sigma --to eql --to kql --rule-confidence 80 spuc translate --rule "[process:name = 'cmd.exe']" --to sigma --output ./exports --export csv spuc emulate --rule "[process:command_line MATCHES '^.*echo.*$']" --to spuc-agent --output ./artifacts spuc emulate --rule "[process:command_line MATCHES '^.*echo.*$']" --to spuc-agent --output ./artifacts --export csv spuc emulate --rule "[process:command_line MATCHES '^.*echo.*$']" --to atomic-red-team --to mitre-caldera --output ./artifacts spuc emulate --rule "[process:command_line MATCHES '^.*echo.*$']" --to spuc-agent --refresh spuc sigma status spuc sigma list-targets spuc sigma update-config spuc --version spuc version ``` 行为说明: - `translate` 仅输出翻译结果。 - `emulate` 仅输出仿真结果。 - 两个命令始终在后台运行双流程更新,用于目录可转换性(翻译 + 仿真矩阵),按规范化的 `rule_hash` + 引擎版本进行缓存。 - 使用 `--refresh` 强制重新计算缓存。 ## 简易 Linux 设置(两种模式) 根据你的目标选择以下两种方式之一。 ### 1)用户模式(手动下载最新发布版) 如果你只想运行 SPUC,请使用此方式。 1. 打开此仓库的 GitHub Releases 页面。 2. 下载适用于你架构的最新 Linux 资源。 - 典型名称:`spuc-vX.Y.Z-x86_64-unknown-linux-gnu.tar.gz`(或 `.zip`)。 - 桌面支持的构建目标在同一压缩包中包含 `spuc-gui`、`spuc` 和 `spuc-agent`。 - 当前仅 CLI 的目标仍为 `x86_64-unknown-linux-musl` 和 `armv7-unknown-linux-gnueabihf`。 3. 解压压缩包。 4. 将二进制文件安装到你的个人 Linux 路径: ``` mkdir -p "$HOME/.local/bin" install -m 0755 ./spuc "$HOME/.local/bin/spuc" # 如果归档中存在可选的桌面二进制文件 if [ -f ./spuc-gui ]; then install -m 0755 ./spuc-gui "$HOME/.local/bin/spuc-gui" fi ``` 5. 确保你的 shell 能找到该目录: ``` grep -q 'HOME/.local/bin' "$HOME/.bashrc" || echo 'export PATH="$HOME/.local/bin:$PATH"' >> "$HOME/.bashrc" source "$HOME/.bashrc" ``` 6. 验证安装: ``` spuc --version ``` 可选的全系统安装(所有用户): ``` sudo install -m 0755 ./spuc /usr/local/bin/spuc sudo install -m 0755 ./spuc-gui /usr/local/bin/spuc-gui # if available ``` ### 2)开发模式(更新源码 + 编译) 如果你正在修改 SPUC 并希望在拉取更改后获得最新的二进制文件,请使用此方式。 1. 获取最新源码: ``` git pull --ff-only ``` 2. 构建发布版二进制文件: ``` cargo build --release -p spuc-cli --bin spuc cargo build --release -p spuc-gui ``` 3. 将编译好的二进制文件安装到你的 Linux 路径: ``` mkdir -p "$HOME/.local/bin" install -m 0755 ./target/release/spuc "$HOME/.local/bin/spuc" install -m 0755 ./target/release/spuc-gui "$HOME/.local/bin/spuc-gui" ``` 4. 验证: ``` spuc --version spuc-gui --version ``` ``` flowchart LR A[git pull --ff-only] --> B[cargo build --release] B --> C[target/release/spuc + spuc-gui] C --> D[install to ~/.local/bin] D --> E[spuc --version] D --> F[spuc-gui] ``` ## CLI 帮助示例 ``` $ spuc help Usage: spuc [COMMAND] Commands: emulate jsonrpc translate verify version sigma web help ``` ## 测试 ``` cargo test cargo test -p spuc-core cargo test -p spuc-cli ``` ## Docker + Compose 仓库包含一个面向生产的 `Dockerfile` 以及根目录的 `docker-compose.yml`。 该镜像构建 `spuc` 和 `spuc-agent`,将 SPUC 状态持久化到 `/data`,并安装 `sigma` 及示例后端插件: - `pysigma-backend-splunk` - `pysigma-backend-elasticsearch`(ES|QL 支持) - `pysigma-backend-crowdstrike`(LogScale) - `pysigma-backend-secops`(Chronicle / Google SecOps) SPUC 在首次运行时探测一次 `sigma`,将运行时结果持久化到配置缓存,后续启动时复用该缓存。 使用 `spuc sigma update-config` 强制重新进行运行时发现并覆盖缓存的 Sigma 配置。 快速开始: ``` cp .env.example .env docker compose up --build ``` 直接从 GitHub Container Registry 运行: ``` docker pull ghcr.io/febrezo/spuc:latest docker run --rm -p 8090:8090 \ -e SPUC_CONFIG_DIR=/data \ -v spuc_data:/data \ ghcr.io/febrezo/spuc:latest \ web --host 0.0.0.0 --port 8090 --admin-user admin --admin-password '' --no-open ``` 部署指南: - [部署指南](docs/deployment.md):Docker/Compose 部署流程、持久化模型以及每个 `.env` 变量的说明。 默认 Compose 行为: - 在宿主机上发布 `127.0.0.1:8090` - 运行 `spuc web --host 0.0.0.0 --port 8090 --no-open` - 将 Web 用户、目录、入侵集和运行时缓存存储在命名卷 `spuc_data` 中 - 通过 `SPUC_WEB_GOOGLE_*` 和 `SPUC_WEB_GITHUB_*` 支持可选的 OAuth 引导 - 通过 `SIGMA_RPC_URL` 和 `SPUC_SIGMA_RPC_TOKEN` 支持可选的远程 Sigma JSON-RPC - 通过 `SPUC_ADMIN_API_TOKEN` 支持可选的连接器引导 引导管理员凭据来自 `.env`: - `SPUC_ADMIN_USER` - `SPUC_ADMIN_PASSWORD` 对于容器化连接器,设置 `SPUC_ADMIN_API_TOKEN` 以在启动时预配固定的管理员 API 令牌。SPUC 仅在 `/data/web_user_api_tokens.json` 中持久化令牌哈希;在重启时更新环境值会更新同一引导令牌记录,移除该变量则会撤销该环境管理的令牌。 ## Web 界面 - `spuc` 由 `spuc-cli` crate 提供,运行当前 CLI,包括 `spuc web`。 - `spuc web` 默认绑定到 `127.0.0.1`,支持 `--host` 用于显式更改绑定(如容器场景),支持 `--no-login`,默认打开系统浏览器,支持 `--no-open` 用于 sidecar/嵌入式用途,并暴露 `GET /healthz`。 - `spuc-gui` 是一个独立的 Tauri 应用,标题为 `SPUC: A behavioural IOC mapping lab`,它在可用的 localhost 端口上以 sidecar 方式启动 `spuc web --no-login --no-open`,在 sidecar 就绪时显示本地 SPUC 加载画面,然后在原生窗口中加载本地 URL。 - 桌面支持目标的 GitHub 发布压缩包现在将 `spuc`、`spuc-agent` 和 `spuc-gui` 一起打包在同一个版本化资源中。 - `spuc-gui` 使用 `SPUC_LOCALE`、`LC_ALL`、`LC_MESSAGES` 或 `LANG` 在启动时选择原生窗口标题语言,并将默认区域设置传递给嵌入式 Web UI;浏览器模式在无已保存语言偏好时使用浏览器语言。 - 在 `spuc-gui` 中,外部链接(`https://...`、`mailto:`)在系统浏览器中打开,而本地 SPUC 路由保留在 GUI 窗口内。 - 如果 `spuc-gui` 无法启动 `spuc` sidecar,它会以清晰的错误退出。先用 `cargo build -p spuc-cli --bin spuc` 构建 `spuc`,将两个二进制文件放在一起,将 `spuc` 放入 `PATH`,或设置 `SPUC_SERVER_BIN=/path/to/spuc`。 - Linux 桌面前置条件:安装 WebKitGTK、JavaScriptCoreGTK、GTK 和 GLib 开发包。在 Fedora 上:`sudo dnf install glib2-devel gtk3-devel webkit2gtk4.1-devel javascriptcoregtk4.1-devel libappindicator-gtk3-devel librsvg2-devel libxdo-devel pkgconf-pkg-config`。在 Ubuntu/WSL 上:安装 `libwebkit2gtk-4.1-dev`、`libjavascriptcoregtk-4.1-dev`、`libgtk-3-dev`、`libglib2.0-dev`、`libappindicator3-dev`、`librsvg2-dev`、`libxdo-dev` 和 `pkg-config`。 - `spuc web --host 127.0.0.1 --port 8090 --admin-user admin --admin-password ` 在 localhost 上启动本地化 Web UI。 - `spuc web --no-login` 隐藏基于凭据的登录,使用刻意设计的两阶段本地启动:UI 首先显示带品牌的 SPUC 展示入口,包含明确的 `Enter SPUC` / `Entrar en SPUC` 操作,然后以本地管理员身份打开应用外壳,隐藏注销功能,同时保留 `Settings` 用于本地管理。 - 如果省略 `--admin-password`,SPUC 会生成一个 25 字符的密码并在启动日志中打印。 - 认证支持持久化在 `/web_users.json` 中的本地用户/密码账户。 - 用户 STIX 源设置默认支持本地目录,以及可选的每用户 OpenCTI GraphQL 配置。保存的 OpenCTI API 密钥永远不会返回给前端,OpenCTI 故障时回退到本地目录。 - Google/GitHub OAuth 登录支持通过环境变量配置的授权码回调流程(`SPUC_WEB_GOOGLE_CLIENT_ID`、`SPUC_WEB_GOOGLE_CLIENT_SECRET`、`SPUC_WEB_GOOGLE_REDIRECT_URI`、`SPUC_WEB_GITHUB_CLIENT_ID`、`SPUC_WEB_GITHUB_CLIENT_SECRET`、`SPUC_WEB_GITHUB_REDIRECT_URI`)。 - 典型的本地回调 URI 为 `http://127.0.0.1:8090/api/login/oauth/google/callback` 和 `http://127.0.0.1:8090/api/login/oauth/github/callback`。 - 在 `Settings` 中,管理员可以按提供商显式授权/禁用 Google 和 GitHub 登录;此策略持久化在 `/web_oauth_policy.json` 中,并在登录时强制执行。 - `Settings` 还集中管理每用户的主题/语言/显示名称偏好,以及仅管理员可配置的主题/语言默认值、Sigma 服务器连接和本地用户/密码管理。 - 登录/启动画面居中显示,包含品牌标志/标题/副标题以及多行页脚归属信息(coded-with-love by febrezo、GitHub 项目、许可证)。 - Web UI 仅支持英语和西班牙语本地化。CLI 和 JSON-RPC 保持不变。 ### 应用主页截图 ![SPUC 应用主页](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/ada78f85e3211613.png) ## JSON-RPC 快速检查 ``` spuc jsonrpc --port 8080 curl -X POST 'http://127.0.0.1:8080/rpc' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ --data-raw "{\"rule\":\"[ipv4-addr:value = '1.1.1.1']\",\"to\":[\"sigma\"]}" ``` ## MCP 集成 SPUC 可以通过一个小型 MCP 适配器暴露给 AI 系统,该适配器调用 `spuc jsonrpc`。 参见 [`docs/mcp.md`](docs/mcp.md),内容包括: - 实用的架构选项(stdio 适配器和 HTTP 桥接) - 最小 MCP 工具契约 - 本地和容器化部署的注意事项 ## 源码布局 ``` flowchart TB R[src] R --> C1[core: parser/ast/ir/normalize/emitters] R --> C2[domain: catalog + emulation domain] R --> C3[app: runtime services and orchestration] R --> C4[commands: CLI adapters] R --> C5[web: HTTP + localized UI] R --> C6[tui: interactive terminal workflows] R --> C7[ui: terminal rendering helpers] W[crates/spuc-cli] --> C4 W --> C3 G[crates/spuc-gui] --> C5 ``` - 仓库根包 `spuc-core`:可复用的核心库包(`lib` 名称 `spuc`,入口位于 `src/lib.rs`) - `crates/spuc-cli/`:`spuc` 和 `spuc-agent` 二进制文件 - `crates/spuc-gui/`:Tauri 桌面应用(`spuc-gui`),管理 `spuc web` sidecar 生命周期 - `src/core/`:技术核心命名空间(`ast`、`ir`、`parser`、`normalize`、`emitters`) - `src/domain/`:产品领域命名空间(`catalog`、仿真相关集成点) - `src/app/`:应用运行器和共享服务/用例(`run`、`services/*`) - `src/commands/`:CLI 命令适配器(委托给共享的应用/领域逻辑) - `src/tui/`:交互式控制台逻辑 - `src/ui/`:共享终端样式和渲染辅助工具 - `src/web/`:本地化 Web UI、轻量级 HTTP 服务器和 Web API 适配器 ## 功能 - 参见 [`docs/abilities.md`](docs/abilities.md) 中的专用文档。 - 目录文档:[`docs/catalog.md`](docs/catalog.md)。 - 入侵集文档:[`docs/intrusion-sets.md`](docs/intrusion-sets.md)。 - JSON-RPC 文档:[`docs/jsonrpc.md`](docs/jsonrpc.md)。 - CI/CD 治理:[`docs/ci-cd.md`](docs/ci-cd.md)。 - MCP 集成:[`docs/mcp.md`](docs/mcp.md)。 ## CI/CD 流水线 此仓库已配置为在 GitHub Actions 中自动构建: - `.github/workflows/ci.yml` - 强制执行 `cargo fmt --check`、严格 clippy(`-D warnings`)以及默认 Rust 成员的测试、文档构建、包/发布预检、Docker 冒烟检查、JSON-RPC 集成测试、桌面 Linux 构建/测试和依赖安全审计。 - `.github/workflows/dependency-review.yml` - 阻止引入存在漏洞或违反策略的依赖变更的 PR。 - `.github/workflows/release.yml` - 为 Linux、macOS 和 Windows 构建 `spuc` 服务器二进制文件。 - 为桌面支持的发布目标构建 `spuc-gui` 二进制文件,并将其与 `spuc` 和 `spuc-agent` 打包到标准版本化压缩包中。 - 将 `x86_64-unknown-linux-musl` 和 `armv7-unknown-linux-gnueabihf` 保持为仅 CLI 资源,因为这些目标不支持桌面构建。 - 包含 Raspberry Pi 的 ARM 目标(`aarch64-unknown-linux-gnu` 和 `armv7-unknown-linux-gnueabihf`)以及 `x86_64-unknown-linux-musl`。 - 使用当前应用版本命名打包资源(`spuc-v-.tar.gz` / `.zip`)。 - 每次运行时上传构建产物。 - 在推送如 `v0.1.1` 之类的标签时自动发布 GitHub Release 资源和多架构 GHCR 容器镜像。 ## 开发命令 ``` # 构建服务器 CLI 二进制文件 (`spuc`) cargo build -p spuc-cli --bin spuc # 运行 Web 服务器模式 cargo run -p spuc-cli --bin spuc -- web --port 8090 --no-login cargo run -p spuc-cli --bin spuc -- web --port 8090 --no-login --no-open # 构建桌面应用 cargo build -p spuc-gui # 运行桌面应用(期望 `spuc` 位于 `spuc-gui` 旁边、在 PATH 中,或已设置 SPUC_SERVER_BIN) cargo run -p spuc-gui # 强制使用西班牙语原生窗口标题以进行本地 GUI 运行 SPUC_LOCALE=es cargo run -p spuc-gui ``` 发布流程: ``` git tag v0.1.1 git push origin v0.1.1 ``` ## 可用目标 - `eql` - `kql` - `sigma` - `snort` - `suricata` - `yara` - 动态目标:`sigma-to-<后端>`,用于从 `sigma plugin list` 发现的每个兼容后端(例如 `sigma-to-splunk`、`sigma-to-elasticsearch`、`sigma-to-loki`)。 使用以下检查命令: - `spuc sigma status` - `spuc sigma list-targets` ## 可用仿真目标 - `spuc-agent` - `bash` - `powershell` - `atomic-red-team` - `mitre-caldera` ## 语义保真状态 每次转换恰好返回一个运行时状态: - `exact`:目标语义和数据模型假设得到保留。 - `schema-dependent`:映射有效,但取决于后端字段 schema/配置文件。 - `backend-dependent`:映射取决于运行时/后端行为(正则表达式引擎、流水线、辅助语义)。 - `partial`:仅输出支持的子集;语义约束被明确省略/作为参考。 - `lossy`:存在相关转换,但语义有所降级。 - `unsupported`:当前基线中没有可用的真实映射。 置信度是独立且明确的: - `conversion_confidence`(`0..100`):SPUC 语义保真置信度。 - `rule_confidence`(`0..100`,可选):分析师/指标置信度,通过 `--rule-confidence` 指定。 `translate` 模式: - `--mode strict`(默认):如果所需的谓词无法忠实表示,输出为 `unsupported`。 - `--mode partial`:仅输出支持的子集,状态为 `partial`,省略部分会被注明。 ![转换保真度](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/e7627321b6211614.svg) ## 结果模型和 CSV 运行时输出将语义保真度和分析师置信度分开保存: - `runtime_status` - `conversion_confidence` - `rule_confidence` - `cause` - `summary` - `notes` - `output` CSV 列: - `input_rule,target,runtime_status,conversion_confidence,rule_confidence,cause,summary,notes,output` ## 覆盖矩阵 本节包含两个互补视图: 1. 观察操作符和限定符。 2. 可观察路径 + 比较操作符可用性。 重要说明:覆盖矩阵 = 可用性;运行时状态 = 真实语义保真度。 ### 1)观察操作符和限定符 | 发射器 | `FOLLOWEDBY` | `REPEATS` | `START ... STOP ...` | `WITHIN ... SECONDS` | | --- | --- | --- | --- | --- | | EQL | 通过 `sequence` 支持(适用基线限制) | 仅供参考(在注释中报告,状态降级为 `partial`) | 支持(`@timestamp` 过滤器) | 对 `FOLLOWEDBY` 通过 `sequence with maxspan` 支持;在普通 where 子句中仅供参考 | | KQL | 不支持 | 仅供参考(在注释中报告,状态降级为 `partial`) | 支持(`Timestamp` 过滤器) | 仅供参考(在注释中报告) | | Sigma | 不支持 | 仅供参考(在注释中报告,状态降级为 `partial`) | 不支持 | 不支持 | | Snort | 不支持 | 不支持 | 不支持 | 不支持 | | Suricata | 不支持 | 不支持 | 不支持 | 不支持 | | YARA | 不支持 | 不支持 | 不支持 | 不支持 | ### 2)可观察路径(比较操作符) 列和行按字母顺序排列。每个单元格显示该路径和发射器支持的比较操作符。 | 可观察路径 | EQL | KQL | Sigma | Snort | Suricata | YARA | | --- | --- | --- | --- | --- | --- | --- | | `artifact:hashes.MD5` | `= !=` | `= !=` | | | | | | `artifact:hashes.SHA-1` | `= !=` | `= !=` | | | | | | `artifact:hashes.SHA-256` | `= !=` | `= !=` | | | | | | `artifact:hashes.SHA-512` | `= !=` | `= !=` | | | | | | `artifact:hashes.SHA3-256` | `= !=` | `= !=` | | | | | | `artifact:hashes.SHA3-512` | `= !=` | `= !=` | | | | | | `artifact:hashes.SSDEEP` | `= !=` | `= !=` | | | | | | `artifact:hashes.TLSH` | `= !=` | `= !=` | | | | | | `artifact:mime_type` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | | | | | | `artifact:payload_bin` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | | `= != LIKE MATCHES` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | | `autonomous-system:name` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | | | | | `autonomous-system:number` | `= != > >= < <=` | `= != > >= < <=` | `= != > >= < <=` | | | | | `autonomous-system:rir` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | | | | | `directory:atime` | `= != > >= < <=` | `= != > >= < <=` | `= != > >= < <=` | | | | | `directory:ctime` | `= != > >= < <=` | `= != > >= < <=` | `= != > >= < <=` | | | | | `directory:mtime` | `= != > >= < <=` | `= != > >= < <=` | `= != > >= < <=` | | | | | `directory:path` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | | | | | `domain-name:value` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | `= LIKE MATCHES` | | | | | `email-message:body` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | `= LIKE MATCHES` | | | `= != LIKE MATCHES` | | `email-message:body_multipart[*].body_raw_ref.hashes.'MD5'` | `= !=` | `= !=` | `= !=` | | | `= !=` | | `email-message:body_multipart[*].body_raw_ref.hashes.'SHA-1'` | `= !=` | `= !=` | `= !=` | | | `= !=` | | `email-message:body_multipart[*].body_raw_ref.hashes.'SHA-256'` | `= !=` | `= !=` | `= !=` | | | `= !=` | | `email-message:body_multipart[*].body_raw_ref.hashes.'SHA-512'` | `= !=` | `= !=` | `= !=` | | | `= !=` | | `email-message:body_multipart[*].body_raw_ref.hashes.'SHA3-256'` | `= !=` | `= !=` | `= !=` | | | `= !=` | | `email-message:body_multipart[*].body_raw_ref.hashes.'SHA3-512'` | `= !=` | `= !=` | `= !=` | | | `= !=` | | `email-message:body_multipart[*].body_raw_ref.hashes.SSDEEP` | `= !=` | `= !=` | `= !=` | | | `= !=` | | `email-message:body_multipart[*].body_raw_ref.hashes.TLSH` | `= !=` | `= !=` | `= !=` | | | `= !=` | | `email-message:body_multipart[*].body_raw_ref.name` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | `= LIKE MATCHES` | | | `= != LIKE MATCHES` | | `email-message:from_ref.value` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | `= LIKE MATCHES` | | | `= != LIKE MATCHES` | | `email-message:sender_ref.value` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | `= LIKE MATCHES` | | | `= != LIKE MATCHES` | | `email-message:subject` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | `= LIKE MATCHES` | | | `= != LIKE MATCHES` | | `email-message:to_refs[*].value` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | `= LIKE MATCHES` | | | `= != LIKE MATCHES` | | `file:atime` | | | `= != > >= < <=` | | | | | `file:ctime` | | | `= != > >= < <=` | | | | | `file:hashes.MD5` | `= !=` | `= !=` | `= !=` | | | `= !=` | | `file:hashes.SHA-1` | `= !=` | `= !=` | `= !=` | | | `= !=` | | `file:hashes.SHA-256` | `= !=` | `= !=` | `= !=` | | | `= !=` | | `file:hashes.SHA-512` | `= !=` | `= !=` | `= !=` | | | | | `file:hashes.SHA3-256` | `= !=` | `= !=` | `= !=` | | | | | `file:hashes.SHA3-512` | `= !=` | `= !=` | `= !=` | | | | | `file:hashes.SSDEEP` | `= !=` | `= !=` | `= !=` | | | | | `file:hashes.TLSH` | `= !=` | `= !=` | `= !=` | | | | | `file:magic_number_hex` | | | | | | `= !=` | | `file:mtime` | | | `= != > >= < <=` | | | | | `file:name` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | | | | | `file:size` | `= != > >= < <=` | `= != > >= < <=` | `= != > >= < <=` | | | `= != > >= < <=` | | `ipv4-addr:value` | `= != LIKE MATCHES ISSUBSET` | `= != LIKE MATCHES ISSUBSET` | | `= ISSUBSET` | `= ISSUBSET` | | | `ipv6-addr:value` | `= != LIKE MATCHES ISSUBSET` | `= != LIKE MATCHES ISSUBSET` | | | | | | `mac-addr:value` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | | | | | | `network-traffic:dst_port` | `= != > >= < <=` | `= != > >= < <=` | `=` | `=` | `=` | | | `network-traffic:dst_ref.value` | `= != LIKE MATCHES ISSUBSET` | `= != LIKE MATCHES ISSUBSET` | `= LIKE MATCHES ISSUBSET` | `= ISSUBSET` | `= ISSUBSET` | | | `network-traffic:protocols` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | `=` | `=` | `=` | | | `network-traffic:src_port` | `= != > >= < <=` | `= != > >= < <=` | `=` | `=` | `=` | | | `network-traffic:src_ref.value` | `= != LIKE MATCHES ISSUBSET` | `= != LIKE MATCHES ISSUBSET` | `= LIKE MATCHES ISSUBSET` | `= ISSUBSET` | `= ISSUBSET` | | | `process:command_line` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | | | | | `process:created_time` | `= != > >= < <=` | `= != > >= < <=` | `= != > >= < <=` | | | | | `process:cwd` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | | | | | `process:image_ref.hashes.'SHA-256'` | `= !=` | `= !=` | `= !=` | | | | | `process:image_ref.name` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | | | | | `process:is_hidden` | `= !=` | | `= !=` | | | | | `process:parent_ref.command_line` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | | | | | `process:pid` | `= != > >= < <=` | `= != > >= < <=` | `= != > >= < <=` | | | | | `user-account:account_login` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | | | | | `user-account:account_type` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | | | | | `user-account:user_id` | `= != > >= < <=` | `= != > >= < <=` | `= != > >= < <=` | | | | | `url:value` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | `= LIKE MATCHES` | | | | | `windows-registry-key:key` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | | | | | `windows-registry-key:modified_time` | `= != > >= < <=` | `= != > >= < <=` | `= != > >= < <=` | | | | | `windows-registry-key:number_of_subkeys` | | | | | | | | `windows-registry-key:values[*].data` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | | | | | `windows-registry-key:values[*].data_type` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | | | | | `windows-registry-key:values[*].name` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | `= != LIKE MATCHES` | | | | ## 哈希和字面量语义 有关映射、实现细节、哈希覆盖、STIX 字面量处理(`string`、`b'...'`、`h'...'`)及其他内容的权威详情,请参阅指南: - 英文指南:`kb/guides/GUIDE_EN.md` - 西班牙语指南:`kb/guides/GUIDE_ES.md` 示例规则和转换可在 [`kb/assets/spuc_output.csv`](kb/assets/spuc_output.csv) 中找到(含注释)。 ## 知识库布局 - `kb/standards/`:不可变的标准/参考文件。 - `kb/guides/`:分析师解读指南。 - `kb/assets/`:图表和示例/生成的数据。 不可变文件: - `kb/standards/STIXPattern.g4` - `kb/standards/stix-v2.1-cs01.html` 详见 [`kb/README.md`](kb/README.md)。 ## 分析师工作流(示例 + 目录) ``` # 1) 选择一个 STIX 示例 spuc emulate --file examples/process.stix --to spuc-agent --to bash --to atomic-red-team --output ./artifacts # 2) 在 Web UI 中检查目录 spuc ``` 可直接阅读的工作流资源examples/workflow/ability-sample.json` - `examples/workflow/intrusion-set-sample.yaml` - `examples/workflow/README.md` ## 引擎特定语义 - 网络: - `network-traffic:*` 是规范的网络族。 - 独立的可观察网络对象可能是较弱/上下文相关的映射。 - STIX 中的 `network-traffic:protocols` 是有序栈;许多后端仅保留一个标记。 - Artifact 载荷: - `artifact:payload_bin` 使用 STIX 二进制规范化。 - YARA 等值被建模为全载荷等值。 - Snort/Suricata 等值是基于包含的(`partial`),正则表达式依赖于后端。 - 用户账户: - 单账户规则可以支持。 - 当无法保留单事件语义时,严格模式下的多实体连接会被拒绝。 - 元数据密集型族: - Directory 和 autonomous-system 采用保守映射,通常为 schema 相关。 ## 最终说明 - 不要仅凭覆盖矩阵假设 `exact`;请使用运行时状态和注释。 - 当语义等价性无法成立时,不支持的输出是有意为之的。 - 维护时,请保持矩阵可用性和运行时保真度说明的一致性。 ## 许可证 - SSPLv3(当前)
标签:AMSI绕过, AST规范化, CLI, Cloudflare, CSP, DNS解析, EDR查询, EQL, IDS签名, IP 地址批量处理, IR中间表示, KQL, Metaprompt, MITRE ATT&CK, PB级数据处理, Rust, SIEM检测, SIGMA后端发现, STIX 2.1, STIX解析, Suricata, WiFi技术, XML 请求, YARA, 云资产可视化, 可视化界面, 后端开发, 图案化检测语言, 多格式输出, 威胁建模, 威胁情报, 威胁情报共享, 威胁检测, 安全事件响应, 安全合规, 安全开发, 安全标准, 安全检测引擎, 安全测试, 安全策略, 安全运维, 安全防护, 安全防护产品, 安全防护价值, 安全防护优化, 安全防护体系, 安全防护作用, 安全防护功能, 安全防护升级, 安全防护可价值化, 安全防护可作用化, 安全防护可功能化, 安全防护可可靠化, 安全防护可安全化, 安全防护可定制化, 安全防护可定制性, 安全防护可开发化, 安全防护可开发性, 安全防护可性能化, 安全防护可意义化, 安全防护可扩展化, 安全防护可扩展性, 安全防护可技能化, 安全防护可指南化, 安全防护可支持化, 安全防护可支持性, 安全防护可效果化, 安全防护可效率化, 安全防护可教程化, 安全防护可文档化, 安全防护可案例化, 安全防护可水平化, 安全防护可用化, 安全防护可用性, 安全防护可知识化, 安全防护可稳定化, 安全防护可经验化, 安全防护可维护化, 安全防护可维护性, 安全防护可能力化, 安全防护可质量化, 安全防护可集成化, 安全防护可集成性, 安全防护可靠性, 安全防护安全性, 安全防护定制, 安全防护实现, 安全防护工具, 安全防护工具集, 安全防护平台, 安全防护开发, 安全防护性能, 安全防护意义, 安全防护扩展, 安全防护技术, 安全防护技能, 安全防护指南, 安全防护支持, 安全防护效果, 安全防护效率, 安全防护教程, 安全防护文档, 安全防护方案, 安全防护服务, 安全防护机制, 安全防护架构, 安全防护标准, 安全防护案例, 安全防护水平, 安全防护测试, 安全防护监控, 安全防护知识, 安全防护研究, 安全防护稳定性, 安全防护管理, 安全防护系统, 安全防护经验, 安全防护维护, 安全防护能力, 安全防护解决方案, 安全防护设计, 安全防护评估, 安全防护质量, 安全防护部署, 安全防护集成, 安全防护领域, 安全防护验证, 实时威胁狩猎, 开发者工具, 开源项目, 提示词设计, 攻击性安全, 攻击技术映射, 查询语言, 检测内容生成, 检测规则, 模式匹配, 模式语言, 模式转换, 现代安全运营, 签名生成, 终端检测, 网络代理, 网络安全, 网络安全威胁, 网络安全工具链, 网络安全工程, 网络流量分析, 网络流量审计, 网络资产发现, 自动化资产收集, 规则转换, 请求拦截, 隐私保护