Содержание статьи
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»