Сигнатуры и детект: 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 на своих файлах и телеметрии.