YARA иног­да называ­ют швей­цар­ским ножом вирус­ных ана­лити­ков. Этот инс­тру­мент поз­воля­ет соз­давать набор пра­вил, с помощью которых мож­но быс­тро и безоши­боч­но детек­тировать вре­донос­ные и потен­циаль­но опас­ные прог­раммы. В этой статье я рас­ска­жу, как писать для YARA иде­аль­ные пра­вила, что­бы дви­жок работал мак­сималь­но быс­тро и эффектив­но.

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 02 03 04, потому что 00 00 00 00 встре­чает­ся слиш­ком час­то.

{ 01 02 [1-4] 01 02 03 04 }

Атом 01 02 03 04 пред­почти­тель­нее ато­ма 01 02, потому что пер­вый длин­нее.

Важ­но, что­бы стро­ки содер­жали «хорошие» ато­мы. Ниже показа­ны «пло­хие» стро­ки: они содер­жат либо слиш­ком корот­кие, либо неуни­каль­ные ато­мы:

{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. Даль­ше нач­нется про­вер­ка регуляр­ки [\t ]{0,100}\(. Бла­года­ря такой опти­миза­ции 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»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    2 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии