Содержание статьи
info
Если ты не знаешь, что такое YARA, и желаешь познакомиться с этим инструментом поближе, обязательно прочитай статью «Yara. Пишем правила, чтобы искать малварь и не только».
Четырехтактный двигатель
Как писать быстрые правила? Давай заглянем под капот YARA и посмотрим, как работает сканер. Каждое сканирование можно разложить на последовательность из четырех тактов. В качестве примера возьмем следующее правило YARА:
// Подключаемые модулиimport "math"rule example_php_webshell_rule{    // Метаданные    meta:        description = "Example php webshell rule"    // Строки    strings:        $php_tag = "<?php"        $input1   = "GET"        $input2   = "POST"        $payload = /assert[\t ]{0,100}\(/    // Условия    condition:        filesize < 20KB and        $php_tag and        $payload and        any of ( $input* ) and        math.entropy(500, filesize-500) >= 5}Ну а теперь разберем каждый «такт» в деталях.
Такт 1. Пишем или берем из паблика правило
Это действие аналитик выполняет самостоятельно, вручную. Для поиска подстрок YARA использует алгоритм Ахо — Корасик. Сами подстроки носят название «атомы» (atoms). Максимальная длина атома достигает четырех байт.
Разберем атомы на примерах:
/abc.*cde/В этой регулярке есть два атома: abc и cde. Каждый атом уникален и не содержит повторяющихся символов. Так как они имеют одинаковую длину в 3 байта, YARA будет использовать первый атом abc.
/(one|two)three/Тут доступны следующие атомы: one, two, thre и hree. По идее, мы можем искать thre или hree отдельно или для one и two. А как поведет себя YARA?
Она возьмет самый уникальный атом thre, он приведет к меньшему количеству совпадений, чем one и two (они короче). Кроме того, он не содержит повторяющиеся символы e, как в hree. YARA оптимизирована так, чтобы выбрать лучшие атомы из каждой строки. Взглянем на опкоды:
{ 00 00 00 00 [1-4] 01 02 03 04 }В этом случае YARA будет использовать атом 01 , потому что 00  встречается слишком часто.
{ 01 02 [1-4] 01 02 03 04 }Атом 01  предпочтительнее атома 01 , потому что первый длиннее.
Важно, чтобы строки содержали «хорошие» атомы. Ниже показаны «плохие» строки: они содержат либо слишком короткие, либо неуникальные атомы:
{00 00 00 00 [1-2] FF FF [1-2] 00 00 00 00}{AB  [1-2] 03 21 [1-2] 01 02}/a.*b//a(c|d)/Худшие строки — это те, которые вообще не содержат атомов, например вот такие регулярки:
/\w.*\d//[0-9]+\n/Использование регулярных выражений без явных атомов порождает плохие детектирующие правила, так как влечет за собой большие нагрузки на процессор при сканировании всей системы.
Атомы из нашего правила:
- 
<;?ph  - 
GET; - 
POST; - 
sser(изassert). 
Атомы извлекаются из строк в правиле, затем YARA ищет их в процессе сканирования файлов. Если атом найден, то проверяется полностью вся строка.
Такт 2. Алгоритм (автомат) Ахо — Корасик
При запуске правила происходит поиск подстроки. Такты 2–4 будут выполняться для всех файлов. YARA ищет в каждом файле четыре атома из нашего правила, используя дерево префиксов, называемое автоматом Ахо — Корасик. Тот же принцип используется в grep. Любые совпадения передаются дальше в движок байт‑кода.
Такт 3. Движок байт-кода
Предположим, что во время сканирования появилось совпадение с sser. В этом случае на следующем шаге YARA проверит, был ли перед sser префикс a и постфикс t. Дальше начнется проверка регулярки [\. Благодаря такой оптимизации YARA избегает сложных вычислений (в нашем случае регулярных выражений) и сначала выбирает уникальные подстроки для их детального изучения.
Такт 4. Условия
После выполнения всех сравнений с образцом в дело вступают условия. За проверку условия отвечают вычисления по короткой схеме, также известные как вычисления Маккарти.
Вычисления Маккарти — это принцип оптимизации вычислений, при котором второй логический оператор вычисляется только в том случае, если первого логического оператора недостаточно для определения значения выражения.
Рассмотрим простой пример.
    // Условия    condition:        filesize < 20KB and        $php_tag and        $payload and        any of ( $input* ) and        math.entropy(500, filesize-500) >= 5
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»
