fajarsajid/suricata-detections
GitHub: fajarsajid/suricata-detections
基于数据包级流量分析的高质量 Suricata 规则库,提供精准的 CVE 漏洞检测特征及完备的自动化测试验证与权衡说明。
Stars: 0 | Forks: 0
# suricata-detections
基于数据包级流量分析的网络 IDS 特征库开发。
本仓库包含用于检测 CVE 漏洞利用流量的 Suricata 规则,编写过程自底向上基于 pcap 展开 —— 首先观察实际的网络行为,然后将相关指标转化为精确的特征并记录相关的权衡说明。
**当前覆盖范围:** CVE-2021-44228 (Log4Shell)
## 方法论
本仓库中的每条规则均遵循相同的开发流程:
1. **优先分析 Pcap。** 在 Wireshark 中阅读真实或实验室复现的漏洞利用流量捕获记录。在编写任何规则语法之前,先了解攻击在数据包层面的具体表现。
2. **识别可靠指标。** 恶意流量中存在哪些在正常(良性)流量中不存在(或极少出现)的内容?在不产生噪声干扰的情况下,捕获该行为所需的最低特异性要求是什么?
3. **编写签名。** 将 `content` 匹配建立在观察到的字节模式基础上。仅在内容匹配无法覆盖变体空间时才使用 PCRE。设置 `fast_pattern` 以保持较低的 MPM 性能开销。
4. **记录权衡取舍。** 规则故意未覆盖的内容是什么?在哪些情况下可能产生误报 (FP)?推荐的抑制方法是什么?这些决策与规则本身同等重要。
5. **针对正例和负例进行测试。** 每条规则都对应一个应触发它的 pcap,以及至少一个不应触发它的 pcap。
## 仓库结构
```
suricata-detections/
├── rules/
│ └── log4shell.rules # Suricata rules for CVE-2021-44228
├── analysis/
│ └── log4shell_analysis.md # Traffic analysis & detection rationale
├── tests/
│ ├── generate_test_pcaps.py # Generates synthetic test pcaps (zero deps)
│ └── test_rules.py # Validates rules against pcaps via Suricata
├── pcaps/ # Generated by generate_test_pcaps.py
│ ├── positive_01_*.pcap # Should trigger specific SIDs
│ └── negative_01_*.pcap # Should trigger nothing
└── README.md
```
## CVE-2021-44228 — Log4Shell
**CVSS:** 10.0 严重 | **MITRE:** T1190 (利用面向公众的应用程序)
Log4Shell 利用了 Log4j2 的 JNDI 消息查找替换功能。任何被记录的、受用户控制的字符串都可能触发远程 JNDI 查找,从而导致远程代码执行。
### 规则
| SID | 描述 | 误报 (FP) 风险 |
|-----|-------------|---------|
| 9100001 | HTTP 头中的 JNDI 查找字符串 | 极低 |
| 9100002 | HTTP URI 中的 JNDI 查找字符串 | 极低 |
| 9100003 | 混淆的嵌套表达式绕过 | 低 |
| 9100004 | JNDI 协议回调字符串 (ldap/rmi/dns) | 低 |
| 9100005 | 出站 LDAP 回调(漏洞利用后) | 中 |
规则 1–4 覆盖了包括经过混淆的 WAF 绕过变体在内的入站漏洞利用尝试。规则 5 通过网络流量遥测提供独立的漏洞利用后确认 —— 这是一个不同的检测层,不依赖于是否能看到入站有效载荷。
### 测试覆盖范围
```
Positive cases (should fire):
✓ Basic JNDI in User-Agent header → sid:9100001
✓ JNDI in X-Forwarded-For header → sid:9100001
✓ JNDI in URI path → sid:9100002
✓ Obfuscated: ${${lower:j}ndi:...} → sid:9100003
✓ Obfuscated: character substitution chain → sid:9100003
✓ RMI protocol variant → sid:9100001, 9100004
✓ Outbound LDAP callback → sid:9100005
Negative cases (should NOT fire):
✓ Benign HTTP request
✓ JNDI string in server response (wrong direction)
✓ Dollar-brace in URL parameter (not JNDI)
✓ Legitimate internal LDAP connection
```
## 运行测试
**环境要求:** Python 3.10+, Suricata(用于实时验证)
```
# 1. 生成测试 pcaps
python tests/generate_test_pcaps.py
# 2. 运行验证(需要 Suricata)
python tests/test_rules.py
# 3. CI 模式 — 任何失败时退出,退出码为 1
python tests/test_rules.py --ci
```
如果未安装 Suricata,测试工具将以模拟模式运行,
并在不进行实时规则评估的情况下验证 pcap 是否已正确生成。
**安装 Suricata:**
```
# Ubuntu/Debian
sudo apt install suricata
# macOS
brew install suricata
```
## 设计决策
**零第三方 Python 依赖。** pcap 生成器仅使用 Python 的 `struct` 和 `socket` 标准库模块写入原始二进制数据。这是一项深思熟虑的供应链安全决策 —— 生成测试用例无需执行 pip install。
**主内容上的 `fast_pattern`。** 每个带有 `content` 匹配的规则都指定了 `fast_pattern`,以指示 Suricata 的多模式匹配器将该字符串用作主要预过滤器。即使在加载大量规则时,这也能大规模保持较低的 CPU 开销。
**大流量规则的 `threshold` 设置。** 规则 1 和 2 包含 `threshold:type limit, track by_src, count 1, seconds 60`,用于抑制来自大规模扫描源的告警风暴。检测仍然会触发;只是不会为同一个源 IP 生成数千条重复告警。
**良性分类器优于规则抑制。** 已知安全扫描器(Shodan, Censys 等)产生的误报会在权衡文档中注明,但不会在规则本身中被抑制。在传感器规模上,通过已知的扫描器分类层(例如 GreyNoise 标签)来处理此问题,要比将 IP 允许列表硬编码到规则逻辑中更好,因为后者无法扩展且会产生维护债务。
## 参考资料
- [NVD CVE-2021-44228](https://nvd.nist.gov/vuln/detail/CVE-2021-44228)
- [LunaSec 原始披露](https://www.lunasec.io/docs/blog/log4j-zero-day/)
- [Log4Shell 规避模式](https://github.com/back2root/log4shell-rex)
- [恶意流量分析(公开 pcap 样本)](https://www.malware-traffic-analysis.net)
- [MITRE ATT&CK T1190](https://attack.mitre.org/techniques/T1190/)
- [Suricata 规则文档](https://docs.suricata.io/en/latest/rules/)
标签:AMSI绕过, CISA项目, Claude, CVE-2021-44228, CVE检测, IP 地址批量处理, Log4Shell, Metaprompt, PB级数据处理, PCAP, PCRE, SecOps, Suricata, Wireshark, 云安全架构, 云计算, 入侵检测系统, 句柄查看, 威胁检测, 安全数据湖, 安全测试, 安全运维, 攻击性安全, 攻击特征提取, 现代安全运营, 网络安全, 规则开发, 规则引擎, 逆向工具, 隐私保护