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, 二进制解析, 内存计算, 哈希校验, 白名单, 自动化流水线, 逆向工具