VedantBist/suricata-validation-engine

GitHub: VedantBist/suricata-validation-engine

基于 Flex/Bison 构建的 Suricata IDS/IPS 规则验证引擎,提供 CFG 语法解析、分层语义校验和结构化错误诊断,支持大规模规则文件的流式验证。

Stars: 0 | Forks: 0

# suricata-validation-engine 用于 Suricata IDS/IPS 规则的生产级验证引擎,基于传统的 Flex(词法分析)和 Bison(语法分析)构建,支持基于 CFG 的语法分析、分层语义验证器、panic 模式错误恢复,以及编译器级的结构化诊断信息。 该引擎能够通过单次流式处理验证大型规则文件(10,000+ 条规则),在遇到格式错误的规则时会进行恢复而不是终止运行,并报告能够感知解析器状态的诊断信息: ``` Rule #3 | Line 3, Col 11 | SYNTAX ERROR Expected: SrcIP Found: -> Source IP missing after protocol Acceptable tokens here: any, !, [, IP address, CIDR block, variable Rule #7 | Line 7 | SEMANTIC ERROR Field: DstPort Value: 70000 Destination port exceeds the valid range (1-65535) TCP/UDP ports are 16-bit values from 1 to 65535 ``` ## 支持的规则语言 ``` alert tcp !$HOME_NET [1:1024,!80] -> [10.0.0.1,192.168.1.0/24] [80,443,8080] (msg:"..."; sid:1001; rev:2;) ``` - 动作 `alert|drop|pass`,协议 `tcp|udp|icmp`,方向 `->|<>` - 地址:IP、CIDR、`$VARIABLES`、`any`、取反 (`!X`, `![...]`,针对元素的 `[a,!b]`)、括号列表 - 端口:单个端口、范围 (`1:1024`, `1024:`, `:65535`)、取反、列表 - 选项:`msg`, `sid`, `rev`, `content` (`key:value;` 块) 语义检查:IPv4 八位组范围、CIDR 前缀、端口边界与范围排序、重复/被包含的列表条目、sid 规范(存在、唯一、数值型、正数、全文件唯一)、rev 类型、空字符串、未知选项键、协议/端口一致性。警告(例如 icmp 上的端口)会在不影响规则有效性的情况下显示。 ## 构建 要求 flex 和 bison ≥ 3.6(macOS:`brew install bison`;Makefile 会自动优先使用 Homebrew 安装的版本,而不是古老的系统自带 bison 2.3)。 ``` make # debug build (UBSan) -> build/bin/suricata-validate make release # optimized build make test # golden-file suite STRESS=1 make test # + 10k-rule stress tiers (invariants, JSON, leaks, # corruption-heavy recovery, determinism) ``` ## 用法 ``` suricata-validate rules.txt # full validation (default) suricata-validate rules.txt --json # machine-readable report suricata-validate rules.txt --summary # one summary line suricata-validate rules.txt --quiet # diagnostics + summary, no verdicts suricata-validate rules.txt --max-errors 50 # fail-fast after 50 errors suricata-validate rules.txt --syntax-only # structural lint, semantics off suricata-validate rules.txt --timing # timing/throughput on stderr suricata-validate --dump-tokens rules.txt # lexer inspection ``` 退出代码:`0` 正常 · `1` 发现违规 · `2` 引擎/用法错误。 使用 `-` 从 stdin 读取。Debug 构建版本接受 `SV_PARSER_TRACE=1` 以输出完整的移进/归约/恢复追踪。 ### JSON schema (v1) ``` { "tool": "suricata-validate", "schema_version": 1, "mode": "validate", "stopped_early": false, "summary": { "total_rules": 10000, "valid_rules": 9581, "syntax_invalid": 189, "semantic_invalid": 230, "errors": 419, "warnings": 0, "lexical_errors": 0, "lines": 11164 }, "diagnostics": [ { "rule": 34, "line": 34, "category": "SEMANTIC", "severity": "ERROR", "field": "DstPort", "value": "70000", "message": "Destination port exceeds the valid range (1-65535)", "explanation": "TCP/UDP ports are 16-bit values from 1 to 65535" } ] } ``` 可选字段(`column`, `expected`, `found`, `field`, `value`, `explanation`)会在适用时出现。输出是确定性的:相同的输入会产生字节完全相同的报告。 ## 工程不变性 以下属性由测试套件强制执行,而不仅仅是文档说明: - **零语法冲突** — bison 在运行时添加 `-Werror`;出现冲突会导致构建失败。 - **基于行尾的恢复** — 格式错误的规则会被直接丢弃至其行尾,记录确切的一条语法诊断信息,并且下一条规则的解析不受影响。恢复过程不会跨越行边界。 - **流式处理** — 一次只保留一条规则;唯一的跨规则状态是 sid 注册表(sid → 首次出现位置)。内存占用受诊断信息限制,绝不受文件大小影响。 - **单向所有权** — 词素 → 元素 → 容器 → Rule;解析器析构函数每次只释放一层,因此 panic 恢复和提前终止都不会造成内存泄漏(已通过在大量损坏数据压力下的堆检查验证)。 - **语法/语义分离** — 解析器根据自身的表判断结构(`parse.error custom` + LAC);验证器根据 Rule 对象判断语义;两者互不干涉。 - **统计核算** — `valid + syntax-invalid + semantic-invalid == total`(引擎每次运行都会进行自检;违规时以退出代码 2 终止)。 ## 目录结构 | 路径 | 职责 | |------|----------------| | `src/core/` | CLI、运行编排、调度接缝、退出代码 | | `src/lexer/` | Flex 词法分析 + 位置追踪(负责分类,不负责判断) | | `src/parser/` | Bison 语法、错误恢复、Expected/Found 捕获 | | `src/models/` | Rule、Endpoint/PortSpec 容器、Option、Diagnostic、上下文 | | `src/semantic/` | 验证器遍历 + sid 注册表(负责语义,不负责结构) | | `src/diagnostics/` | 诊断信息收集、故障表、所有说明文本 | | `src/reporting/` | 文本 + JSON 渲染器、摘要引擎 | | `src/utils/` | 通用辅助工具,零项目耦合 | | `tests/` | Golden 测试套件:lexer / parser / semantic / cli + 压力测试层级 | | `docs/` | [架构](docs/ARCHITECTURE.md) · [路线图](docs/ROADMAP.md) · [语法日志](docs/GRAMMAR.md) | 完整的设计原理:[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)。
标签:Flex/Bison, IDS/IPS, 云安全监控, 客户端加密, 编译器, 规则验证, 静态分析