padigeltejas/snf-core
GitHub: padigeltejas/snf-core
一个基于 Rust 的被动网络取证引擎,能在气隙隔离环境下对加密流量进行深度协议分析和 TLS 指纹提取,并保证分析结果跨平台、跨时间完全确定性可复现。
Stars: 0 | Forks: 0
```
███████╗███╗ ██╗███████╗ ██████╗ ██████╗ ██████╗ ███████╗
██╔════╝████╗ ██║██╔════╝ ██╔════╝██╔═══██╗██╔══██╗██╔════╝
███████╗██╔██╗ ██║█████╗ ██║ ██║ ██║██████╔╝█████╗
╚════██║██║╚██╗██║██╔══╝ ██║ ██║ ██║██╔══██╗██╔══╝
███████║██║ ╚████║██║ ╚██████╗╚██████╔╝██║ ██║███████╗
╚══════╝╚═╝ ╚═══╝╚═╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝
```
**Shadow 网络指纹识别引擎 — 开源核心**
*确定性强。离线优先。原生支持气隙隔离。基于 Rust 编写。*
[](LICENSE)
[](https://www.rust-lang.org/)
[]()
[]()
[]()
## 什么是 SNF-Core?
SNF-Core 是 **Shadow 网络指纹识别引擎** 的开源协议分析层 —— 这是一个 100% 离线、原生支持气隙隔离的被动网络情报平台。它捕获原始数据包,重建网络流,并在 14 个分析器中提取深层协议情报,输出结构化的 NDJSON,用于取证分析、工具链集成以及下游威胁平台。
它是**唯一可保证以下特性的确定性被动网络分析引擎**:
```
F(dataset, config, version) → SHA-256 identical NDJSON output
```
相同的 PCAP。相同的配置。相同的二进制文件。输出完全一致。每次运行。每台机器。每位分析人员。
## 为什么选择 SNF-Core?
| 问题 | 现有工具失败的原因 | SNF-Core 如何解决 |
|---|---|---|
| **不可重现的分析** | Wireshark 依赖人工且受分析人员影响。没有工具能保证两次分析的结果完全相同。 | 确定性契约 —— 跨平台、跨分析人员、跨时间的 SHA-256 完全一致的输出。 |
| **气隙隔离环境** | Darktrace、Vectra、CrowdStrike —— 全都依赖云。在国防/涉密/OT环境中违法使用。 | 架构上的离线优先。零互联网依赖。零遥测数据。 |
| **加密流量盲区** | TLS 1.3 隐藏了负载。DPI 毫无用处。在许多司法管辖区解密是非法的。 | 从握手元数据(SNI、JA3/JA4、密码行为)中提取情报 —— 无需解密。 |
| **内存不安全的取证工具** | Zeek、Suricata、Snort、tcpdump 均使用 C/C++ 编写。内存损坏是已知的攻击媒介。 | Rust:在编译时保证内存安全。在处理 1490 万个 MAWI 数据包的运行中零崩溃。 |
## 确定性契约
```
┌──────────────────────────────────────────────────────────┐
│ input: capture.pcap + snf.toml + snf-core v1.0.0 │
│ output: snf_output.ndjson │
│ │
│ SHA-256(run_1) == SHA-256(run_2) ── ALWAYS │
│ SHA-256(analyst_A) == SHA-256(analyst_B) ── ALWAYS │
│ SHA-256(windows) == SHA-256(linux) ── ALWAYS │
└──────────────────────────────────────────────────────────┘
```
每次输出都会在会话头中嵌入 `pcap_sha256` + `config_sha256` + `snf_version` —— 构成完整的保管链记录。
## 协议支持
| 协议 | 提取字段 |
|---|---|
| **DNS** | 查询/响应、CNAME 链、MX/NS/TXT/SRV、解析的 IP、TTL、NXDOMAIN、DNSSEC |
| **TLS 1.0–1.3** | SNI、密码套件、ALPN、ECH 检测、证书 CN/SANs、JA3/JA3S/JA4、0-RTT、会话恢复 |
| **HTTP/1.1** | 方法、URI、主机、状态码、User-Agent、Content-Type、重定向检测 |
| **HTTP/2** | HPACK 头部、`:method` / `:path` / `:authority` 伪头部 |
| **QUIC v1/v2** | 版本、DCID/SCID、来自 CRYPTO 帧的 SNI、包号 |
| **DHCPv4/v6** | 消息类型、客户端 MAC、主机名、请求的 IP、Option 82 中继、DHCPv6 DUID |
| **ICMPv4/v6** | 类型、代码、负载大小、traceroute 检测 |
| **SMB 1/2/3** | 命令、NTLM 认证类型、会话 ID、协商 dialect |
| **mDNS** | 服务类型、设备名称、PTR/SRV/TXT 记录 |
| **DoH / DoT** | 置信度评分检测 —— ALPN、路径、content-type 信号 |
| **Kerberos / LDAP / RDP** | AS-REQ/TGS-REQ、NTLM 协商/认证、LDAP 绑定、RDP 连接 |
| **SSDP / UPnP / FTP** | M-SEARCH/NOTIFY、FTP 命令解析 |
所有 14 个分析器在处理每个数据包时均以**固定的确定性顺序**运行 —— 这是 SHA-256 确定性保证的核心要求。
## 快速开始
```
git clone https://github.com/padigeltejas/snf-core
cd snf-core
cargo build --release
```
```
# 分析 PCAP 文件
./target/release/snf_core --forensic --pcap-file capture.pcap
# 实时抓包 (需要 root / CAP_NET_RAW)
sudo ./target/release/snf_core --monitor --interface 1
# 验证确定性 — 运行两次并比较 SHA-256
./target/release/snf_core --determinism-check --pcap-file capture.pcap
# 仅 Dry-run config 验证
./target/release/snf_core --forensic --pcap-file capture.pcap --dry-run
```
输出默认写入 `output/snf_output.ndjson`(可通过 `snf.toml` 配置)。
## 操作模式
| 模式 | 标志 | 线程 | 使用场景 |
|---|---|---|---|
| **Forensic** | `--forensic` | 自动伸缩 | PCAP 事后分析,DFIR |
| **Monitor** | `--monitor` | 自动伸缩 | 7x24小时实时 SOC 传感器 |
| **Replay** | `--replay` | 单线程(强制) | 法庭认可的、可重现的回放 |
| **Stealth** | `--stealth` | 单线程 | 隐蔽传感器 —— 零控制台输出 |
## 输出格式
SNF-Core 输出 **NDJSON** —— 每行一个 JSON 对象,支持流式处理、管道传输,并直接兼容 `jq`。
每个会话均以一个会话头开始:
```
{
"record_type": "snf_session_header",
"snf_version": "1.0.0",
"pcap_sha256": "a3f1c2...",
"config_sha256": "9b4d7e...",
"operating_mode": "forensic",
"input_source": "capture.pcap",
"session_start_us": 1706789400000000
}
```
随后是包含 7 个必填字段的类型化事件:
```
{
"event_id": 1,
"packet_id": 42,
"timestamp_us": 1706789401123456,
"event_type": "tls.client_hello",
"protocol": "tls",
"flow_id": "10.0.0.1:54231-185.220.101.50:443-tcp",
"attributes": {
"sni": "example.com",
"ja3_hash": "d4e12bfc...",
"tls_version": "TLSv1.3",
"cipher_count": 17
}
}
```
## 架构
```
PCAP / Live Interface
│
▼
┌───────────────────┐
│ Capture Engine │ ← AF_PACKET · AF_XDP · pcap · DPDK (scaffold)
└────────┬──────────┘
│ RawPacket
▼
┌───────────────────┐
│ Worker Pool │ ← Per-worker FlowTable · AnalyzerManager · EventBus
└────────┬──────────┘
│ PacketContext
▼
┌───────────────────────────────────────────────────────┐
│ 14 Protocol Analyzers (fixed deterministic order) │
│ DNS · TLS · HTTP/1.1 · HTTP/2 · QUIC · DHCP · ICMP │
│ SMB · mDNS · DoH · DoT · Enterprise · Discovery · ICS│
└────────┬──────────────────────────────────────────────┘
│ SnfEvent (7 mandatory fields)
▼
┌───────────────────┐
│ NDJSON Output │ ← BufWriter · BTreeMap sort · session header first
└───────────────────┘
│
▼
snf_output.ndjson
```
Worker 分片(`.worker_N`)在会话结束时合并为一个单一的确定性 NDJSON 文件。Worker 0 的会话头是权威标准 —— 来自所有其他 Worker 的会话头在合并期间被丢弃。
## 配置
SNF-Core 通过 `snf.toml`(可选)和 CLI 标志进行配置。CLI 标志具有最高优先级。
```
# snf.toml
output_dir = "output" # NDJSON output directory — created automatically if absent
# max_memory_mb = 0 # 0 = 无限制;设置后将触发积极的流驱逐
```
有关完整参考,请参见 [`snf.toml.example`](snf.toml.example)。
## 性能
已在真实 PCAP 上进行验证:
| 指标 | 结果 | 测试条件 |
|---|---|---|
| 单核吞吐量 | **155,600 pps / 1.25 Gbps** | MAWI 骨干网,1490万个数据包,1.07 GB,RHEL9 release 版本 |
| 4 线程加速比 | **快 2.3 倍** | 相同的 MAWI PCAP,4 个 vCPU,带有流亲和性路由的 WorkerPool |
| 零崩溃 | **14,937,089 个数据包** | 完整的 MAWI 骨干网运行 —— 零 panic,零内存错误 |
| 确定性 | **SHA-256 完全一致** | 两遍 AF_XDP 重放:`6a76686f` PASS |
## 文档
| 文档 | 内容 |
|---|---|
| [01 — 架构](docs/01_architecture.md) | 引擎内部机制、线程模型、流水线阶段 |
| [02 — 确定性](docs/02_determinism.md) | `F(dataset,config,version)` 契约,验证步骤 |
| [03 — 协议支持](docs/03_protocol_support.md) | 所有 14 个分析器、字段参考、检测逻辑 |
| [04 — 事件模型](docs/04_event_model.md) | `SnfEvent`、`AttrValue`、`EventType` 完整参考 |
| [05 — 部署](docs/05_deployment.md) | 传感器设置、气隙隔离部署、stealth 模式 |
| [06 — 扩展](docs/06_extending.md) | 添加分析器、自定义事件类型、构建集成 |
## 开放核心模型
SNF-Core 是 Shadow 网络指纹识别引擎的**开源协议分析层** —— 作为独立工具已经完整且达到生产就绪状态。
| 组件 | SNF-Core (开源版) | SNF Full Engine (商业版) |
|---|---|---|
| 数据包捕获 + 流跟踪 | ✓ | ✓ |
| 14 个协议分析器 | ✓ | ✓ |
| 确定性 NDJSON 输出 | ✓ | ✓ |
| JA3 / JA3S / JA4 指纹识别 | ✓ | ✓ |
| 信标 / DGA / DNS 隧道检测 | — | ✓ |
| 离线 IOC 匹配 | — | ✓ |
| ICS/SCADA 协议套件 | — | ✓ |
| PCAP 脱敏引擎 | — | ✓ |
| 被动 OS/硬件指纹识别 | — | ✓ |
| 多 PCAP 会话关联 | — | ✓ |
| 取证证据包 | — | ✓ |
| SIEM 导出 (Splunk/Elastic/CEF/LEEF) | — | ✓ |
## 安全性
SNF-Core 将每个 PCAP 视为对抗性输入。解析器层即为攻击面。
- **内存安全** —— Rust 在编译时提供保证。分析路径中零 `unsafe` 代码。
- **边界检查** —— 所有缓冲区读取在访问前均经过验证。没有来自数据包数据的无限制内存分配。
- **无静默丢弃** —— 每次解析失败都会发出一个 `engine.parse_error` 事件。确定性要求所有格式错误的输入都必须出现在输出中。
- **无 panic** —— 任何生产代码路径中都没有零 `.unwrap()` 或 `.expect()`。所有错误均被显式处理。
有关完整的安全策略,请参见 [SECURITY.md](SECURITY.md)。
## 贡献
欢迎对开源核心做出贡献。请参见 [CONTRIBUTING.md](CONTRIBUTING.md)。
**所有 PR 的硬性要求:**
- `cargo build` → 在 Windows 和 Linux 上均 0 个错误,0 个警告
- `cargo test` → 所有测试通过
- 任何生产路径中均不得包含 `.unwrap()` 或 `.expect()`
- 所有新增的 `PacketContext` 字段必须同时添加到 `new()` 和 `Default()` 中
## 许可证
Apache 2.0 — 版权所有 2026 Tejas Padigel
**SNF Labs** · [@snf_labs](https://x.com/snf_labs) · [snflabsio](https://github.com/snflabsio)
*基于 Rust 构建。随处运行。绝不盲信。*
标签:AWS, DPI, IOC匹配, IP 地址批量处理, JA3指纹, JA4指纹, Rust, SNF-Core, 协议分析, 可视化界面, 失陷标示匹配, 威胁情报, 安全取证引擎, 开发者工具, 开源安全工具, 权限提升, 流量监控, 流量重组, 深度包检测, 物理隔离网络, 离线分析, 网络安全, 网络安全分析, 网络指纹识别, 网络流量分析, 网络流量审计, 被动网络取证, 逆向工程平台, 通知系统, 防御绕过, 隐私保护, 零云依赖