vthib/boreal

GitHub: vthib/boreal

一个由 Rust 构建的高性能 YARA 规则评估引擎,旨在作为原版工具的安全替代方案,完全兼容现有规则并优化了扫描逻辑。

Stars: 68 | Forks: 5

# boreal [![构建状态](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/73449571be143630.svg)](https://github.com/vthib/boreal/actions/workflows/ci.yml) [![Crates.io](https://img.shields.io/crates/v/boreal.svg)](https://crates.io/crates/boreal) [![文档](https://docs.rs/boreal/badge.svg)](https://docs.rs/boreal) [![覆盖率](https://codecov.io/gh/vthib/boreal/branch/master/graph/badge.svg?token=FVI7Z45KFW)](https://codecov.io/gh/vthib/boreal) Boreal 是一个 [YARA](https://virustotal.github.io/yara/) 规则评估器,用于扫描字节以查找文本和二进制模式,主要用于恶意软件检测。 ## 描述 Boreal 旨在成为 YARA 的直接替代品,同时也增加了一些改进。 该项目的主要目标是: * 与 YARA 规则完全兼容 * 只为你使用的功能付费 * 改进性能和可靠性 ## 特性 * 与 YARA 4.5.5 及所有[官方模块](#modules)完全兼容。任何现有规则均可直接使用。 * 避免在不需要时扫描字符串,从而大大减少精心设计的规则的执行时间。请参阅 [no scan optimization](#no-scan-optimization)。 * 防止任何不受信任的输入(无论是规则还是被扫描的字节)造成影响。设计不当的规则或输入绝不应导致崩溃或性能下降。 * 在大多数情况下性能有所提升,尤其是在使用数百条规则时。 详情请参阅 [benchmarks](/benches/README.md)。 * 支持 Windows、Linux 和 macOS 上的进程扫描,并提供不同的扫描模式。请参阅 [FragmentedScanMode 文档](https://docs.rs/boreal/latest/boreal/scanner/struct.FragmentedScanMode.html)。 * 可以针对不同情况优化规则,优先考虑扫描速度或内存消耗。 * 纯 Rust 实现,没有 OpenSSL 等 C 语言依赖,因此在任何目标平台上都非常容易构建和使用。 唯一的例外是 magic 模块,它需要 libmagic。 * 支持所有 YARA 功能。这包括所有官方模块、序列化为字节等。 ## 安装与使用 Boreal 可通过以下方式使用: - 作为 Rust 库,提供 libyara 中所有可用的功能和配置以及一些额外的功能。 - 作为命令行工具,复制了 yara CLI 工具的相同标志和调用方式。因此它可以直接替代 yara CLI 工具。 - 作为 Python 库,以 100% 的兼容性复制 yara python 库的 API 和对象。 更多详情请参阅 [python 库文档](https://vthib.github.io/boreal/boreal-py/dev/)。 命令行工具可以从源代码构建: ``` > cargo install --locked boreal-cli ``` 并且使用与 yara 可执行文件相同的标志和语法: ``` > ./boreal path/to/rules path/to/dir rule_1 path/to/dir/suspicious_file ``` Boreal 也可以作为库使用,请查看[文档](https://docs.rs/boreal)。 如果你曾经将 YARA 或 Yara-Rust 作为库使用过,这个 API 应该会让你感到熟悉: ``` use boreal::Compiler; let mut compiler = Compiler::new(); compiler.add_rules_str(r#" rule example { meta: description = "This is an YARA rule example" date = "2022-11-11" strings: $s1 = { 78 6d 6c 68 74 74 70 2e 73 65 6e 64 28 29 } $s2 = "tmp.dat" fullword wide condition: any of them } "#)?; let scanner = compiler.finalize(); let res = scanner.scan_mem(b"<\0t\0m\0p\0.\0d\0a\0t\0>\0"); assert!(res.matched_rules.iter().any(|rule| rule.name == "example")); ``` ### Yara 兼容性 Boreal 保证所有有效且可由 YARA 运行的规则都将被接受,并表现出相同的行为。 这是通过运行 YARA 仓库中的测试以及添加许多其他测试来保证的,所有这些测试都在 boreal 和 YARA 上运行,以保证完全相同的行为。 然而,这种兼容性也有一些例外: * 溢出或下溢。这些未由 YARA 指定,实际上,有符号溢出本身就是 UB(未定义行为)。 在 boreal 中,溢出/下溢的评估行为不再是 UB,但目前尚未指定。 * 针对恶意规则的防御性限制。Boreal 设置了限制,以确保不可能编写 可能导致解析或评估该规则的程序出现问题的规则。虽然这些限制 在技术上确实拒绝了 YARA 会接受的规则,但这些限制不应影响正常的 规则。 此外,目前 YARA 和 boreal 之间存在一个评估差异: * 依赖于自身的规则不再编译。 ``` rule my_rule { condition: my_rule } ``` 在 YARA 中,这是有效的,并且总是评估为 false。在 Boreal 中,此规则无法编译。 目前没有计划修复此行为,因为我认为它没有有效的用例,而且修复它并不是 免费的。但是,如果有人能提供有效的用例,则可以解决此差异。 #### 模块 - [x] elf (通过 _object_ feature) - [x] hash (通过 _hash_ feature) - [x] math - [x] macho (通过 _object_ feature) - [x] pe (通过 _object_ feature) - `pe.imphash()` 位于 _hash_ feature 之后 - `pe.signatures` 位于 _authenticode_ feature 之后 - `pe.is_signed` 和签名 `verified` 值位于 _authenticode-verify_ feature 之后, 默认禁用。有关更多详细信息,请参阅 [authenticode-verify](#authenticode-verify) 部分。 - [x] dotnet (通过 _object_ feature) - [x] string - [x] time - [x] console - [x] dex (通过 _object_ feature) - [x] magic (通过 _magic_ feature,默认禁用) - [x] cuckoo (通过 _cuckoo_ feature,默认禁用) ## 只为你使用的功能付费 YARA 是一个了不起的软件,但它主要是为最坏的情况设计的。 这导致了许多无用和不必要的工作,并让设计本应非常快速评估的规则的用户感到非常沮丧。 ### 无扫描优化 假设你编写了这条规则: ``` rule should_be_fast { strings: $a = { 10 2d EF CF 29 31 26 } condition: filesize < 50KB and $a } ``` 你可能期望针对一个大目录扫描这条规则会非常快,因为所有大 文件都会被跳过,而无需扫描所有文件的全部内容。 然而,这并不是 YARA 所做的。但在 boreal 中,所有大于 50KB 的文件都不会被扫描,并且对该规则的评估将非常快。 只要所有规则都可以在不需要扫描其字符串的情况下进行评估,此优化就适用。 如果单个规则需要扫描,则将扫描所有规则的所有字符串。 这方面仍有一些工作要做。例如,常见的 “$a at X” 规则尚未 得到正确处理,需要扫描字符串。如果你认为你有一条 不应需要扫描但确实需要的规则,请报告。 ## Crate feature flags ### 默认启用 - `object`:启用 `elf`、`macho`、`pe`、`dotnet` 和 `dex` 模块。 - `hash`:启用 `hash` 模块,以及 `pe.imphash()` 函数(如果 `object` feature 也已启用)。 - `authenticode`:启用 `pe` 模块的 `signatures` 部分。 - `process`:添加进程扫描 API。 - `memmap`:添加使用内存映射扫描文件的 API。 ### 默认禁用 - `profiling`:添加编译和评估期间的统计计算。 - `magic`:启用 `magic` 模块。添加对 libmagic 的依赖。 - `cuckoo`:启用 `cuckoo` 模块。 - `authenticode-verify`:启用 `pe` 模块的 `pe.signed`、`pe.signatures[*].verified` 和 `pe.signatures[*].countersignatures[*].verified` 部分。 - `serialize`:启用将扫描器保存为字节并在另一台计算机上重新加载它们的 API。 请注意,为了使此功能工作,必须在扫描器中保存一些额外的数据, 如果该功能被禁用,则不会保存这些数据。 这种开销取决于所使用的规则类型,但通常在 2% 到 6% 之间。 因此,如果不需要序列化,建议不要启用此功能。 详情请参阅 [benchmarks](/benches/README.md#cost-of-serialize-feature)。 ### `authenticate-verify` YARA 4.3 引入了针对 `pe.signatures` 对象的新解析,特别是 字段 `pe.is_signed`、`pe.signatures[*].verified` 和 `pe.countersignatures[*].verified`。 然而,这些字段会引起一些问题: - 它们可能会令人困惑,因为它们并不表明 Windows 是否真的 认为该文件已签名,因为没有信任锚验证。 - 它们引入了对 OpenSSL 的依赖来进行签名验证,而任何 等效的实现都意味着引入大量的依赖来处理 签名中可以使用的所有不同的算法。 这些字段默认为 `false`。要为它们获取正确的值,有 两种可能性: - 可以启用 `authenticode-verify` feature,但该实现是尽力而为的。 它不依赖于 OpenSSL,而是使用 rust cryptos crates,因此并非 所有算法都已实现,并且可能缺少某些检查。 - 可以在扫描之前提供 `pe.is_signed` 的值。这允许先对样本调用 - `WinVerifyTrust`,然后将其返回的值暴露在 `pe.is_signed` 符号中。有关更多详细信息,请参阅 `pe` 模块文档。
标签:AMSI绕过, API 测试, DNS 反向解析, IP 地址批量处理, Rust, YARA, YARA兼容, 二进制分析, 云安全监控, 云安全运维, 云计算, 云资产可视化, 内存安全, 可视化界面, 威胁检测, 安全扫描, 文档结构分析, 无C依赖, 时序注入, 杀毒引擎, 模式匹配, 网络安全, 网络流量审计, 网页爬虫, 自动化资产收集, 自定义DNS解析器, 规则引擎, 进程扫描, 逆向工具, 通知系统, 隐私保护, 静态分析, 默认DNS解析器