Query-farm/vgi-yara
GitHub: Query-farm/vgi-yara
一个基于 Rust 和 yara-x 的 DuckDB VGI worker,让用户能够在 SQL 中直接用 YARA 规则扫描数据与文件以检测恶意软件。
Stars: 0 | Forks: 0
一个用于 DuckDB 的 Query.Farm VGI worker。
# vgi-yara 一个 [VGI](https://query.farm) worker(Rust,编译后的二进制文件),它通过 Apache Arrow 为 DuckDB / SQL 引入了 **YARA 恶意软件扫描** 功能。DuckDB 会启动该 worker 并通过 Arrow IPC 与其通信;这些函数显示在 `yara` catalog,`main` schema 下。这是一个**防御性安全工具**:它根据 [YARA](https://virustotal.github.io/yara/) 规则扫描 数据/文件以检测恶意软件。 规则编译和扫描由 [`yara-x`](https://crates.io/crates/yara-x) 驱动,这是 VirusTotal 官方对 YARA 的**纯 Rust** 重写版本 —— 不依赖原生的 `libyara`/C。 ``` LOAD vgi; ATTACH 'yara' (TYPE vgi, LOCATION './target/release/yara-worker'); SET search_path = 'yara.main'; -- Per-row predicate over a column of blobs/files. SELECT path FROM files WHERE yara_matches(content, 'rule eicar { strings: $a = "EICAR" condition: $a }'); -- First matching rule / how many rules matched. SELECT yara_first_rule(content, $rules) FROM files; -- VARCHAR (NULL if none) SELECT yara_match_count(content, $rules) FROM files; -- INT -- Validate a ruleset compiles. SELECT yara_check('rule r { condition: true }'); -- → true -- Fan one constant blob into its matches (table functions). SELECT * FROM yara_scan(read_blob('sample.bin'), $rules); -- rule | namespace | tags SELECT * FROM yara_string_matches(read_blob('sample.bin'), $rules); -- rule | identifier | offset | matched ``` ## 函数 ### 标量函数 | 函数 | 返回值 | 描述 | | --- | --- | --- | | `yara_matches(data, rules)` | `BOOLEAN` | `data` 是否匹配**任意**规则? | | `yara_first_rule(data, rules)` | `VARCHAR` | 第一个匹配规则的标识符(如果没有则为 `NULL`)。 | | `yara_match_count(data, rules)` | `INT` | 匹配规则的数量。 | | `yara_check(rules)` | `BOOLEAN` | 规则是否能编译?(验证用;永远不会报错)。 | | `yara_version()` | `VARCHAR` | Worker 版本字符串。 | `data` 是一个 `BLOB` 或 `VARCHAR`(要扫描的字节/文本);`rules` 是一个 YARA 规则 源字符串。 ### 表函数 | 函数 | 列 | 描述 | | --- | --- | --- | | `yara_scan(data, rules)` | `rule VARCHAR, namespace VARCHAR, tags VARCHAR[]` | 每个匹配规则对应一行。 | | `yara_string_matches(data, rules)` | `rule VARCHAR, identifier VARCHAR, "offset" BIGINT, matched VARCHAR` | 每个模式(字符串)命中对应一行。 | ## 行为与健壮性 **被扫描的数据是不可信的** —— 顾名思义,它可能是真实的恶意软件: * 格式错误、截断、包含二进制数据或恶意的 blob **绝对不会**导致 worker 崩溃。 扫描是完全的:它只会返回不匹配(`false` / `NULL` / `0` / 无行), 绝不报错。一个好 blob 旁边的坏 blob 依然会产出那个好 blob 的 匹配结果。 * 扫描数据有**上限**(64 MiB):超大的 blob 在扫描前会被截断到上限值, 因此它不会耗尽内存。 * `NULL` 输入 → `NULL` 输出 / 无行。 * **无效的规则源**(用户失误)会在扫描函数中引发明确的 DuckDB 错误,其中 包含编译器诊断信息。相反,对于无法编译的源,`yara_check` 会 返回 `false`(它*就是*那个“能否编译?”的 谓词)。 ## 构建与测试 ``` cargo build --release # build the worker cargo test --workspace --all-features # unit + integration tests cargo clippy --all-targets --all-features -- -D warnings # lint make test-sql # DuckDB SQL end-to-end ``` `make test-sql` 会构建 release 版本的 worker,将 `VGI_YARA_WORKER` 指向它,并 在 `test/sql/` 下运行 [`haybarn-unittest`](https://pypi.org/project/haybarn-unittest/) sqllogictest 测试套件。使用 `uv tool install haybarn-unittest` 安装一次运行程序。 ## 许可协议 * 本 worker:**MIT** — 见 [LICENSE](LICENSE)。 * [`yara-x`](https://crates.io/crates/yara-x)(扫描引擎):BSD-3-Clause。 * [`vgi`](https://crates.io/crates/vgi) / `vgi-rpc`(worker SDK)以及 `arrow-*`:Apache-2.0。 ## 作者与许可 由 [Query.Farm](https://query.farm) 编写。 版权所有 2026 Query Farm LLC - https://query.farm标签:Apache Arrow, DNS信息、DNS暴力破解, DNS 反向解析, DuckDB, IP 地址批量处理, Rust, TLS, YARA规则, 可视化界面, 恶意软件扫描, 网络信息收集, 网络流量审计, 通知系统, 防御工具