padigeltejas/snf-core

GitHub: padigeltejas/snf-core

一个基于 Rust 的被动网络取证引擎,能在气隙隔离环境下对加密流量进行深度协议分析和 TLS 指纹提取,并保证分析结果跨平台、跨时间完全确定性可复现。

Stars: 0 | Forks: 0

``` ███████╗███╗ ██╗███████╗ ██████╗ ██████╗ ██████╗ ███████╗ ██╔════╝████╗ ██║██╔════╝ ██╔════╝██╔═══██╗██╔══██╗██╔════╝ ███████╗██╔██╗ ██║█████╗ ██║ ██║ ██║██████╔╝█████╗ ╚════██║██║╚██╗██║██╔══╝ ██║ ██║ ██║██╔══██╗██╔══╝ ███████║██║ ╚████║██║ ╚██████╗╚██████╔╝██║ ██║███████╗ ╚══════╝╚═╝ ╚═══╝╚═╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ ``` **Shadow 网络指纹识别引擎 — 开源核心** *确定性强。离线优先。原生支持气隙隔离。基于 Rust 编写。* [![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg?style=for-the-badge)](LICENSE) [![Rust](https://img.shields.io/badge/Rust-Edition_2024-orange?style=for-the-badge&logo=rust)](https://www.rust-lang.org/) [![Build](https://img.shields.io/badge/Build-0_errors_·_0_warnings-brightgreen?style=for-the-badge)]() [![Platforms](https://img.shields.io/badge/Platforms-Windows_·_Linux_RHEL9-lightgrey?style=for-the-badge)]() [![Protocols](https://img.shields.io/badge/Protocols-14_Active_Analyzers-informational?style=for-the-badge)]()
## 什么是 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, 协议分析, 可视化界面, 失陷标示匹配, 威胁情报, 安全取证引擎, 开发者工具, 开源安全工具, 权限提升, 流量监控, 流量重组, 深度包检测, 物理隔离网络, 离线分析, 网络安全, 网络安全分析, 网络指纹识别, 网络流量分析, 网络流量审计, 被动网络取证, 逆向工程平台, 通知系统, 防御绕过, 隐私保护, 零云依赖