cognis-digital/injectguard
GitHub: cognis-digital/injectguard
一个用标记语料库量化评估和调优 WAF/IDS 正则检测签名质量的命令行工具,帮助安全团队以可测量指标驱动规则迭代。
Stars: 0 | Forks: 0
# injectguard
**一个防御性检测规则调优实验室。**
`injectguard` 是一个小巧的 CLI,它针对标记为良性和恶意的测试字符串**语料库**来评估你的**检测签名**
(正则表达式规则),然后报告混淆矩阵指标 —— TP / FP / FN,
precision、recall 和 F1 —— **提供总体和每个类别的数据**。它会告诉你哪些
恶意输入*逃避*了你的规则(假阴性),以及哪些良性输入
被*错误标记*(假阳性),这样你就可以**通过可测量的反馈来调优你的 WAF/IDS
检测规则**,而不是靠猜测。
## 安装 / 构建
要求 Go 1.22+。
```
git clone https://github.com/cognis-digital/injectguard
cd injectguard
go build -o injectguard .
```
或者不安装直接运行:
```
go run . eval
```
## 用法
```
injectguard eval [flags] evaluate rules against a labeled corpus
injectguard rules list the built-in starter rules
injectguard corpus list the built-in labeled corpus
injectguard help show help
```
### `eval` 标志
| 标志 | 含义 |
|------|---------|
| `--rules PATH` | JSON 规则集(默认使用内置的入门规则) |
| `--corpus PATH` | JSON 标记语料库(默认使用内置语料库) |
| `--json` | 以 JSON 格式输出报告 |
| `--show-fn` | 列出假阴性(逃避了所有规则的恶意输入) |
| `--show-fp` | 列出假阳性(被错误标记的良性输入) |
| `--fail-under-recall X` | 如果总体 recall < X (0..1) 则以非零状态退出 —— 用于 CI 门禁 |
如果你省略 `--rules`/`--corpus`,将使用内置的入门数据,因此你可以
立即试用:
```
injectguard eval
injectguard eval --show-fn --show-fp
injectguard eval --json
```
### 输出示例
```
injectguard evaluation
rules: injectguard-starter-rules (10 rules)
corpus: injectguard-starter-corpus (23 samples)
overall: TP=12 FP=0 FN=1 TN=10
precision=1.000 recall=0.923 f1=0.960
category TP FP FN TN precision recall f1
----------------------------------------------------------------
auth-bypass 4 0 0 3 1.000 1.000 1.000
sqli 4 0 1 4 1.000 0.800 0.889
xss 4 0 0 3 1.000 1.000 1.000
```
入门级的 `sqli` 类别有意包含**一次逃避** ——
带引号的重言式 `") or ("1"="1` 绕过了 `sqli-tautology`。运行
`injectguard eval --show-fn` 即可暴露它;弥补这个漏洞(将
规则扩展以允许带引号的操作数)是经典的首次调优练习。
## 文件格式
**规则集** —— 每条规则对应一个正则表达式 `pattern`,按 `category` 分组。模式匹配
不区分大小写。
```
{
"name": "my-rules",
"rules": [
{ "id": "sqli-union-select", "category": "sqli", "severity": "high",
"pattern": "\\bunion\\b[\\s\\S]{0,40}?\\bselect\\b" }
]
}
```
**语料库** —— 带标记的输入。`malicious: true` 表示该输入*应该*
被至少一条规则检测到;`false` 表示应将其忽略。
```
{
"name": "my-corpus",
"samples": [
{ "id": "m1", "category": "sqli", "malicious": true, "text": "1' UNION SELECT pw FROM users" },
{ "id": "b1", "category": "sqli", "malicious": false, "text": "union representatives met today" }
]
}
```
可直接编辑的示例位于[`examples/`](examples/)。
## 指标的定义方式
*阳性*预测意味着规则集标记了某个样本(≥1 条规则匹配)。
| | 预测为阳性 | 预测为阴性 |
|---|---|---|
| **实际为恶意** | TP | FN (逃避) |
| **实际为良性** | FP (噪声) | TN |
- `precision = TP / (TP + FP)` — 当没有预测出阳性结果时,precision 报告为 `1.0`。
- `recall = TP / (TP + FN)` — 当不存在实际的阳性结果时,recall 报告为 `1.0`。
- `f1 = 2·precision·recall / (precision + recall)` — 当两者均为 `0` 时为 `0`。
## 调优工作流
1. 从你当前的规则和包含真实良性及恶意形态的语料库开始。
2. 运行 `injectguard eval --show-fn --show-fp`。
3. **假阴性**显示了逃避情况 → 为该类别添加或拓宽规则。
4. **假阳性**显示了存在噪声的规则(通过 `matched-by` 标识)→ 收紧这些规则。
5. 重新运行;观察每个类别的 recall 上升且 precision 保持稳定。
6. 将 `--fail-under-recall 0.8` 接入 CI,这样覆盖率的回归就会导致构建失败。
## CI
当总体 recall 降至
`X` 以下时,`injectguard eval --fail-under-recall X` 将以非零状态(代码 `3`)退出,因此你可以对规则更改进行门禁控制:
```
- run: go run . eval --rules rules.json --corpus corpus.json --fail-under-recall 0.8
```
请参阅[`.github/workflows/ci.yml`](.github/workflows/ci.yml) 了解本项目自身的
构建 + 测试 + 自检门禁。
## 退出代码
| 代码 | 含义 |
|------|---------|
| `0` | 成功 |
| `1` | 运行时错误(文件错误/缺失、无效的规则集或语料库) |
| `2` | 用法错误(未知命令 / 错误标志) |
| `3` | 触发 recall 门禁 (`--fail-under-recall`) |
## 开发
```
go build ./...
go test ./...
go vet ./...
```
仅使用标准库(使用 `regexp`、`encoding/json`、`flag`)。
## 许可证
许可证:COCL 1.0
## 维护者
Cognis Digital
标签:EVTX分析, Go, Homebrew安装, Ruby工具, WAF/IDS, 性能评估, 文档结构分析, 日志审计, 规则调优