ChristianPresley/yara-forge-ci
GitHub: ChristianPresley/yara-forge-ci
一个将 YARA 检测规则纳入 CI/CD 流水线的「规则即代码」框架,通过元数据策略、阳性/阴性语料测试和性能预算来保障检测规则的质量。
Stars: 0 | Forks: 0
# yara-forge-ci
**将规则即代码应用于检测工程。** 一个小巧、独立的 YARA 规则
仓库,封装在 CI/测试框架中,该框架会编译每一条规则,强制执行
元数据策略,针对标记为阳性/阴性的语料库测试每条规则,并
防范性能衰退——就像你将应用于
应用代码的规范一样,应用于检测内容。
[](.github/workflows/ci.yml)


## 为什么会有这个项目
检测规则会在不知不觉中失效。上一季度还能编译通过的规则,可能会在
YARA 升级后开始抛出警告;为了减少误报而进行的“快速修复”
可能会悄悄地扼杀一个真正的阳性(true positive);偷懒编写的
正则表达式可能会耗尽整个
集群的扫描时间预算。在威胁情报 / 检测工程的背景下,规则*本身*就是
产品——因此它理应得到我们给予生产代码的同等保障:版本
控制、自动化测试、审查工作流,以及在失败时能大声报错的 CI。
本仓库是这一理念的精简参考实现。每一条规则都附带了一个
证明它能触发的阳性样本,并针对良性软件(goodware)语料库进行了测试,以证明它不会过度触发。这里的一切都不需要真实的恶意软件:
所有的触发样本都是手工制作的、惰性的、合成的测试用例。
## 包含的内容
```
yara-forge-ci/
├── rules/ # 10 original YARA rules, one detection idea each
├── tests/
│ ├── samples/
│ │ ├── positive/ # inert fixtures that SHOULD match a specific rule
│ │ └── negative/ # goodware / FP corpus that must match NOTHING
│ ├── mapping.yml # sample -> expected-rule map + perf budget
│ └── test_rules.py # pytest harness (compile/policy/TP/FP/perf)
├── scripts/
│ └── validate.py # `yforge` CLI dashboard for local iteration
├── .github/workflows/ci.yml # ruff lint + harness on every push/PR
├── pyproject.toml # deps, ruff + pytest config
├── requirements.txt
├── LICENSE # MIT (c) 2026 Christian Presley
└── README.md
```
### 规则集
| 规则 | 检测思路 | ATT&CK | 严重程度 |
|------|----------------|--------|----------|
| `PowerShell_EncodedCommand` | PowerShell `-enc`/`-EncodedCommand` Base64 载荷 | T1059.001 | high |
| `PowerShell_DownloadCradle` | 内存中下载并执行的 cradle(`IEX (New-Object Net.WebClient)...`) | T1059.001 | high |
| `PowerShell_AMSI_Bypass` | 反射式 AMSI 篡改(`amsiInitFailed`,`AmsiScanBuffer` 补丁) | T1562.001 | critical |
| `Webshell_PHP_Eval_Base64` | PHP webshell:通过 `base64_decode($_POST[...])` 传入的 `eval`/`assert` | T1505.003 | high |
| `Webshell_ASPX_CodeExec` | ASPX/JScript webshell,包含中国菜刀 `eval(Request.Item[...])` | T1505.003 | high |
| `Phishing_Kit_CredHarvest_HTML` | 带有发往外部 POST + base64 第二阶段的静态凭据收集页面 | T1566.002 | medium |
| `LNK_ScriptHost_Dropper` | 生成隐藏脚本宿主的快捷方式/容器 dropper | T1204.002 | high |
| `Base64_Encoded_PE_Heuristic` | 以 Base64 blob 形式嵌入在文本载体中的 Windows PE | T1027 | medium |
| `LLM_Jailbreak_PromptInjection` | 不可信文本中已知的越狱(jailbreak)/ 提示词注入(prompt-injection)载荷 | T1204 | medium |
| `Ransomware_Note_Template` | 勒索信特征(加密声明 + 支付渠道 + 威胁) | T1486 | high |
最后两条规则特意侧重于 **AI 滥用检测**——扫描
不可信文本(RAG 语料库、上传文件、支持工单)以寻找提示词注入(prompt-injection)
载荷,并捕获无论是手写还是 LLM 生成的勒索信。这两者都
正是 AI 实验室所关心的内容滥用信号,并且都可以
在没有任何真实恶意软件的情况下进行演示。
## 每条规则必须满足的三个契约
**1. 元数据策略(治理)。** 每条规则都必须包含完整的 meta 块:
```
author, date, description, reference, mitre_attack, severity, version
```
`severity` 必须是 `low | medium | high | critical` 之一。测试框架会
从*已编译*的规则中读取元数据(而不是通过抓取文本),因此该策略无法
通过注释来伪造。缺失或为空的字段会导致构建失败。这使得
规则集具备自我记录的能力,并允许下游工具基于 ATT&CK id / 严重程度进行关联。
**2. 阳性与阴性语料库(准确性)。**
- `tests/samples/positive/` —— 每个文件都是为了
恰好触发一条规则而精心制作的最小的、惰性的样本。`tests/mapping.yml` 记录了哪个样本必须匹配哪条
规则。没有阳性样本的规则会导致**覆盖率门禁**失败。
- `tests/samples/negative/` —— 良性的正常软件(一个管理用的 PowerShell 脚本,一个真实的
联系表单处理器,一个带有密码字段且合法的登录页面,安全
博客文本,一个带有类似 `TVpQ` token 的配置文件)。在这里**任何**匹配都是
误报,并会导致构建失败。有几个阴性样本是故意设计的对抗性样本——
例如,良性的登录页面带有密码字段和 POST 表单,因此它
证明了钓鱼规则的附加条件确实抑制了容易产生的误报(FP)。
**3. 性能预算(成本)。** 每条规则都会(取 3 次中最好的成绩)针对完整的
语料库进行计时,并且必须保持在 `mapping.yml` 中设定的单条规则预算之内(默认为 50 ms)。
这是尽早发现糟糕正则表达式的地方。这些规则本身在编写时就考虑了
性能感知:字符串原子(atom)长度 ≥ 4 字节以实现强大的 Aho-Corasick 匹配,
正则表达式量词是有界的(使用 `.{0,64}` 而不是 `.*`)以避免灾难性
回溯,并且通用 token(如 `eval`、`cmd`)仅用作
辅助条件,绝不会作为唯一的触发条件。
## 设置与使用
```
# 1. Install (a C toolchain may be needed to build yara-python from source;
# most platforms have prebuilt wheels).
python -m pip install -r requirements.txt
# 2. Local dashboard — fast, colorized, per-rule status. Great for iterating.
python scripts/validate.py
# 3. Full CI harness — the authoritative gate (also run in GitHub Actions).
pytest -v
# 4. Lint the Python.
ruff check .
```
`scripts/validate.py` 会打印出每条规则的表格(编译 / 元数据 / 真阳性
/ 误报数 / 扫描时间与预算对比),并在出现任何失败时以非零状态退出,
因此它既可以作为人类查看的仪表盘,也可以作为 CI 的门禁。
## 添加新规则(贡献工作流)
1. **编写规则**,放在 `rules/.yar` 中,包含完整的 meta 块(所有七个
必需的键)。优先使用长且具体的原子;为每个正则表达式量词设定边界。
2. **添加一个阳性样本**到 `tests/samples/positive/` 中 —— 能够合理触发
该规则的最小惰性文件。将其标记为 `SYNTHETIC TEST FIXTURE`。
3. **在 `tests/mapping.yml` 的 `expected_matches` 下注册它**。
4. **对良性软件语料库进行合理性检查。** 如果你的规则有可能产生误报(FP),请在
`tests/samples/negative/` 中添加一个具有代表性的良性文件,这样防护才
是真实有效的。
5. **运行 `python scripts/validate.py` 和 `pytest`**,直到全部通过(变绿),然后提交 PR。
CI 会在推送时重新运行所有内容。
覆盖率门禁确保没有规则能在缺少阳性样本的情况下被合并,而
误报(FP)防护则确保其通过了良性软件的测试。
## 未来工作 / 说明
- **YARA-X。** VirusTotal 在 2025 年用 Rust 重写的引擎([YARA-X](https://virustotal.github.io/yara-x/))
是未来的发展方向:更快的扫描速度,更严格/更清晰的规则语义,
以及维护良好的 `yara-x-py` 绑定。该框架目前故意使用了成熟的
`yara-python`(libyara)绑定,以实现最大的可移植性,但其设计是
引擎无关的——迁移工作主要就是替换 `compile`/`match` 调用并
重新基线化性能预算。在 CI 中增加一条 `yara-x` 矩阵分支是顺理成章的下一步,
此外还要对正则表达式量词语法进行兼容性检查。
- **更丰富的语料库。** 阴性语料库可以扩展成为一个正规的正常软件集
(常见脚本、安装程序、框架文件),以强化误报(FP)防护。
- **规则打包。** 在带标签的发布版本中生成一个已签名、带版本号的规则集包。
- **覆盖率报告。** 将 ATT&CK 技术覆盖率以生成的矩阵形式展示出来。
## 许可证
MIT © 2026 Christian Presley。请参阅 [LICENSE](LICENSE)。
本仓库中的所有样本都是合成的、惰性的,并且都有明确的标签。本
项目**不**包含任何恶意软件,运行它也**不需要**任何恶意软件。
标签:YARA, 云资产可视化, 安全规则引擎, 逆向工具