恶意软件猎人的语言:亲手创建YARA规则

“我怎么知道这个文件是否危险?”

对于安全分析师的永恒问题,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矩阵映射

一行规则可以保护数千台服务器。愿您的第一个签名在主公的安全教室中狩猎成功。️


Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注