31 stycznia 2011

W jaki sposób antywirusy rozpoznają złośliwe programy?

Antywirusy są prawdopodobnie najpopularniejszym typem oprogramowania ochronnego oraz w ogóle jednymi z częściej stosowanych programów. Program tego typu najczęściej kojarzy nam się z rezydentnym monitorem śledzącym w czacie rzeczywistym wszystkie działania mające miejsce w naszym systemie operacyjnym i zdolnym do rozpoznania niezliczonej ilości zagrożeń. Jak to się jednak dzieje, że antywirusy są w stanie w miarę skutecznie rozpoznać setki tysięcy najróżniejszych złośliwych programów?

Większość użytkowników programów antywirusowych praktycznie w ogóle nie zdaje sobie sprawy z tego, w jaki sposób ich oprogramowanie ochronne radzi sobie z lokalizowaniem potencjalnych zagrożeń. Choćby podstawowa wiedza z tego zakresu jest jednak bardzo przydatna, bowiem pozwoli nam na lepsze zrozumienie słabych punktów dzisiejszego oprogramowania antywirusowego, a nawet realnych zagrożeń związanych z ich codziennym użytkowaniem! Wszystko to powinno nam więc pozwolić na bardziej świadome stosowanie dzisiejszych technologii ochronnych.

Najważniejszą częścią każdego dzisiejszego programu antywirusowego (oprócz tzw. silnika) jest baza sygnatur wirusów. Sygnatury wirusów to pewne (zazwyczaj bardzo zwięzłe) informacje, które pozwalają na w miarę jednoznaczne zidentyfikowanie danego typu lub nawet całej rodziny wirusów. Najpopularniejsze obecnie trzy typy sygnatur, to sygnatury powstałe z wykorzystaniem funkcji skrótu, sygnatury (wzorce) bajtowe oraz sygnatury heurystyczne. Spójrzmy pokrótce na wady oraz zalety wspomnianych metod identyfikowania potencjalnych zagrożeń.

Najprostszą oraz najłatwiejszą do praktycznego zastosowania metodą tworzenia sygnatur złośliwego oprogramowania jest oczywiście wykorzystanie do tego celu popularnych funkcji skrótu (np. MD5). Tzw. skrót (hash) powstaje w wyniku zastosowania matematycznej funkcji, która to w praktyce pozwala na przyporządkowanie dowolnie dużej liczbie (czyli np. dowolnemu programowi lub danym o dowolnej wielkości) pewnej stosunkowo niewielkiej wartości o ustalonym rozmiarze. Tak utworzony skrót dla znanego już złośliwego programu pozwala w przyszłości na w miarę jednoznaczne zidentyfikowanie danego wirusa.

Niestety zastosowanie tego typu sygnatur jest obarczone sporymi wadami. Nawet najdrobniejsza zmiana w kodzie złośliwego oprogramowania (nowy wariant wirusa, malware polimorficzny, itp.) oznacza, że stara sygnatura nie wykryje już nowych wersji wirusa. Poza tym, kolizje funkcji skrótu (czyli przypadki, gdy dla różnych wiadomości lub programów otrzymamy te same skróty) potencjalnie mogą być przyczyną bardzo niebezpiecznych dla naszego systemu wykryć fałszywych. Wszystko to powoduje, że rozwiązania antywirusowe w żadnym razie nie mogą polegać jedynie na tego typu sygnaturach.

Pewnym rozwiązaniem w przypadku malware'u polimorficznego lub złośliwych plików zawierających zmienne dane może być natomiast tzw. fuzzy hashing. Metody te generalnie pozwalają na utworzenie wspólnej sygnatury dla różnych danych wejściowych, które to jednak zawierają pewne cechy wspólne (np. programy zawierające wspólne fragmenty kodu). Tego typu metody są jednak dość wymagające pod względem obliczeniowym oraz nie gwarantują wcale bardzo dużej skuteczności. Wszystkich zainteresowanych tą tematyką zachęcam do zapoznania się z projektem ssdeep, w ramach którego powstał program implementujący metodę generowania skrótów CTPH (ang. Context Triggered Piecewise Hashes).

