mandiant/capa-rules
GitHub: mandiant/capa-rules
Mandiant capa 工具的标准规则集合,用于自动识别和枚举程序(尤其是恶意软件)的功能与行为能力。
Stars: 726 | Forks: 238
# capa rules
[](https://github.com/mandiant/capa-rules/actions?query=workflow%3A%22CI%22)
[](rules)
[](LICENSE.txt)
这是 [capa](https://github.com/mandiant/capa) 的标准规则集合,capa 是一个用于自动识别程序功能的工具。
## 理念
编写规则应该简单且有趣!
庞大的规则库会使社区中的每个人受益,我们鼓励各种形式的贡献。
无论何时你在恶意软件中发现有趣的东西,我们都希望你能考虑用 capa 规则将其表达出来。
然后,我们会尽可能让你轻松地在这里分享你的规则,并将其分发给 capa 用户。
## 规则开发
capa 使用一系列规则来识别程序内的功能。
这些规则很容易编写,即使是逆向工程的新手也是如此。
通过编写规则,你可以扩展 capa 识别的功能。
在某些方面,capa 规则是 OpenIOC、Yara 和 YAML 格式的混合体。
这是一个 capa 规则的示例:
```
rule:
meta:
name: create reverse shell
namespace: communication/c2/shell
authors:
- moritz.raabe@mandiant.com
scopes:
static: function
dynamic: span of calls
att&ck:
- Execution::Command and Scripting Interpreter::Windows Command Shell [T1059.003]
mbc:
- Impact::Remote Access::Reverse Shell [B0022.001]
examples:
- C91887D861D9BD4A5872249B641BC9F9:0x401A77
features:
- or:
- and:
- match: create pipe
- api: kernel32.PeekNamedPipe
- api: kernel32.CreateProcess
- api: kernel32.ReadFile
- api: kernel32.WriteFile
- and:
- match: host-interaction/process/create
- match: read pipe
- match: write pipe
- and:
- match: create pipe
- match: host-interaction/process/create
- or:
- basic block:
- and:
- count(api(SetHandleInformation)): 2 or more
- number: 1 = HANDLE_FLAG_INHERIT
- call:
- and:
- count(api(SetHandleInformation)): 2 or more
- number: 1 = HANDLE_FLAG_INHERIT
```
capa 在检查可执行文件时会解析这些规则的内容。
如果你遵循此规则格式的指导原则,就可以教会 capa 识别新的功能。
[doc/format.md](./doc/format.md) 文件准确描述了如何构建规则。
在为 capa 创建规则时,请参考该文档。
## namespace 组织
此仓库的组织结构反映了其所包含规则的 namespace。
capa 使用 namespace 将同类事物分组在一起,特别是在渲染其最终报告时。
namespace 是分层的,因此 namespace 的子级编码了其特定的技术。
简要来说,顶层 namespace 包括:
- [anti-analysis](./anti-analysis/) - 打包、混淆、反分析 (anti-X) 等。
- [collection](./collection/) - 可能被枚举和收集以用于外传的数据。
- [communication](./communication/) - HTTP、TCP、命令与控制 (C2) 流量等。
- [compiler](./compiler/) - 检测构建环境,例如 MSVC、Delphi 或 AutoIT。
- [data-manipulation](./data-manipulation/) - 加密、哈希等。
- [executable](./executable/) - 可执行文件的特征,例如 PE 节或调试信息。
- [host-interaction](./host-interaction/) - 访问或操纵系统资源,例如进程或注册表。
- [impact](./impact/) - 最终目标。
- [internal](./internal/) - capa 内部使用以指导分析。
- [lib](./lib/) - 用于创建其他规则的构建块。
- [linking](./linking/) - 检测依赖项,例如 OpenSSL 或 Zlib。
- [load-code](./load-code/) - 运行时加载和执行代码,例如嵌入的 PE 或 shellcode。
- [malware-family](./malware-family/) - 检测恶意软件家族。
- [nursery](./nursery/) - 尚未完全完善的规则的过渡区。
- [persistence](./persistence/) - 维持访问权限的各种方式。
- [runtime](./runtime/) - 检测语言运行时,例如 .NET 平台或 Go。
- [targeting](./targeting/) - 对特定系统的特殊处理,例如 ATM 机。
随着需求的出现,我们可以轻松添加更多的顶层 namespace。
### 库规则
capa 支持匹配其他规则匹配结果的规则。
例如,以下规则集描述了各种持久化方法。
请注意,如果 `run key` 或 `service` 与样本匹配,则规则 `persistence` 就会匹配。
```
---
rule:
meta:
name: persistence
features:
or:
- match: run key
- match: service
---
rule:
meta:
name: run key
features:
string: /CurrentVersion\/Run/i
---
rule:
meta:
name: service
features:
api: CreateService
```
利用此功能,我们可以将通用逻辑提取到“库规则”中。
这些规则不会作为结果渲染,而是用作创建其他规则的构建块。
例如,在 Windows 上写入文件有很多种方法,
因此以下库规则使得其他规则能够轻松地全面匹配文件写入操作。
```
rule:
meta:
name: write file
lib: True
features:
or:
api: WriteFile
api: fwrite
...
```
设置 `rule.meta.lib=True` 来声明一个 lib 规则,并将该规则文件放入 [lib](./lib/) 规则目录中。
库规则不应包含 namespace。
库规则不会作为结果渲染。
capa 只会尝试匹配被其他规则引用的 lib 规则,
因此定义大量可重用的库规则不会产生任何性能开销。
### 规则过渡区 (nursery)
规则 [nursery](https://github.com/mandiant/capa-rules/tree/master/nursery) 是尚未完全完善的规则的过渡区。尽管元数据可能不完整,但 nursery 规则的逻辑仍应是可靠的。例如,缺少该技术公开实例的规则。
规则引擎会定期匹配 nursery 规则。然而,我们的规则 linter 只会枚举缺失的规则数据,而不会导致 CI 构建失败,因为我们理解该规则尚未完成。
会导致规则被放入 nursery 的情况示例:
- 没有真实世界的示例
- 缺少分类
- (可能)对保真度存疑(例如 RC4 PRNG 算法)
标签:DAST, 云资产清单, 威胁情报, 安全, 开发者工具, 恶意软件分析, 超时处理, 逆向工具, 逆向工程