shroudy-bit32/nist-live-cvt1-feed
GitHub: shroudy-bit32/nist-live-cvt1-feed
该项目在 GitHub Runner 中完全基于内存流式解析 120 GB 的 NIST NSRL 数据库,通过底层页面雕刻技术提取哈希并压缩为微型原生二进制 Feed。
Stars: 0 | Forks: 0
# ⚡ NIST NSRL 实时 CVT1 Feed Pipeline
一个自动化、高性能、**零磁盘占用**的威胁情报管道,完全在内存中解析庞大(约 120 GB)的 NIST NSRL Modern 数据库,生成每日微型原生二进制哈希 feed(CVT1 格式),并将其直接部署到 GitHub Releases。
---
## 🧠 工程问题与架构
### 限制条件
官方的 NIST NSRL Modern SQLite 数据库是一个巨大的 **约 120 GB** 单体文件。标准的实现方式需要下载整个归档文件,将其解压到磁盘,并运行繁重的 SQL 查询。由于严格的 **14 GB 磁盘空间限制**和性能瓶颈,在云基础设施或像 GitHub Actions 这样的免费自动化层上执行此操作是不可能的。
### 解决方案:SQLite Page Carving 与 Ring Buffer
该项目完全绕过了本地存储层和 SQLite 引擎本身:
1. **网络流解压:** 远程的 `.zip` 文件通过 HTTP 数据块进行流式传输,并即时解压缩(inflate)。
2. **Circular Ring Buffer:** 解压后的原始二进制 `.db` 字节被推入一个高度优化的、自定义的多线程 **Circular Ring Buffer**(`ByteRing` 类)中。
3. **Low-Level Page Carving:** 自定义的 **Binary Carver** 不会初始化传统的 SQLite 数据库连接(这需要在整个 120 GB 文件结构中进行随机访问的 `seek` 操作),而是按文件顺序连续扫描字节流。它动态解析物理 SQLite 的 page/cell 边界,提取有效的 `MD5`、`SHA-1` 和 `SHA-256` 列,并丢弃其他所有内容。
4. **Zero-Overhead Binary Packs (CVT1):** 提取出的哈希值被严格打包为原始二进制流(MD5 为 16 字节,SHA-1 为 20 字节,SHA-256 为 32 字节),而不是冗长的 ASCII 文本十六进制字符串。
---
## 📊 Live Feed 统计数据(压缩奇迹)
得益于消除了 SQLite B-Tree 元数据碎片、索引头和原始文本表示,庞大的数据库开销被压缩成了紧密打包的高性能文件:
| 产物名称 | Native Format | 元素大小 | 总打包大小 | 目标数量 |
| :--- | :--- | :--- | :--- | :--- |
| 📦 `clean_md5.bin` | Raw Binary | 16 Bytes | ~10.2 MB | ~668,000 Hashes |
| 📦 `clean_sha1.bin` | Raw Binary | 20 Bytes | ~12.7 MB | ~665,000 Hashes |
| 📦 `clean_sha256.bin` | Raw Binary | 32 Bytes | ~20.4 MB | ~668,000 Hashes |
*Feed 通过自动化管道每 24 小时完全刷新并重新生成一次。*
---
## 🚀 集成指南:如何在你的项目中使用 CVT1 Feeds
由于 feed 部署为纯粹的、无填充的二进制结构,你不需要繁重的 JSON/CSV/SQL 解析器。你可以直接将它们集成到你的恶意软件扫描引擎、沙箱环境或白名单检查器中。
### 1. 在 C/C++ 中集成(Zero-Copy Memory Mapping)
你可以使用 `mmap` 将 `.bin` 文件直接映射到内存中,以实现即时、零分配的运行时空间查找:
```
\#include
\#include
\#include
\#include
\#include
struct SHA256Hash {
uint8\_t bytes\[32];
};
int main() {
int fd = open("clean\_sha256.bin", O\_RDONLY);
if (fd < 0) return 1;
struct stat sb;
fstat(fd, \&sb);
// Memory-map the entire feed instantly
SHA256Hash\* hash\_feed = (SHA256Hash\*)mmap(NULL, sb.st\_size, PROT\_READ, MAP\_SHARED, fd, 0);
size\_t total\_hashes = sb.st\_size / sizeof(SHA256Hash);
std::cout << "\[+] Instantly mapped " << total\_hashes << " hashes into runtime space." << std::endl;
// Perform ultra-fast O(log N) binary search here since the array is pre-sorted
// Example:std::binary\_search(hash\_feed, hash\_feed + total\_hashes, target\_hash);
munmap(hash\_feed, sb.st\_size);
close(fd);
return 0;
}
```
### 2. 在 Python 中集成(Struct Unpacking)
如果你想使用 Python 读取或查询生成的二进制文件,你可以像这样解包 CVT1 头部:
```
import struct
from pathlib import Path
def parse\_cvt1\_pack(bin\_path: str):
path = Path(bin\_path)
if not path.exists():
return \[]
data = path.read\_bytes()
header\_format = " len(data):
break
hashes.append(data\[offset : offset + hash\_size].hex())
offset += hash\_size
return hashes
```
## 🛠️ 在本地运行基础设施
你可以在本地机器上运行完全相同的管道逻辑,而无需将数据库下载到你的硬盘上。
### 前置条件
pip install requests
### 运行 Carver Stream
python tools/stream_http_hash_filter.py "TARGET_NIST_ZIP_URL" --mode carve --ring-mb 512
注意:在网络管道上处理 100+ GB 数据时,内存分配将安全地维持在你的 --ring-mb 指定的数值附近。
## 🛡️ 维护者与作者
Cemil Emre Bıyık - 计算机系统与底层安全架构爱好者。
## 📄 许可证
该项目基于 MIT 许可证授权 - 有关详细信息,请查看 LICENSE 文件。
标签:UML, 二进制解析, 内存计算, 哈希校验, 白名单, 自动化流水线, 逆向工具