Категория > Новости > YARA на максималках. Учимся составлять эффективные правила YARA на примерах - «Новости»

YARA на максималках. Учимся составлять эффективные правила YARA на примерах - «Новости»


4-03-2023, 08:59. Автор: Марфа
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 andany of ( $input* ) andmath.entropy(500, filesize-500) = 5}

Ну а теперь раз­берем каж­дый «такт» в деталях.


 

Такт 1. Пишем или берем из паблика правило


Это дей­ствие ана­литик выпол­няет самос­тоятель­но, вруч­ную. Для поис­ка подс­трок YARA исполь­зует алго­ритм Ахо — Корасик. Сами подс­тро­ки носят наз­вание «ато­мы» (atoms). Мак­сималь­ная дли­на ато­ма дос­тига­ет четырех байт.


Читайте также - Купить биткоин через Сбербанк или другими способами без регистрации, продать usdt по доступным ценам.

Раз­берем ато­мы на при­мерах:


/abc.*cde/

В этой регуляр­ке есть два ато­ма: abc и cde. Каж­дый атом уни­кален и не содер­жит пов­торя­ющих­ся сим­волов. Так как они име­ют оди­нако­вую дли­ну в 3 бай­та, YARA будет исполь­зовать пер­вый атом abc.


/(one|two)three/

Тут дос­тупны сле­дующие ато­мы: onetwothre и 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)/

Худ­шие стро­ки — это те, которые вооб­ще не содер­жат ато­мов, нап­ример вот такие регуляр­ки:


/[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 andany of ( $input* ) andmath.entropy(500, filesize-500) = 5

Перейти обратно к новости