Kolejnym popularnym sposobem generowania sygnatur złośliwego oprogramowania jest wykorzystywanie do tego celu pewnych wybranych sekwencji bajtów obecnych w złośliwym kodzie lub w wykorzystywanych przez niego danych. Identyczne wzorce bajtowe możemy zazwyczaj odnaleźć we wszystkich wariantach danego złośliwego programu, dlatego też metoda ta jest w praktyce dość skuteczna w walce z całymi rodzinami wirusów. Natomiast prostota tej metody sprawia, że jest ona wykorzystywana praktycznie od zarania antywirusowych dziejów, aż po dziś dzień. Oczywiście metoda ta również może generować wykrycia fałszywe. Jeśli założymy, że sygnatura (wzorzec bajtowy) pewnego wirusa to "FF 5c 0c 4d c2 21 1d 18", to oczywiście dowolny plik (nawet najzwyklejszy plik tekstowy) zawierający taki ciąg bajtów będzie generował alert antywirusowy.

Współczesne programy antywirusowe wykorzystują również sygnatury heurystyczne. Generalnie mianem metod heurystycznych określa się w przypadku antywirusów wszystkie inne metody wykrywania zagrożeń, oprócz powyższych tradycyjnych metod sygnaturowych. Metody heurystyczne stanowią najbardziej skomplikowaną część arsenału każdego antywirusa. Ponadto praktycznie każdy producent antywirusów rozwija własne zastrzeżone algorytmy heurystyczne i właśnie na tym polu w największym stopniu może się wykazać swą innowacyjnością i potencjałem (tradycyjne sygnatury są zazwyczaj niemal identyczne w przypadku wielu różnych producentów -- znane jest nawet zjawisko wymieniania się tradycyjnymi sygnaturami z innymi producentami).

W praktyce heurystyczne metody wykrywania wirusów mogą się sprowadzać przykładowo do śledzenia wywołań API, zastosowania sand-boxingu połączonego ze śledzeniem zachowań poszczególnych programów, śledzenia anomalii występujących w systemie operacyjnym oraz systemie plików i wielu innych podobnych technik. W praktyce więc, sygnatura heurystyczna może przykładowo przyjąć formę kilku warunków śledzących wystąpienie sekwencji określonych wywołań API, które są charakterystyczne dla jakiejś rodziny wirusów lub nawet całej klasy złośliwego oprogramowania. Przykładowo dla złośliwego programu znanego jako Poison Ivy, heurystyczna sygnatura może mieć następującą postać:

Rule A 
An API call to RtlMoveMemory with a string of "SOFTWARE\Classes\http\shell\open\commandV" 

Rule B 
An API call to CreateMutexA with a string of ")!VoqA.I4" 

Rule C 
An API call to GetSystemDirectory 

if ( Rule A then Rule B then Rule C ) 
 then 
Process = PoisonIvy

Mimo, że metody heurystyczne dają nam pewną nadzieję na wykrycie nieznanych do tej pory zagrożeń, to oczywiście nie dają nam absolutnie żadnej gwarancji na stuprocentową skuteczność wykrywania oraz nie są wolne od zagrożenie generowania fałszywych alarmów.

Wiedząc już co nieco o metodach stosowanych przez współczesne antywirusy w celu wykrycia obecności złośliwego oprogramowania, możemy już teraz być pewni, że zapewnienia producentów tego typu oprogramowania o niemal całkowitej nieomylności ich produktów są wyssane z palca. Absolutnie żadne rozwiązanie antywirusowe nie daje nam obecnie gwarancji na obronę przed każdą infekcją. Jak również mogliśmy się przekonać, metody stosowane w celu wykrycia złośliwego oprogramowania są niejednokrotnie dość wymagające obliczeniowo, co z kolei tłumaczy znane chyba każdemu użytkownikowi antywirusów spowolnienie działania całego objętego ochroną systemu...

Wniosek? Współczesne programy antywirusowe są całkiem skuteczne i zazwyczaj w przypadku swobodnego surfowania oraz pobierania rozmaitości z Internetu, warto jednak z nich korzystać. Zawsze należy jednak również pamiętać o ich ograniczeniach, a nawet realnych zagrożeniach związanych z ich codziennym wykorzystaniem.