Здесь будут рекомендации и примеры написания YARA правил.
Используйте осмысленные имена для правил...
Группируйте строки логически...
Минимизируйте использование регулярных выражений...
Добавляйте поля 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*) Так проще расширять и модифицировать правило. Используй, если: строк нет (упакованные бинарники); есть уникальные фрагменты кода. Рекомендации: маскируй переменные байты: ??; не делай сигнатуру длиннее 32 байт без нужды; начинай с пролога функции или уникальной константы. Пример: $code_init = { 55 8B EC 83 EC ?? C7 45 ?? 01 00 00 00 } 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..." Ограничивай тип файла: pe.is_pe, filesize < 2MB. Используй минимальные условия: any of ($str*) — плохо; 3 of ($str*) — лучше. Проверяй правило на: в стандартных бинарях Windows/Linux, офисных документах, популярных утилитах. Храни whitelist (MD5/SHA256) для известных ложных файлов. Прогоняй правила на датасетах с “чистыми” файлами (/usr/bin, C:\Windows\System32). Веди changelog в комментариях: // v1.2: добавлены строки $net1, $cfg3, уменьшено число совпадений до 2 Проверяй правила на платформе Yaraify, VT Hunting, Loki (open-source сканер от Florian Roth). meta: author = "SOC Analyst" description = "Detects XYZ loader" reference = "https://example.com/analysis" confidence = "medium" date = "2025-10-30" version = "1.1" confidence → влияет на приоритет алерта, version → контроль изменений, reference → ссылка на отчет/внутренний кейс. Категория Префикс Пример IOC (точное) ioc_ ioc_xyz_sha256 Семейство family_ family_xyz_loader Хантинг / эвристика hunt_ hunt_susp_pe_shellcode Utility / базовые util_ util_detect_upx Это помогает управлять ими через CI/CD и SIEM. 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..." ✅ Комментарии и теги помогают:
💡 Как выбирать строки:
💡 Как именовать:
💡 Логика условия:
🔹 4. Работа с бинарными паттернами (byte patterns)
🔹 5. Используй встроенные модули (pe, elf, hash, math, cuckoo)
// Проверка типа файла
// Проверка секций
// Проверка импорта
// Проверка энтропии
// Проверка хеша секции
📌 Зачем: модули делают правило контекстным и снижают ложные срабатывания.
🔹 6. Минимизируй ложные срабатывания (FP)
🔹 7. Проверяй, тестируй, версионируй
🔹 8. Используй metadata для совместимости и автоматизации
👉 В SOC и ThreatIntel эти поля читаются парсером, поэтому:
🔹 9. Разделяй правила по назначению
🔹 10. Используй «rule hygiene»
Все строки → в strings:
Не хардкодь данные в condition:
Комментируй важные условия
Не дублируй одинаковые правила под разными именами
Проверяй синтаксис перед коммитом:
yara -r -W -p 8 rulefile.yar .
🔹 11. Автоматизация генерации
Используй утилиты, но только как стартовую точку, не финал:
yarGen.py — извлекает уникальные строки и создает шаблон.
yaralyzer — GUI-анализатор правил.
yarabuilder — CLI-конструктор.
🔹 12. Пример хорошего баланса