Query-farm/vgi-ioc

GitHub: Query-farm/vgi-ioc

为 DuckDB 提供 IOC 提取与 defang/refang 转换能力的 Rust worker,使安全分析师能直接在 SQL 中从自由文本里解析网络威胁指标。

Stars: 0 | Forks: 0

Vector Gateway Interface (VGI)

一个用于 DuckDB 的 Query.Farm VGI worker。

# vgi-ioc 一个 [VGI](https://query.farm) worker(Rust,已编译的二进制文件),它将**网络威胁指标(IOC)提取与解除防护/重新防护(defanging/refanging)**引入 DuckDB / 基于 Apache Arrow 的 SQL。DuckDB 会启动该 worker 并通过 Arrow IPC 与其通信;这些函数位于 `ioc` catalog 和 `main` schema 下。 这是一个**防御性 CTI 工具**:它从自由文本的威胁报告中解析出指标(IP、域名、URL、电子邮件、文件哈希、CVE),并在其*活跃*形式与*解除防护*(defanged,例如 `hxxp://evil[.]com`)的形式之间进行转换。它是纯粹的文本处理——无需网络访问,也没有原生依赖。 ``` LOAD vgi; ATTACH 'ioc' (TYPE vgi, LOCATION './target/release/ioc-worker'); SET search_path = 'ioc.main'; -- Make an indicator safe to paste into a report. SELECT defang('http://evil.com/x'); -- → 'hxxp[://]evil[.]com/x' -- Turn a defanged indicator back into live form. SELECT refang('hxxp://evil[.]com'); -- → 'http://evil.com' -- Pull indicators out of a (defanged) report. Extractors refang internally. SELECT UNNEST(extract_ipv4('beacon from 10[.]0[.]0[.]5')); -- → '10.0.0.5' SELECT UNNEST(extract_cves('exploiting CVE-2024-1234')); -- → 'CVE-2024-1234' -- Classify a hash by length. SELECT hash_type('d41d8cd98f00b204e9800998ecf8427e'); -- → 'md5' -- Does this text contain any IOC? SELECT is_ioc('CVE-2021-44228 in the logs'); -- → true -- Every distinct IOC as typed rows (table function). SELECT type, value FROM extract_iocs('beacon to hxxp://evil[.]com from 10[.]0[.]0[.]5') ORDER BY type, value; -- type | value -- ipv4 | 10.0.0.5 -- url | http://evil.com ``` ## 函数 ### 标量 | 函数 | 返回值 | 描述 | | --- | --- | --- | | `defang(text)` | `VARCHAR` | 对指标进行解除防护:`http`→`hxxp`, `.`→`[.]`, `@`→`[at]`, `://`→`[://]`。 | | `refang(text)` | `VARCHAR` | `defang` 的逆操作(支持识别常见的社区约定)。 | | `extract_ipv4(text)` | `VARCHAR[]` | IPv4 地址(包括私有/保留地址)。 | | `extract_ipv6(text)` | `VARCHAR[]` | IPv6 地址(规范化的)。 | | `extract_domains(text)` | `VARCHAR[]` | 纯域名(不包括 URL/电子邮件的主机——参见策略)。 | | `extract_urls(text)` | `VARCHAR[]` | `http(s)://` / `ftp://` URL。 | | `extract_emails(text)` | `VARCHAR[]` | 电子邮件地址。 | | `extract_hashes(text)` | `VARCHAR[]` | MD5 / SHA1 / SHA256 文件哈希。 | | `extract_cves(text)` | `VARCHAR[]` | CVE 标识符(`CVE-YYYY-NNNN+`)。 | | `hash_type(s)` | `VARCHAR` | 根据长度返回 `'md5'` / `'sha1'` / `'sha256'` / `'sha512'`,否则返回 `NULL`。 | | `is_ioc(text)` | `BOOLEAN` | 文本是否包含**任何**可识别的 IOC。 | | `ioc_version()` | `VARCHAR` | Worker 版本字符串。 | ### 表 | 函数 | 列 | 描述 | | --- | --- | --- | | `extract_iocs(text)` | `"type" VARCHAR, value VARCHAR` | 每个 IOC 对应一行去重后的结果;`type` ∈ {ipv4, ipv6, url, email, domain, md5, sha1, sha256, sha512, cve}。 | ## 提取前重新防护(Refang-before-extract) CTI 报告通常会对指标进行解除防护(defang),以便安全地分享,例如 `hxxp://evil[.]example[.]com/path`、`10[.]0[.]0[.]5`、`bad[at]evil[.]com`。直接对原始文本进行提取的简单工具会漏掉所有这些内容。 **因此,每个提取器以及 `is_ioc` / `extract_iocs` 都会先对输入的副本执行 `refang`**,然后再匹配真实的指标。`defang` 和 `refang` 本身是唯一不先执行 refang 的函数(它们*本身就是*防护处理步骤)。这意味着你可以直接将原始被解除防护的报告输入给 `extract_ipv4(...)` / `extract_iocs(...)`,并获取活跃的指标。 ## 误报策略 - **重叠。** 如果一个纯域名已经是被提取 URL 的主机,或者是被提取电子邮件的域名部分,则**不会**再作为独立的 `domain` 被报告。URL 和电子邮件“占据”了它们的主机,因此 `extract_iocs` 绝不会在两种类型下重复报告同一个主机。 - **保留私有 / 保留 IP。** `10.x`、`192.168.x`、`127.0.0.1` 等在报告中是真实的指标(内部枢纽节点、受感染主机上的 C2)。如果你只想要可路由的地址,请在 SQL 中过滤它们。 - **TLD 合理性。** 域名必须以长度 ≥ 2 的字母 TLD 结尾,这避免了匹配大多数版本号字符串和文件名。这是一种启发式方法。 - **输入是有界的。** 每个单元格最多扫描 4 MiB;超出此长度的文本会在 UTF-8 边界处被截断后再进行匹配,因此恶意的输入不会导致无限制的资源消耗。该 worker 在任何输入下都不会发生 panic。 ## NULL 处理 `NULL` 文本会返回 `NULL`(对于标量函数)或不返回任何行(对于 `extract_iocs`)。对于 `VARCHAR[]` 提取器,输入 `NULL` → 输出 `NULL` 列表;没有匹配项的文本 → 返回一个**空**列表(而不是 `NULL`)。 ## 构建与测试 ``` cargo build --release # produces target/release/ioc-worker cargo test --workspace # pure-Rust + Arrow-boundary unit/integration tests make test-sql # DuckDB sqllogictest E2E (needs haybarn-unittest) make lint # clippy -D warnings + rustfmt --check ``` SQL E2E 测试套件使用了 [`haybarn-unittest`](https://pypi.org/project/haybarn-unittest/) (通过 `uv tool install haybarn-unittest` 安装)。 ## 许可证 MIT © Query Farm LLC ## 作者与许可证 由 [Query.Farm](https://query.farm) 编写。 版权所有 2026 Query Farm LLC - https://query.farm
标签:DuckDB, IOC提取, Rust, 可视化界面, 威胁情报, 开发者工具, 数据库扩展, 网络流量审计, 通知系统