YARA Rules Storage

Best Practices for Writing YARA Rules

Здесь будут рекомендации и примеры написания YARA правил.

1. Naming Conventions

Используйте осмысленные имена для правил...

2. String Management

Группируйте строки логически...

3. Performance Tips

Минимизируйте использование регулярных выражений...

4. Metadata

Добавляйте поля author, date, description и reference...

Структура правила (оформление)

import "pe"

import "hash"

rule family_example : trojan windows

{

meta:

author = "analyst_name@soc"

date = "2025-10-30"

description = "Detects malware family XYZ v2"

reference = "internal ticket 123 / VT sample abc"

hash_sha256 = "deadbeef..."

confidence = "high"

strings:

$str1 = "Global\\cfg_mutex_abc" ascii

$str2 = "POST /beacon" ascii

$str3 = { 8B FF 55 8B EC 6A ?? 68 ?? ?? ?? ?? } // mask allowed

$c2_ua = "Mozilla/5.0 (Windows NT 6.1)" wide ascii

condition:

(pe.is_pe and filesize < 2MB) and

2 of ($str*) and

pe.imports("ws2_32.dll", "connect") and

hash.sha256(pe.section_offset(".text"), pe.section_size(".text")) == "abcdef..."

}

✅ Комментарии и теги помогают:

Быстро понять тип правила (: trojan windows).

Отслеживать в системе управления (SOC, MISP, SIEM).

🔹 3. Правильная работа со строками

💡 Как выбирать строки:

Только уникальные, статичные, осмысленные строки (имена C2, mutex, функции, ошибки).

Избегай коротких слов < 4–5 символов, особенно exe, url, get, init.

Избегай строк из стандартных библиотек, API и общих путей (C:\Windows\System32\...).

Если строка может быть в разных кодировках (ASCII/UTF-16) — добавь ascii wide.

💡 Как именовать:

$cfg_ — строки из конфигурации

$net_ — сетевые артефакты

$func_ — функции

$misc_ — прочие

💡 Логика условия:

condition:

3 of ($cfg*, $net*, $func*)

Так проще расширять и модифицировать правило.

🔹 4. Работа с бинарными паттернами (byte patterns)

Используй, если:

строк нет (упакованные бинарники);

есть уникальные фрагменты кода.

Рекомендации:

маскируй переменные байты: ??;

не делай сигнатуру длиннее 32 байт без нужды;

начинай с пролога функции или уникальной константы.

Пример:

$code_init = { 55 8B EC 83 EC ?? C7 45 ?? 01 00 00 00 }

🔹 5. Используй встроенные модули (pe, elf, hash, math, cuckoo)

// Проверка типа файла

pe.is_pe

elf.type == elf.ET_EXEC

// Проверка секций

pe.number_of_sections == 4

pe.section_name(1) == ".text"

// Проверка импорта

pe.imports("wininet.dll", "InternetOpenA")

// Проверка энтропии

math.entropy(pe.section_offset(".text"), pe.section_size(".text")) > 6.5

// Проверка хеша секции

hash.sha256(pe.section_offset(".text"), pe.section_size(".text")) == "abc..."

📌 Зачем: модули делают правило контекстным и снижают ложные срабатывания.

🔹 6. Минимизируй ложные срабатывания (FP)

Ограничивай тип файла: pe.is_pe, filesize < 2MB.

Используй минимальные условия: any of ($str*) — плохо; 3 of ($str*) — лучше.

Проверяй правило на:

в стандартных бинарях Windows/Linux,

офисных документах,

популярных утилитах.

Храни whitelist (MD5/SHA256) для известных ложных файлов.

🔹 7. Проверяй, тестируй, версионируй

Прогоняй правила на датасетах с “чистыми” файлами (/usr/bin, C:\Windows\System32).

Веди changelog в комментариях:

// v1.2: добавлены строки $net1, $cfg3, уменьшено число совпадений до 2

Проверяй правила на платформе Yaraify, VT Hunting, Loki (open-source сканер от Florian Roth).

🔹 8. Используй metadata для совместимости и автоматизации

meta:

author = "SOC Analyst"

description = "Detects XYZ loader"

reference = "https://example.com/analysis"

confidence = "medium"

date = "2025-10-30"

version = "1.1"

👉 В SOC и ThreatIntel эти поля читаются парсером, поэтому:

confidence → влияет на приоритет алерта,

version → контроль изменений,

reference → ссылка на отчет/внутренний кейс.

🔹 9. Разделяй правила по назначению

Категория Префикс Пример

IOC (точное) ioc_ ioc_xyz_sha256

Семейство family_ family_xyz_loader

Хантинг / эвристика hunt_ hunt_susp_pe_shellcode

Utility / базовые util_ util_detect_upx

Это помогает управлять ими через CI/CD и SIEM.

🔹 10. Используй «rule hygiene»

Все строки → в strings: Не хардкодь данные в condition: Комментируй важные условия Не дублируй одинаковые правила под разными именами Проверяй синтаксис перед коммитом: yara -r -W -p 8 rulefile.yar . 🔹 11. Автоматизация генерации Используй утилиты, но только как стартовую точку, не финал: yarGen.py — извлекает уникальные строки и создает шаблон. yaralyzer — GUI-анализатор правил. yarabuilder — CLI-конструктор.

🔹 12. Пример хорошего баланса

ule trojan_xyz_loader : trojan windows

{

meta:

author = "SOC Team"

version = "1.3"

confidence = "high"

reference = "internal ticket #934"

date = "2025-10-30"

import "pe"

import "hash"

strings:

$cfg_mutex = "Global\\mutex_xyz" ascii

$url1 = "https://update.xyz-server.com/api" ascii wide

$code_sig = { 55 8B EC 83 EC ?? C7 45 ?? 01 00 00 00 8B 4D }

$str_ver = "Loader v2.3" ascii

condition:

pe.is_pe and filesize < 3MB and

(2 of ($cfg*, $url*, $str*)) and

pe.imports("wininet.dll", "InternetOpenA") and

hash.sha256(pe.section_offset(".text"), pe.section_size(".text")) == "abc123..."

}