“我怎么知道这个文件是否危险?”
对于安全分析师的永恒问题,YARA给出了最优雅的答案。
>
本文涵盖内容
- YARA是什么,以及为什么它是安全分析师的必备工具
- YARA规则的三个核心组成部分 (meta, strings, condition)
- 从创建样本文件、提取签名到编写检测规则的完整过程
- 如何运行规则并验证是否实际发生匹配
- 现场常见陷阱和规避技术
引言 — 为什么选择YARA
想象一下,恶意软件分析师的桌上放着一个可疑文件。杀毒引擎保持沉默,用哈希值在VirusTotal上搜索也没有发现任何特别信息。然而,总感觉有些不对劲。这时,分析师会问:“这个文件的哪一部分是恶意软件的痕迹?如果出现类似文件,我该如何捕获它们?”
YARA正是为了回答这个问题而诞生的。由VirusTotal的Victor Alvarez创建的这个工具,简化了”用人类可读的规则描述恶意软件模式,并用这些规则快速扫描文件、内存和进程”的任务。如今,几乎所有的安全厂商、EDR解决方案和威胁情报平台都在内部使用YARA。

YARA规则的解剖
YARA规则就像一张搜查令。它由三部分组成:寻找谁 (meta)、用什么线索寻找 (strings)、以及在什么条件下逮捕 (condition)。
1) meta — 规则的身份证
此区域记录规则的名称、作者、描述、参考资料等。它不影响检测行为,但对于协作和维护至关重要。
2) strings — 检测线索
定义要查找的模式。有三种形式:
- 文本字符串: “powershell -enc” — 普通ASCII/UTF-8字符串
- 16进制字节: { 4D 5A ?? ?? 50 45 } — 像PE文件魔术字节一样的二进制模式 (??是通配符)
- 正则表达式: /cmd.exes+/c/i — 灵活的模式匹配
3) condition — 匹配规则
明确指定strings区域中定义的线索在何种条件下组合才被视为检测。可以自由使用and、or、not、计数比较、文件大小条件等。
实践 — 从文件创建到检测
步骤0. 安装YARA
# Ubuntu / Debian
sudo apt update && sudo apt install -y yara
# macOS (Homebrew)
brew install yara
# 检查安装
yara --version
步骤1. 创建检测目标样本文件
我们来创建一个用于实践的无害文件。假设它是一个虚拟的”可疑脚本”。我们绝不使用实际的恶意软件,而是使用我们自己植入签名的虚拟文件。
cat > suspicious_sample.txt << 'EOF'
#!/bin/bash
# Internal task runner v1.0
TASK_ID=ACME-EDU-2026
echo "Starting backup process..."
curl -s http://example-edu-lab.local/healthcheck
echo "Token: EDULAB_SIGNATURE_TOKEN_42"
exit 0
EOF
请注意此文件的两个特点:标识符ACME-EDU-2026和令牌EDULAB_SIGNATURE_TOKEN_42。如果这两个字符串同时出现,我们就能准确识别这组文件。
步骤2. 提取签名
决定从样本文件中选取哪些模式作为线索。使用`strings`命令查看候选模式。
strings suspicious_sample.txt | head -20
分析师根据以下三个标准选择签名:
- 唯一性: 它是否是普通文件中很少出现的字符串?
- 稳定性: 即使出现变种,该模式是否仍能保持?
- 组合性: 能否与其他模式结合以减少误报?
在这里,我们选择ACME-EDU-2026、EDULAB_SIGNATURE_TOKEN_42以及shell脚本的魔术字节 #!/bin/bash。
步骤3. 编写YARA规则
现在,我们来编写实际的规则。文件名设为`edulab_detector.yar`。
rule EDULAB_Suspicious_Script
{
meta:
author = "주군의 보안 강의실"
description = "EDULAB 식별자와 토큰을 포함한 셸 스크립트 탐지"
date = "2026-05-23"
version = "1.0"
severity = "medium"
reference = "internal-training-only"
strings:
$magic = "#!/bin/bash"
$id = "ACME-EDU-2026" ascii
$token = "EDULAB_SIGNATURE_TOKEN_42" ascii
$hex_sig = { 23 21 2F 62 69 6E 2F 62 61 73 68 } // "#!/bin/bash"的十六进制
condition:
filesize < 10KB
and $magic at 0
and all of ($id, $token)
}
逐行解释规则的condition部分。
- filesize < 10KB — 将检查范围缩小到小型脚本。这有助于提高性能和准确性。
- $magic at 0 — 文件偏移量0处必须是 #!/bin/bash。也就是说,它必须是一个真正的shell脚本。
- all of ($id, $token) — 标识符和令牌必须都存在才能匹配。
这三个条件通过and连接,确保只包含bash字符串的普通脚本不会被捕获。
步骤4. 规则验证与扫描
首先,验证您编写的规则的语法。
# 仅执行语法验证
yara -w edulab_detector.yar suspicious_sample.txt
# 也输出匹配的字符串
yara -s edulab_detector.yar suspicious_sample.txt
如果编写正确,将显示类似以下的结果:
EDULAB_Suspicious_Script suspicious_sample.txt
0x0:$magic: #!/bin/bash
0x35:$id: ACME-EDU-2026
0xa9:$token: EDULAB_SIGNATURE_TOKEN_42
每行显示匹配的偏移量和实际匹配的字节序列。分析师可以通过此输出一目了然地了解”在哪里、什么、如何”被捕获。
步骤5. 扫描整个目录
在实际操作中,您将扫描整个目录树。
# 递归扫描/var/log下的所有文件
yara -r edulab_detector.yar /var/log
# 若要一次性应用规则目录中的所有.yar文件
yara -r rules_dir/ /target/path
⚠️ 注意事项 — 现场遇到的陷阱
- 误报炸弹: 像 `$short = “GET”` 这样过短且常见的字符串几乎会匹配所有文件。建议使用至少7-8字节的唯一序列。
- 编码缺失: Windows恶意软件通常以UTF-16 (wide) 存储字符串。应同时指定,例如 `$str = “malware” ascii wide`,以避免遗漏。
- 签名规避: 如果攻击者将字符串拆分或进行XOR编码,简单的字符串匹配将失效。此时,请考虑使用16进制模式或利用pe模块进行基于结构的检测。
- 性能负担: 过多的正则表达式会急剧降低扫描速度。如果可能,优先使用简单字符串和hex模式,将正则表达式作为最后的手段。
- 伦理边界: 处理实际恶意软件时,务必使用隔离的分析环境 (沙盒、虚拟机),除教育、研究目的外,禁止分发。
✅ 总结 — 猎人的第一步
YARA不仅仅是一个工具,它更是安全分析师的语言。以人类可读的形式描述可疑模式,与同事共享,并将其纳入自动化流程——所有这些都始于这个小小的规则文件。
今天,我们从头到尾创建了一个最基本的规则。如果您想进入下一步,请遵循以下路径:
- 利用pe, elf, hash, math模块 — 基于结构和基于熵的检测
- YARA-X (用Rust重写的下一代引擎) 性能比较
- 将floss, capa自动提取的模式转换为规则的工作流程
- Sigma → YARA转换,ATT&CK矩阵映射
一行规则可以保护数千台服务器。愿您的第一个签名在主公的安全教室中狩猎成功。️

发表回复