Сигнатуры и детект: YARA

YARA — язык правил, которым аналитик описывает признаки вредоносного семейства, чтобы автоматически находить его файлы.

YARA — инструмент и язык сигнатур для обнаружения и классификации файлов по содержимому: правило перечисляет характерные строки/байты и логическое условие их срабатывания.

Предыдущие уроки дали нам индикаторы: строки, пути, признаки упаковки, поведение. YARA — это способ зафиксировать их как многоразовое правило обнаружения. Одно хорошее правило ловит не один хеш, а целое семейство и его будущие сборки. Это рабочий инструмент SOC, threat hunting и реверс-инженера. Правила применяют к своим файлам, своей телеметрии и разрешённым коллекциям.

Зачем это знать защитнику

Блок-лист хешей бесполезен против новой сборки — хеш меняется одной перекомпиляцией. YARA смотрит внутрь файла и описывает то, что атакующему менять дороже: характерные строки, структуры, последовательности байтов. Поэтому YARA-правила — стандарт обмена детектами между аналитиками: ими делятся вендоры, CERT и сообщества, ими сканируют файлы на эндпоинтах, дампы памяти и почтовые вложения. Умение читать и писать правила — базовый навык защитника.

Анатомия правила

Правило состоит из трёх частей: meta (описание для людей), strings (искомые признаки) и condition (логика срабатывания). Условие — сердце правила: именно оно решает, когда файл считается совпавшим.

rule Suspicious_Dropper_Demo
{
    meta:
        description = "Учебное правило: демонстрация структуры YARA"
        author      = "analyst"
        reference   = "внутренний разбор образца"

    strings:
        $a = "evil-c2.example" ascii nocase
        $b = "\\AppData\\Roaming\\svhost.exe" ascii
        $hex = { 6A 40 68 00 30 00 00 }   // характерная последовательность байт

    condition:
        uint16(0) == 0x5A4D       // файл начинается с "MZ" (PE-исполняемый)
        and 2 of ($a, $b, $hex)   // совпали минимум два из трёх признаков
}

Разберём условие. uint16(0) == 0x5A4D — проверка, что файл начинается с сигнатуры MZ, то есть это Windows-исполняемый (отсекаем нерелевантные файлы). 2 of ($a, $b, $hex) — требуем совпадения как минимум двух из трёх признаков. Это ключевой приём против ложных срабатываний: одиночная строка может встретиться случайно, а вот сочетание нескольких характерных признаков уже специфично для семейства.

Строки: ascii, wide, nocase, hex

Модификаторы делают поиск точнее. ascii и wide задают кодировку (Windows часто хранит строки в UTF-16 — это wide); можно указать обе. nocase игнорирует регистр. Hex-строки ({ 6A 40 68 ... }) ищут последовательность байтов — ими описывают куски кода или структуры, которые не являются текстом. Поддерживаются маски-джокеры (например, ?? ) для байтов, которые в разных сборках различаются, — так одно правило покрывает вариации.

Как пишут правило на семейство

Порядок такой же, как у нас в курсе. Сначала — сбор признаков: статикой и динамикой находим то, что устойчиво повторяется у образцов семейства (характерные строки конфигурации, уникальный mutex, путь персистентности, фрагмент распаковщика). Затем — выбор специфичных признаков: берём то, чего почти нет в легитимных файлах. Потом — условие с запасом: комбинируем несколько признаков (N of them), добавляем структурные проверки (магия файла, размер). Наконец — проверка на ложные срабатывания: прогоняем правило по большому набору заведомо чистых файлов (goodware). Если правило ловит легитимный софт — ужесточаем условие.

# Прогнать правило по каталогу образцов (в стенде / по своим файлам)
yara -r rules/family.yar /samples/
# -r рекурсивно; вывод — имена сработавших правил и файлов

Правила на признак упаковки

Из урока про энтропию мы помним: упаковка — сильный сигнал. YARA умеет описывать и её — например, искать сигнатуры известных упаковщиков (метку UPX) или, через модуль math, проверять высокую энтропию секции. Такое правило не говорит «это вирус», а помечает «упаковано, посмотреть внимательнее» — это сортировочный, а не приговорный детект.

Как это работает под капотом

YARA компилирует правила и эффективно сканирует поток байтов файла (или памяти), отмечая, какие строки/последовательности найдены и в каких позициях, а затем вычисляет логическое condition. Поиск строк оптимизирован (правило с десятками сигнатур всё равно сканирует файл за один проход), а условие может опираться на смещения, размер файла, число совпадений и встроенные модули (pe — разбор PE-заголовка, math — энтропия, hash — хеши участков). Важно понимать границы: YARA — это сигнатурный метод. Он силён против известных и слабо изменённых семейств, но новый, переписанный или сильно упакованный образец правило может пропустить. Поэтому YARA — один слой защиты, дополняющий поведенческий детект из прошлого урока, а не замена ему.

Как защититься (применение в SOC)

1. Стройте правила на устойчивых признаках. Конфиг-строки, mutex, фрагменты распаковщика менять дороже, чем хеш, — такое правило живёт дольше и ловит будущие сборки.

2. Требуйте сочетание признаков. N of them и структурные проверки (магия файла, размер) резко снижают ложные срабатывания по сравнению с одиночной строкой.

3. Тестируйте на goodware. Перед вводом в строй прогоняйте правило по большому набору чистых файлов: детект, который шумит на легитимном софте, бесполезен и опасен.

4. Встройте YARA в конвейер. Сканирование вложений на шлюзе, файлов на эндпоинтах (через EDR), дампов памяти, ретро-поиск по хранилищу образцов — так одно правило защищает сразу несколько рубежей.

5. Обменивайтесь и обновляйте. Берите проверенные правила из доверенных источников и сообществ, ведите свои под версионным контролем, пересматривайте по мере эволюции семейств.

Итоги

  • YARA описывает файл по содержимому (строки/байты + условие) и ловит целое семейство, а не один хеш.
  • Правило надёжнее блок-листа, потому что опирается на признаки, которые атакующему дорого менять.
  • Ключ к точности — сочетание специфичных признаков (N of them) и структурные проверки; одиночная строка даёт ложные срабатывания.
  • Обязательный шаг — тест на goodware, иначе правило шумит на легитимном софте.
  • YARA — сигнатурный слой защиты: силён против известного, дополняет поведенческий детект, применяется в SOC и threat hunting на своих файлах и телеметрии.
Проверьте себя
1. Почему в условии YARA-правила обычно требуют совпадения нескольких признаков (например, 2 of them), а не одной строки?
AСочетание характерных признаков специфично для семейства, а одиночная строка может встретиться случайно и дать ложное срабатывание
BYARA технически не умеет искать по одной строке
CНесколько строк ускоряют сканирование файла
DОдна строка занимает слишком много памяти при компиляции правила
2. В чём преимущество YARA-правила перед блок-листом хешей при детекте вредоносного семейства?
AYARA смотрит внутрь файла на устойчивые признаки, поэтому ловит и новые сборки семейства, у которых хеш изменился
BYARA не требует доступа к самому файлу, ей хватает имени
CХеши невозможно вычислить для исполняемых файлов
DYARA полностью заменяет поведенческий анализ и сигнатуры не устаревают