Синтаксис правил YARA
Строки, условия и метаданные
«Синтаксис правил YARA» — бесплатный урок Cyber Security Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Cyber Security Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Cyber Security Academy содержит 4 уроков всего.
Три раздела
Правило YARA имеет имя и до трёх разделов: meta, strings и condition. Условие — единственный обязательный раздел, но в реальных правилах используются все три.
rule Example_Malware
{
meta:
author = "analyst"
description = "Detects Example family"
strings:
$a = "EvilConfig"
$b = { 6A 40 68 00 30 00 00 }
condition:
$a and $b
}Раздел метаданных
meta содержит описательные метаданные, которые не влияют на сопоставление, но крайне важны для первичного анализа и сопровождения.
author,date,descriptionreference— ссылка на отчёт или рекомендациюhash— образец или образцы, на основе которых создано правилоtlp— категория совместного использования
Значения могут быть строками, целыми числами или логическими значениями. Рассматривайте метаданные как документацию: следующий специалист по реагированию будет на них полагаться.
Текстовые строки
Раздел strings определяет идентификаторы (начинающиеся с $), связанные с шаблонами. Самый простой вариант — строка текста в кавычках.
Модификаторы уточняют сопоставление:
nocase— без учёта регистраwide— UTF-16 (два байта на символ, часто используется в Windows)ascii— ASCII (по умолчанию; объединяйте с wide, чтобы сопоставлять оба варианта)fullword— сопоставлять только целое слово
strings:
$s1 = "cmd.exe /c" nocase
$s2 = "InjectDll" wide ascii
$s3 = "admin" fullwordШестнадцатеричные строки
Для двоичных шаблонов используйте шестнадцатеричную строку в фигурных скобках. Такие строки сопоставляются с необработанными байтами и идеально подходят для кодов операций, сигнатурных чисел и структур.
Шестнадцатеричные строки поддерживают гибкость:
??— подстановочный полубайт или байт[n-m]— переход через от n до m произвольных байтов( A | B )— альтернативные варианты
strings:
$h1 = { 4D 5A 90 00 }
$h2 = { E8 ?? ?? ?? ?? 83 C4 04 }
$h3 = { 6A 00 [2-6] FF 15 ?? ?? ?? ?? }
$h4 = { ( B8 | B9 ) 00 00 00 00 }Регулярные выражения
YARA поддерживает шаблоны регулярных выражений, заключённые в косые черты, с теми же модификаторами, что и текстовые строки. Используйте регулярные выражения, когда шаблон может различаться, но сохраняет определённую структуру, например маркер конфигурации или сгенерированное имя мьютекса.
Регулярные выражения обладают большими возможностями, но требуют много ресурсов; по возможности предпочитайте фиксированные строки или шестнадцатеричные последовательности и жёстко ограничивайте регулярное выражение привязками, чтобы не сканировать весь файл.
strings:
$re1 = /mutex_[a-f0-9]{8}/ nocase
$re2 = /https?:\/\/[a-z0-9]{12,20}\.top\// asciiРаздел условий
condition — логическое выражение, определяющее совпадение. Ссылайтесь непосредственно на идентификаторы строк: отдельное $a имеет значение true, если строка найдена.
Объединяйте их с помощью and, or, not и скобок. Здесь задаётся логика, которая отличает настоящее совпадение с семейством от случайного совпадения.
condition:
$a and ($b or $c) and not $benignПодсчёт и множества
YARA предоставляет выразительные кванторы для множеств строк:
any of them/all of them2 of ($s*)— как минимум два элемента группы#a > 3— количество совпадений $a превышает 3
Так можно потребовать, например, три из пяти маркеров семейства, находя баланс между чувствительностью и числом ложных срабатываний.
condition:
3 of ($str*) and #marker >= 2Смещения и размер файла
Условия могут учитывать где происходит совпадение, а также размер файла:
$a at 0— совпадение должно находиться по смещению 0$a in (0..1024)— в пределах диапазона байтовfilesize— общий размер, напримерfilesize < 200KBuint16(0) == 0x5A4D— чтение целого числа по смещению, здесь — заголовка MZ
Привязка совпадений к позиции значительно сокращает число ложных срабатываний и ускоряет сканирование.
condition:
uint16(0) == 0x5A4D and filesize < 500KB and $payloadМодули
Модули YARA предоставляют структурированные данные с учётом формата, поэтому условия могут работать с разобранными полями, а не с необработанными байтами.
pe— PE imports, секции, точка входа, подписи, imphashhash— вычисление md5/sha256 для областейmath— entropy и статистикаelf,dotnet,magic
Например, импорт pe позволяет искать импортированные функции или определённый imphash, что намного надёжнее буквального поиска строки.
import "pe"
condition:
pe.imphash() == "a1b2c3d4e5f6..." and
pe.imports("kernel32.dll", "VirtualAllocEx")Перебор множеств
Для более сложной логики YARA поддерживает циклы по коллекциям с помощью for. Можно задать условия вроде «как минимум два из этих смещений обладают определённым свойством» или «имя любой секции соответствует шаблону».
Это необходимо при работе с данными модулей, например с секциями PE или imports, когда нужно проверить список переменной длины, а не одно значение.
import "pe"
condition:
for any i in (0..pe.number_of_sections - 1) : (
pe.sections[i].name == ".evil"
)Глобальные, приватные правила и теги
Ключевые слова на уровне правила организуют набор правил:
global rule— его условие ограничивает действие всех остальных правил в файле, например разрешает сканировать только файлы PEprivate rule— повторно используемый строительный блок, который сам по себе не сообщается, но может быть использован другими правилами- теги после имени правила классифицируют совпадения, например для фильтрации результатов
global private rule IsPE { condition: uint16(0) == 0x5A4D }
rule Dropper : trojan dropper {
strings: $a = "drop_payload"
condition: $a
}Быстрая проверка
Оцените надёжность условия.
Итоги
Синтаксис правил YARA в одном обзоре:
- Правило rule =
meta+strings+condition - Текстовые строки с модификаторами без учёта регистра, широкого формата, ASCII и целого слова
- Шестнадцатеричные строки с подстановками
??, переходами[n-m]и вариантами - Регулярные выражения для структурированных шаблонов переменной формы, используйте их умеренно
conditionобъединяет строки логическими операторами И, ИЛИ и НЕ- Кванторы: любое/все/N из, а также счётчик
#a - Привязка: позиция, диапазон, размер файла и чтение целых чисел
- Модули (pe, hash, math) сопоставляют структурированные данные и imphash
global,privateи теги организуют наборы правил
Далее: практический поиск с помощью строк и шестнадцатеричных шаблонов.
Часто задаваемые вопросы
Урок «Синтаксис правил YARA» бесплатный?
Да — полный текст урока «Синтаксис правил YARA» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Cyber Security Academy, подпишись на CoddyKit PRO. Курс Cyber Security Academy содержит 4 уроков всего.
Чему я научусь в уроке «Синтаксис правил YARA»?
Строки, условия и метаданные Ты практикуешь Cyber Security Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Cyber Security Academy?
Предыдущий опыт не требуется. Cyber Security Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Синтаксис правил YARA»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Cyber Security Academy?
Да. Каждый урок Cyber Security Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Для чего нужен YARA
- Синтаксис правил YARA
- Поиск по строкам и шестнадцатеричным данным
- Масштабирование и автоматизация сканирования