background image

www.hakin9.org

hakin9 Nr 01/2008

58

Obrona

J

est to obecnie najpopularniejsza metoda 
detekcji, choć ma istotną wadę, mianowi-
cie jest metodą reakcyjną. Ponieważ In-

ternet  umożliwia  błyskawiczne  rozprzestrze-
nianie się niebezpieczeństwa, jest ona często 
niewystarczająca.

Metoda oparta na wzorcach zagrożeń cha-

rakteryzuje  się  niebezpieczną  luką  w  czasie 
pomiędzy  pojawieniem  się  zagrożenia  a  udo-
stępnieniem  wzorca  je  wykrywającego.  Wzo-
rzec  jest  przygotowywany  przez  specjalistów 
z firm antywirusowych, którzy muszą otrzymać 
nową  próbkę,  następnie  przeanalizować  ją
i przygotować sygnaturę, która będzie zagroże-
nie w sposób jednoznaczny identyfikować, nie 
powodując przy tym fałszywych alarmów (Ry-
sunek 1.). Alternatywą dla ręcznego wybierania 
wzorców jest wykorzystanie automatycznie ge-
nerowanych sum kontrolnych, ale są one wraż-
liwe  nawet  na  drobne  modyfikacje  i  stosowa-
nie ich szybko prowadzi do nadmiernego roz-
rostu baz.

Rozwiązaniem  tego  problemu  są  zdoby-

wające  coraz  większą  popularność  mechani-
zmy  prewencyjne  oparte  na  klasyfikacji  heu-
rystycznej. Heurystyka (gr. heurisko – znaleźć
to  umiejętność  odkrywania  nowych  faktów 

i związków pomiędzy faktami poprzez umiejęt-
ne postawienie hipotez. Algorytmy heurystycz-
ne na podstawie wiedzy o cechach istniejących 
niebezpieczeństw są w stanie przeanalizować 
skanowany  obiekt  i  stwierdzić,  czy  można  go 
zaklasyfikować jako niebezpieczny.

Uogólnione wzorce

Metody wykrywania nieznanych wirusów by-
ły implementowane w programach antywiru-
sowych  od  początku  ich  istnienia.  Najprost-

Heurystyka w programach 

antywirusowych

Jakub Dębski

stopień trudności

Istnieją dwie główne metody wykrywania złośliwego 

oprogramowania – oparte na wzorcach zagrożeń i na analizie 

heurystycznej. Pierwszy typ zapewnia stuprocentową 

wykrywalność zagrożeń, które są znane, jednak wymaga ciągłej 

aktualizacji baz sygnatur.

Z artykułu dowiesz się

•   czym jest heurystyka w programach antywiruso-

wych,

•   jakie są rodzaje wykorzystywanych heurystyk,
•   przed  jakimi  problemami  stoją  twórcy  heury-

styk.

Co powinieneś wiedzieć

•   powinieneś znać podstawy asemblera,
•   powinieneś  mieć  ogólne  pojęcie  o  budowie 

systemów operacyjnych,

•   powinieneś znać terminologię związaną z nie-

bezpiecznym oprogramowaniem.

background image

Heurystyka w programach antywirusowych

hakin9 Nr 01/2008

www.hakin9.org

59

szą  metodą  rozpoznawania  no-
wych wersji wirusów są uogólnione 
wzorce. Wzorzec (scan-stringpat-
tern
) jest ciągiem bajtów wyekstra-
howanym z wirusa, który w sposób 
jednoznaczny  go  identyfikuje.  Ma-
jąc wzorzec wirusa możemy zasto-
sować jeden z licznych algorytmów 
dopasowujących,  w  celu  znalezie-
nia  go  w  badanym  pliku.  Wzorzec 
musi  spełniać  kilka  wymagań,  aby 
można go było zastosować do iden-
tyfikacji zagrożenia:

•   powinien  być  fragmentem  cha-

rakterystycznym  dla  wirusa  (nie 
może  występować  w  czystych 
plikach),

•   nie może być zbyt krótki (mógłby 

powodować fałszywe alarmy),

•   nie  może  być  zbyt  długi  (dopa-

sowanie  go  byłoby  długotrwałe, 
a zajętość pamięci znaczna przy 
licznej bazie zagrożeń).

Przyjrzyjmy  się  fragmentowi  wirusa 
asemblerowego,  który  spełnia  wy-
magania wzorca (Listing 1).

Powyższy  fragment  jest  cha-

rakterystyczny,  ponieważ  poszu-
kuje  pod  wyliczanym  adresem  sło-
wa  KERN,  co  nie  powinno  wystą-
pić  w  pliku  czystym.  Po  lewej  stro-
nie  znajdują  się  bajty  reprezentu-
jące  instrukcje,  których  ciąg  może 
stanowić  wzorzec  służący  do  wy-
krycia wirusa.

Ponieważ wirus ten uzyskuje do-

stęp  do  własnych  danych  techni-
ką  delta  offset  (tu  względem  reje-

stru ebp), w innych wersjach wirusa, 
po wprowadzeniu do niego niewiel-
kiej zmiany, adresy mogą się zmie-
nić. Aby uogólnić ten wzorzec na in-
ne wersje, możemy zastąpić część 
bajtów  znakiem  zastępczym  odpo-
wiadającym podczas dopasowywa-
nia za dowolny bajt (Listing 2).

W  ostatniej  linii  mamy  skok  wa-

runkowy,  którego  adres  docelowy 
jest  offsetem  względem  aktualnej 
instrukcji. Po dodaniu do wirusa do-
datkowych rozkazów offset ten może 
się zmienić, więc w miejsce tych baj-
tów  możemy  wstawić  znaki  zastęp-
cze lub całkiem je wyciąć, ponieważ 
znajdują  się  na  końcu  scan-stringa
Dzięki  powyższym  zabiegom  scan-
string będzie potrafił wykryć zarów-
no nowe wersje tego wirusa, jak też 
wszystkie  wirusy,  które  zawierają 
opisany wzorzec. Ponieważ autorzy 
niebezpiecznych  programów  często 
wykorzystują  fragmenty  istniejące-
go złośliwego kodu, możliwe jest wy-
branie  wzorca  wychwytującego  zu-
pełnie nowe zagrożenia.

Zbytnie skracanie i uogólnianie 

scan-stringów  może  powodować 
fałszywe  alarmy.  Rozwiązaniem 

tego  problemu  jest  stosowanie  kil-
ku  krótkich  wzorców,  które  mu-
szą znajdować się w badanym pli-
ku,  aby  stwierdzić  obecność  wiru-
sa. Od tego podejścia już tylko krok 
do heurystyki statycznej, czyli naj-
popularniejszej metody heurystycz-
nego wykrywania wirusów.

Heurystyka

Heurystykę  w  programach  antywi-
rusowych można podzielić na kilka 
kategorii  w  zależności  od  sposo-
bu  działania.  Najczęstszym  spoty-
kanym podziałem jest wyszczegól-
nienie  heurystyki  statycznej  i  dy-
namicznej.  Do  metod  heurystycz-
nych  zalicza  się  również  analizę 
behawioralną  oraz  sprawdzanie 
integralności.  Przypatrzmy  się  po-
szczególnym typom i przeanalizuj-
my ich wady i zalety.

Heurystyka statyczna

Heurystyka  statyczna  opiera  się  na 
analizie  obiektu  w  postaci,  w  jakiej 
zostanie  on  przekazany  do  analizy; 
na  traktowaniu  obiektu  jako  ciągu 
bajtów. Analiza taka bazuje na dys-
kryminatorach  zebranych  z  istnieją-
cych  niebezpiecznych  programów, 
czyli na cechach odróżniających nie-
bezpieczne  programy  od  czystych 
plików.  Aby  analizowany  obiekt  zo-
stał uznany za podejrzany, musi za-
wierać określoną liczbę dyskrymina-
torów.  Dyskryminatory  najczęściej 
są  ciągami  bajtów,  ale  mogą  być 
związane  np.  z  nietypowym  wyglą-
dem
 pliku wykonywalnego.

Rozpatrzmy  przykład  wykrywa-

nia typowego, napisanego w asem-
blerze wirusa za pomocą heurysty-
ki statycznej. Typowy wirus infekuje 
plik wykonywalny poprzez dołącze-
nie do niego swojego kodu, następ-
nie przeszukuje dysk w celu znale-

Listing 1. 

Fragment wirusa asemblerowego nadający się na wzorzec

8BBDAA174000  

mov  

edi

,[

ebp

][

004017AA

]

8B7778         

mov   

esi

,

[

edi

][

78

]

03B59E174000  

add  

esi

,[

ebp

][

0040179E

]

8B7E0C        

mov  

edi

,[

esi

][

0C

]

03BD9E174000 

add

     

edi

,

[

ebp

][

0040179E

]

813F4B45524E   

cmp   

d

,

[

edi

]

,

04E52454B 

;"NREK"

0F857C000000   

jne  

.

001013F35  

Rysunek 1. 

Wykrywanie reakcyjne (Reactive) kontra heurystyczne 

(Proactive)

������
��������

������

��������

��������

��������

��������

��������
��������

������������
���������������

���������
�������

����������������
�����������

�����������������������

�������������������

�������������������

�������������������

�������������������

background image

hakin9 Nr 01/2008

www.hakin9.org

Obrona

60

zienia  innych  plików  podatnych  na 
infekcję.  Aby  wykryć  wirusa  przy 
użyciu  heurystyki  statycznej,  musi-
my zgromadzić kolekcję mikrowzor-
ców,  których  występowanie  będzie 
świadczyło  o  podejrzanym  dzia-
łaniu.  Stworzenie  użytecznej  ba-
zy  mikrowzorców  wymaga  wiedzy 
na temat zasady działania wirusów 
i technik w nich stosowanych.

Mikrowzorcem  może  być  przy-

kładowo  pobranie  offsetu  delta
które  można  znaleźć  w  większo-
ści wirusów plikowych. Offset delta 
pobierany jest przez wirusa w celu 
ustalenia adresu początku samego 
siebie.  Jest  on  wirusowi  potrzeb-
ny, jeżeli chce w prosty sposób ko-
rzystać z danych, które są zawarte 
w obszarze wirusa. Popularną me-
todą ustalenia offsetu delta jest se-
kwencja rozkazów:

E800000000   call     $+5
5D           pop      ebp
ED           sub      ebp, ????????

co  przekłada  się  na  mikrowzorzec 

E8000000005DED

.

Występowanie tego mikrowzorca 

może sugerować, że ciąg bajtów jest 
kodem, który został dopisany do pli-
ku  wykonywalnego.  Innym  przykła-
dem  mikrowzorca  może  być  spraw-
dzanie formatu pliku PE32 przed in-
fekcją  lub  podczas  poszukiwania 
w  pamięci  adresów  funkcji  API,  za 
pomocą  porównań  z  charaktery-
stycznymi  oznaczeniami  MZ  i  PE

Jego  adres  znajduje  się  pod  offse-
tem 3C względem MZ (Listing 3).

W tym przykładzie za uogólniony 

scan-string może służyć ciąg bajtów 

4D5A75*8B*3C*504575,

  gdzie  *  to  1-10 

dowolnych  znaków.  Innymi  mikrow-
zorcami infektorów plików mogą być 
nazwy  funkcji  API  pojawiające  się 
nie  w  sekcji  importów,  teksty  *.exe
*.*”, będące specyfikacją dla wyszu-
kiwania plików do zarażenia lub war-
tości  CRC32  policzone  z  nazw  API 
(wiele  wirusów,  szczególnie  wzoro-
wanych  na  napisanych  przez  grupę 
29A, korzystało z procedury wyszu-
kiwania  adresów  API  bazującej  na 
sumie kontrolnej nazwy).

W  przypadku  złośliwych  progra-

mów pisanych w językach wysokie-
go  poziomu  podejrzane  może  być 
występowanie  tekstów  określają-
cych klucze rejestru odpowiedzialne 
za autostart aplikacji w systemie (np. 
SOFTWARE\Microsoft\Windows\
CurrentVersion\Run
), fragmenty, z któ-
rych  składane  są  maile  (np.  MA-
IL  FROM:
)  czy  adresy  blokowanych 
stron  WWW  (np.  windowsupda-
te.microsoft.com
). Wykrywanie heu-

rystyczne  niebezpiecznego  opro-
gramowania  tworzonego  w  języ-
kach wysokiego poziomu jest jednak 
znacznie bardziej skomplikowane niż 
wykrycie kodu asemblerowego. 

W  celu  zwiększenia  jakości  kla-

syfikacji  przy  użyciu  heurystyki  sta-
tycznej  można  połączyć  mikrow-
zorce  z  nietypowym  wyglądem  pli-
ku  spowodowanym  modyfikacjami 
przeprowadzonymi  podczas  infek-
cji. Przykładowo za nietypowe moż-
na uznać sytuacje, gdy:

•   punkt wejścia do programu (Entry-

Point)  wskazuje  na  ostatnią  sek-
cję, która nie jest sekcją kodu (wi-
rus dopisał się do ostatniej sekcji),

•   entryPoint wskazuje na wnętrze 

nagłówka pliku PE (małe wirusy 
platform Win9x umieszczały się 
w nagłówku pliku),

•   sekcja kodu posiada oprócz atry-

butu wykonywalne, także odczyt 
i zapis (częste w przypadku wi-
rusów polimorficznych),

•   sekcja relokacji lub sekcja zasobów 

jest większa, niż być powinna.

Utrudnieniem  techniki  wykrywania 
wirusów  według  nietypowego  wy-
glądu  stały  się  popularne  ostatnio 
kompresory  (np.  UPX)  i  protekto-
ry  (np.  Asprotect)  plików  wykony-
walnych,  które  wprowadzają  typo-
we  dla  wirusów  modyfikacje.  Moż-
liwe  jest  zidentyfikowanie  protekto-
ra i zignorowanie go przy tego typu 
detekcji,  ale  –  szczególnie  w  przy-
padku protektorów o otwartych źró-
dłach – protektory są często mody-
fikowane i zidentyfikowanie wszyst-
kich ich wersji jest kłopotliwe. Z dru-
giej strony samo występowanie za-
bezpieczenia w pliku stanowi pierw-
szą oznakę, że autor programu ma 
coś do ukrycia i jest to podejrzane.

Listing 2. 

Istotne informacje z fragmentu wirusa asemblerowego

8BBD????????

     

mov        

edi

,[

ebp

][

????????

]

8B7778           

mov        

esi

,[

edi

][

78

]

03B5????????

     

add        

esi

,[

ebp

][

????????

]

8B7E0C 

          

mov        

edi

,[

esi

][

0C

]

03BD????????

     

add        

edi

,[

ebp

][

????????

]

813F4B45524E

     

cmp        

d

,[

edi

],

04E52454B 

;"NREK"

0F85             

jne        

????????  

Rysunek 2. 

Epidemia robaka Bagle.AS. (Źródło: www.virus-radar.com)

���

���

���

���

���

���

���

���

���

����

������

����

����

����

����

����

����

����

����

����

�����

�����

�����

�����

�����

��

���

��

���

��

���

��

���

��

���

�����

�������������������

background image

Heurystyka w programach antywirusowych

hakin9 Nr 01/2008

www.hakin9.org

61

Zaletą  heurystyki  statycznej  jest 

duża szybkość działania – tym więk-
sza, że analizowane obszary zwykle 
nie są duże i można w całości wczy-
tać je do pamięci. Jej wadą jest ogra-
niczone  pole  analizy  umożliwiają-
ce  wykrycie  jedynie  tych  zagrożeń, 
które  posiadają  często  występujące 
cechy. Heurystyka taka potrafi prze-
analizować jedynie kod, który nie jest 
zaszyfrowany, ale po uzyskaniu po-
staci zdeszyfrowanej (np. za pomo-
cą emulacji) można ją przekazać po-
nownie  do  skanowania  przy  użyciu 
heurystyki statycznej.

Po  znalezieniu  w  analizowa-

nym  obiekcie  wystarczającej  licz-
by charakterystycznych cech może-
my stwierdzić, że obiekt jest niebez-
pieczny. Heurystyka statyczna dla in-
nych rodzajów wirusów, na przykład 
skryptowych lub makrowirusów, two-
rzona jest w sposób analogiczny.

Heurystyka dynamiczna

Heurystyką  dynamiczną  nazywa 
się  analizę  przeprowadzaną  pod-
czas  działania  podejrzanego  pro-
gramu,  dzięki  czemu  możliwe  jest 
poznanie  zachowania  obiektu  lub 
uzyskanie  postaci  obiektu  dającej 
więcej informacji. Zwykle taką ana-
lizę przeprowadza się podczas uru-
chomienia  podejrzanego  progra-
mu  w  środowisku  bezpiecznym, 
za  pomocą  emulatora  procesora 
i  systemu  operacyjnego.  Środowi-

sko  takie  nazywane  jest  piaskow-
nicą  (ang.  sandbox).  Program 
w niej uruchomiony – niczym dziec-
ko znajdujące się w piaskownicy – 
nie może popsuć niczego, co znaj-
duje się poza nią, a jego działania 
można  obserwować  i  analizować. 
Do  heurystyki  dynamicznej  można 
zaliczyć  również  analizę  behawio-
ralną  przeprowadzaną  na  działa-
jącym systemie, o której więcej bę-
dzie w dalszej części tekstu.

Emulatory  w  programach  anty-

wirusowych  początkowo  tworzone 
były  w  celu  odszyfrowania  części 
zaszyfrowanej  wirusów  polimor-
ficznych.  Wykonywały  polimorficz-
ny kod wirusa do czasu, aż zakoń-
czył on deszyfrację, co najczęściej 
wiązało  się  z  wywołaniem  funkcji 
systemowej.  Następnie  rozszerzo-
no ich funkcjonalność o możliwość 
analizy behawioralnej, więc wywo-
łanie funkcji systemowej nie kończy 

działania,  ale  jest  również  emulo-
wane zgodnie z zachowaniem rze-
czywistego systemu operacyjnego. 
Wykonując  program  w  bezpiecz-
nym  środowisku  można  spraw-
dzić, jakie akcje próbuje on podjąć 
i stwierdzić w ten sposób, czy sta-
nowi potencjalne zagrożenie.

Innymi  podejrzanymi  zachowa-

niami, które może wykryć heurysty-
ka dynamiczna, są na przykład: li-
niowa modyfikacja obszaru pamię-
ci, a potem skok w zmodyfikowany 
obszar (deszyfracja, często stoso-
wana w wirusach polimorficznych), 
wykonywanie  pustych  pętli,  któ-
re  nie  modyfikują  stanu  rejestrów 
procesora  ani  pamięci  (sztucz-
ka  utrudniająca  analizę  programu 
i spowalniająca emulację), czy wy-
konywanie  kodu  w  obszarze  sto-
su.  Wszystkie  te  cechy  świadczą 
o tym, że wykonywany program nie 
jest programem normalnym.

Wśród  twórców  wirusów  istnie-

je  przekonanie,  że  skomplikowanie 
kodu  polimorficznego  utrudnia  zna-
lezienie wirusa w pliku. Nic bardziej 
mylnego.  Sam  kod  polimorficzny
i metamorficzny jest relatywnie pro-
sty  do  wykrycia,  gdyż  jest  całkowi-
cie różny od kodu wygenerowanego 
przez  kompilator,  a  nawet  od  kodu 
asemblerowego  stworzonego  przez 
człowieka. Generatory polimorficzne 
tworzą  znaczną  liczbę  instrukcji  lub 
zestawów instrukcji nic nierobiących, 
tzw. śmieci. Kod ten, całkowicie nie-
zoptymalizowany, daje się za pomo-
cą  mniej  lub  bardziej  skomplikowa-
nych metod zidentyfikować i potrak-
tować  jako  podejrzane  zachowanie. 
Ponieważ protektory plików wykony-
walnych  również  zawierają  polimor-

Listing 3. 

Fragment wirusa infekującego pliki. Sprawdzenie nagłówka 

pliku

66813A4D5A

     

cmp      

w

,[

edx

],

05A4D 

;"ZM"

75F8           

jne      

.

00040106E

8BCA           

mov       

ecx

,

edx

8B493C         

mov       

ecx

,[

ecx

][

3C

]

03CA           

add       

ecx

,

edx

3BC8           

cmp       

ecx

,

eax

7FED           

jg        

.

00040106E

6681395045

     

cmp       

w

,[

ecx

],

04550

 

;"EP"

75E6

           

jne       

.

00040106E

Rysunek 3. 

Fragmenty dwóch wersji robaka Agobot

background image

hakin9 Nr 01/2008

www.hakin9.org

Obrona

62

ficzne deszyfratory, ich nowe wersje 
mogą  być  fałszywie  identyfikowane 
powyższymi metodami. 

Stosowanie  emulacji  w  proce-

sie analizy ma kilka istotnych minu-
sów.  Główną  wadą  jest  relatywnie 
niewielka szybkość działania same-
go  emulatora,  a  dodatkowe  spraw-
dzenia  wykonywane  podczas  ana-
lizy  heurystycznej  jeszcze  emula-
cję  spowalniają.  Duże  znaczenie 
dla szybkości działania ma też pro-
blem stopu, czyli stwierdzenie, kie-
dy emulacja powinna się zakończyć. 
Choć  powstało  wiele  metod  przy-
spieszających działanie emulatorów 
i  wciąż  powstają  nowe  (np.  wyko-
rzystanie  wirtualizacji  procesorów), 
istnieje  kilka  barier  nie  do  pokona-
nia. Najtrudniejszą z nich jest niede-
terministyczność  wykonywania  ko-
du.  Dla  niebezpiecznego  programu 
nie  jest  problemem,  jeżeli  zadziała 
raz na kilka uruchomień. Może być 
to spowodowane wywołaniem funk-
cji  zwracającej  losową  wartość  lub 
warunkami logicznymi, które środo-
wisko  musi  spełnić.  Emulator  dzia-
łający  w  sposób  deterministyczny 
nie jest w stanie obsłużyć tych sytu-
acji, ponieważ emulacja podąża jed-
ną ścieżką, nie badając wszystkich 
możliwych rozgałęzień kodu. Zatem 
emulator  może  pójść  ścieżką,  któ-
ra kończy działanie niebezpieczne-
go  programu,  przez  co  nie  będzie 
można stwierdzić podejrzanego za-
chowania. Autorzy niebezpiecznego 
oprogramowania starają się również 

wykrywać  uruchomienie  w  sztucz-
nym
 środowisku i reagować na nie, 
ukrywając  swoją  obecność.  Innym 
przykładem  niedeterministyczności 
może  być  odmienne  działanie  pro-
gramu w różnych wersjach systemu 
operacyjnego. Przed twórcą emula-
tora pozostaje problem wyboru, któ-
rą wersję emulować.

Analiza behawioralna

Każdy  proces  działający  w  trybie 
użytkownika  musi  komunikować  się 
z systemem operacyjnym za pomo-
cą  udostępnionego  interfejsu  API. 
W trybie tym pracują wszystkie stan-
dardowe aplikacje, w tym większość 
niebezpiecznych  programów,  po-
nieważ nie muszą do działania uzy-
skiwać  nadzwyczajnych  uprawnień 
w  systemie.  Monitorując  wywoła-
nia  funkcji  systemowych  jesteśmy 
w stanie uzyskać dokładne informa-
cje na temat zachowania analizowa-
nego programu. Monitorowanie mo-
że odbywać się albo podczas emu-
lacji w środowisku bezpiecznym, al-
bo w działającym systemie. Monito-
rowanie  działającego  systemu,  mi-
mo jego spowolnienia, zyskuje coraz 
większą popularność, ponieważ jest 
w stanie wykryć zagrożenia, którym 
emulacja nie jest w stanie sprostać. 

Zaletą analizy behawioralnej jest 

przeniesienie klasyfikacji na znacz-
nie  wyższy  poziom  abstrakcji.  Nie 
operujemy w tym przypadku na po-
jedynczych  instrukcjach  kodu  ma-
szynowego, ale w domenie opisanej 

przez  zachowania.  Unikamy  w  ten 
sposób  problemów  wynikających 
z różnic w kodzie, które szczególnie 
widoczne  są  w  przypadku  progra-
mów  wygenerowanych  przez  kom-
pilatory  języków  wysokiego  pozio-
mu (Rysunek 3). Co więcej, zmiany 
wprowadzane w kolejnych wersjach 
niebezpiecznego  oprogramowania 
zwykle  w  niewielki  sposób  zmie-
niają  jego  zachowanie,  gdyż  auto-
rzy  zwiększają,  co  najwyżej,  funk-
cjonalność programu.

Przykładowo, wykorzystując emu-

lator możemy stwierdzić, że program 
wykonuje podejrzaną sekwencję wy-
wołań  systemowych  i  określić  obiekt 
jako  nowego  wirusa  lub  jako  odmia-
nę  istniejącego.  Większość  wirusów 
działających pod Windows na począt-
ku działania pobiera z systemu adresy 
funkcji,  które  będą  wykorzystywane. 
Zakładając, że adres 0x77e60000 jest 
adresem  biblioteki  KERNEL32.DLL 
w  pamięci  procesu,  pobieranie  listy 
wygląda  następująco  (wynik  progra-
mu TraceApi na wirusie Win32.Miam). 
Patrz Listing 4.

Pobranie  adresów  wykorzysty-

wanych  funkcji  API  jest  dla  wirusa 
niezbędne  w  sytuacji,  gdy  chce  on 
skorzystać  z  funkcji  systemowych, 
które  nie  znajdują  się  w  Import  Ad-
dress
 Table infekowanego pliku. Se-
kwencje  takie  można  znaleźć  w  wi-
rusach  asemblerowych  i  takie  za-
chowanie świadczy o działaniu dołą-
czonego do programu wirusa. 

Oczywiście  heurystyczna  klasy-

fikacja behawioralna może dotyczyć 
wszystkich czynności, które wykonu-
je analizowany program, a które mo-
gą  być  niebezpieczne.  Najczęściej 
monitorowanie  behawioralne  doty-
czy  typowych  działań  niebezpiecz-
nych programów, jakimi są:

•   modyfikacja  plików  wykonywal-

nych,

•   pobieranie i uruchamianie plików 

z Internetu,

•   wysyłanie listów za pomocą wła-

snego silnika SMTP,

•   modyfikacja rejestru,
•   modyfikacja plików systemowych,
•   zabijanie  procesów  (np.  progra-

mów antywirusowych),

Listing 4. 

Początek logu programu TraceApi na wirusie Win32.Miam

GetProcAddress

(

77e60000

,

GetModuleHandleA

)

GetProcAddress

(

77e60000

,

GetCurrentDirectoryA

)

GetProcAddress

(

77e60000

,

FindFirstFileA

)

GetProcAddress

(

77e60000

,

FindNextFileA

)

GetProcAddress

(

77e60000

,

CreateFileA

)

GetProcAddress

(

77e60000

,

GetFileSize

)

GetProcAddress

(

77e60000

,

LocalAlloc

)

GetProcAddress

(

77e60000

,

ReadFile

)

GetProcAddress

(

77e60000

,

SetFilePointer

)

GetProcAddress

(

77e60000

,

WriteFile

)

GetProcAddress

(

77e60000

,

CloseHandle

)

GetProcAddress

(

77e60000

,

LocalFree

)

GetProcAddress

(

77e60000

,

GetLocalTime

)

GetProcAddress

(

77e60000

,

SetCurrentDirectoryA

)

GetProcAddress

(

77e60000

,

GetWindowsDirectoryA

)

GetProcAddress

(

77e60000

,

GetSystemDirectoryA

)

GetModuleHandleA

(

User32

.

dll

)

background image

Heurystyka w programach antywirusowych

hakin9 Nr 01/2008

www.hakin9.org

63

•   modyfikacja innych procesów,
•   szpiegowanie klawiatury,
•   nasłuchiwanie na otwartych por-

tach,

•   praca programu bez widocznego 

okna.

Problemem  dla  monitorów  beha-
wioralnych mogą być aplikacje wie-
lowątkowe,  ponieważ  monitor  mu-
si  skupić  się  albo  na  czynnościach 
wykonywanych  globalnie  przez  ca-
łą  aplikację,  albo  na  czynnościach 
wykonywanych  przez  poszczegól-
ne  wątki.  Większość  współcześnie 
tworzonego niebezpiecznego opro-
gramowania  działa  jednak  w  jed-
nym wątku.

Monitory behawioralne posiadają 

zwykle rozbudowywaną bazę fałszy-
wych  alarmów,  gdyż  niebezpieczne 
programy  pisane  w  językach  wyso-
kiego  poziomu  charakteryzują  się 
pod względem zachowania wysokim 
podobieństwem do plików czystych. 
Przykładowo  moduły  autoaktualiza-
cji programów są pod względem za-
chowania bardzo podobne do popu-
larnych downloaderów.

Oprócz przeprowadzania skom-

plikowanej  analizy  zachowań,  blo-
kowane  mogą  być  wszystkie  po-
tencjalnie niebezpieczne akcje, ta-
kie  jak  wstrzykiwanie  kodu  do  in-
nych  procesów  i  tworzenie  w  nich 
zdalnych  wątków  czy  automatycz-
ne  uruchamianie  makr  MS  Office. 
Co więcej, niektóre programy anty-
wirusowe blokują wykonanie przez 
użytkownika  wszystkich  skryptów 
(.vbs,  .bat,  .cmd),  traktując  je  jako 
potencjalnie niebezpieczne.

Również monitorowanie dostępu 

do rejestru staje się elementem pro-
gramów  antywirusowych.  Wymaga 
jednak interaktywnego stwierdzenia, 
czy dana modyfikacja była zamierzo-
na, czy nie, co jest kłopotliwe dla nie-
doświadczonego użytkownika.

Sprawdzanie 

integralności

Najprostszym  podejściem  do  heu-
rystycznego  wykrywania  obecno-
ści  niebezpiecznego  oprogramo-
wania  jest  zbadanie,  czy  określo-
ne  obszary  systemu  (pliki,  rejestr) 

nie  ulegają  zmianie.  Jeszcze  kilka 
lat  temu  nie  było  problemem  mo-
nitorowanie  zmian  w  plikach  po-
przez  sprawdzenie  zapamiętanej 
poprawnej  sumy  kontrolnej.  Wraz 
z  upowszechnieniem  Internetu 
wzrosła  liczba  aplikacji,  które  au-
tomatycznie aktualizują się do naj-
nowszych  wersji,  modyfikując  nie 
tylko pliki danych, ale też pliki wy-
konywalne. Także sam system ope-
racyjny nie jest stały, ale modyfiko-
wany  za  pomocą  ukazujących  się 
mniej  lub  bardziej  regularnie  łat. 
Uwzględniając  fakt,  że  baza  sum 
kontrolnych może również stać się 
celem ataku, monitorowanie zmian 
na podstawie sum kontrolnych jest 
coraz rzadziej stosowane.

Sprawdzanie integralności dzia-

ła jednak w przypadku heurystycz-
nego  wykrywania  rootkitów,  jak 
czyni  to  System  Virginity  Verifier
Analizuje  on  zmiany  wprowadzone 
w  pamięci  modułów  systemowych 
i  porównuje  je  z  poprawnymi  war-
tościami  odczytanymi  z  plików 
(najlepiej  podpisanych  cyfrowo). 
Jeżeli  integralność  modułów  zo-
stanie naruszona, prawdopodobne 
jest  działanie  rootkita,  który  zmo-
dyfikował  system  w  celu  ukrycia 
w nim obiektów.

Integralność  plików  możemy 

sprawdzić dzięki istnieniu coraz czę-
ściej  stosowanych  podpisów  cyfro-
wych.  Niektóre  programy  antywiru-
sowe  nie  potrafią  przebić  się  przez 
warstwy zabezpieczające plików wy-
konywalnych  i  wszystkie  takie  pli-
ki  zgłaszają  jako  podejrzane.  Jeżeli 
jesteśmy twórcami oprogramowania 
i  chcemy  zabezpieczyć  program, 
jednocześnie  nie  przyprawiając 
użytkowników  o  palpitacje  serca  na 
skutek  fałszywego  alarmu,  program 
taki powinniśmy podpisać. Firmy an-
tywirusowe  będą  dzięki  temu  mo-
gły zidentyfikować twórcę programu 
i nie zgłaszać użytkownikowi zabez-
pieczenia jako podejrzanego.

Sprawdzanie  integralności  sta-

ło się jednym z podstawowych me-
chanizmów bezpieczeństwa w sys-
temie  Windows  Vista.  Wspomnia-
ny  mechanizm  Kernel  Patch  Pro-
tection
  sprawdza,  czy  nie  zostały 
wprowadzone w systemie nielegal-
ne zmiany:

•   modyfikowanie tablicy usług syste-

mowych (systfem service tables),

•   modyfikowanie tablicy przerwań 

(IDT),

•   modyfikowanie tablicy globalnych 

deskryptorów (GDT),

Rysunek 4. 

Wizualizacja robaków InTheWild według podobieństwa 

behawioralnego. Widzimy duże skupienia określające rodziny

background image

hakin9 Nr 01/2008

www.hakin9.org

Obrona

64

•   używanie w jądrze stosu, który nie 

został przydzielony przez jądro,

•   łatanie dowolnej części jądra.

Sprawą  dyskusyjną  jest,  czy  me-
chanizm  ten  rzeczywiście  zwięk-
sza bezpieczeństwo systemu. Mo-
dyfikowanie  systemu  operacyjne-
go było od dawna stosowane przez 
programy  zabezpieczające,  dzięki 
czemu mogły one wykonać dodat-
kowe sprawdzenia, które uniemoż-
liwiał  sam  system.  Przykładowo 
działający  w  czasie  rzeczywistym 
system  analizy  zachowań  musi 
zintegrować  się  z  systemem,  być 
bliżej  systemu  niż  niebezpieczne 
oprogramowanie, aby mógł je kon-
trolować.  Istnienie  Kernel  Patch 
Protection  uniemożliwia  taką  in-
tegrację.  Chociaż  mechanizm  ten 
zabezpieczy system przed niektó-
rymi rootkitami, ich twórcy i tak są 
w stanie go ominąć, wykorzystując 
nielegalne sztuczki. Sztuczek tych 
nie mogą jednak stosować produ-
cenci programów antywirusowych, 
dzięki czemu złośliwe oprogramo-
wanie  uzyskuje  nad  zabezpiecza-
jącym  przewagę.  Redukując  moż-
liwości  analizy  behawioralnej  Mi-
crosoft zmniejszył siłę heurystycz-
nej  detekcji  najpopularniejszych 
zagrożeń, czyli działających w try-
bie użytkownika.

Wykrywanie anomalii

Kiedy mówimy o heurystycznej de-
tekcji niebezpiecznego oprogramo-
wania, możemy wyróżnić dwa typy 
klasyfikacji, które faktycznie są wy-
krywaniem anomalii:

•   wszystko,  co  nie  jest  podobne 

do  normalnego  programu,  jest 
niebezpieczne,

•   wszystko,  co  jest  podobne  do 

niebezpiecznego programu, jest 
niebezpieczne.

Pierwszy  rodzaj  wykrywania  ano-
malii był skuteczny w przypadku in-
fektorów  plików.  Wykrywanie  poli-
morfizmu i metamorfizmu, nietypo-
wej budowy plików czy kodu asem-
blerowego  w  punkcie  wejścia  pro-
gramu  pozwalało  na  odróżnienie 

plików  bezpiecznych  od  zainfeko-
wanych.  W  momencie,  gdy  auto-
rzy  złośliwych  programów  prze-
rzucili się na języki wysokiego po-
ziomu, programy bezpieczne i nie-
bezpieczne  stały  się  zbyt  podob-
ne, by można je było łatwo rozróż-
nić.  Twórcom  heurystyk  pozostało 
poszukiwanie  podobieństw  złośli-
wych  programów  do  innych  złośli-
wych  programów.  Co  to  oznacza? 
Współcześnie nie jest możliwe wy-
krycie całkowicie nowego typu za-
grożenia,  gdy  nie  ma  ono  cech 
wspólnych z już istniejącymi.

Na  szczęście  dla  użytkowni-

ków (i twórców programów antywi-
rusowych), autorzy złośliwych pro-
gramów  wprowadzają  w  kolejnych 
wersjach  niewielkie  zmiany,  bazu-
ją  na  istniejących  rozwiązaniach 
i używają do zabezpieczenia plików 
popularnych narzędzi. Dzięki temu 
nowe  zagrożenia  posiadają  wiele 
cech wspólnych na wszystkich po-
ziomach,  od  podobieństwa  binar-
nego, aż do podobieństwa opisane-
go w domenie zachowań (Rysunek 
4). Już po otrzymaniu jednej prób-
ki program antywirusowy, wykorzy-
stujący zaawansowaną heurystykę, 
jest w stanie wykryć wszystkie wa-
rianty tego zagrożenia.

Oszukiwanie heurystyki

Teoretycznie detekcja niebezpiecz-
nego  programu,  którego  autor  po-
starał się, żeby program nie był wy-
kryty,  jest  bardzo  trudna.  W  sytu-
acji, gdy autor złośliwego programu 
napisze go od podstaw, nie wzoru-
jąc  się  na  istniejących  rozwiąza-
niach,  istnieje  dość  nikła  szansa, 
że  algorytm  heurystyczny  go  wy-
kryje. Jeszcze mniejsze jest praw-

dopodobieństwo  wykrycia  takiego 
zagrożenia  przy  użyciu  uogólnio-
nego  wzorca.  Co  więcej,  na  sku-
tek dostępności darmowych lub te-
stowych  wersji  programów  antywi-
rusowych, autor nowego programu 
może sprawdzić, czy jest on wykry-
wany  metodami  heurystycznymi. 
W  takim  przypadku  może  modyfi-
kować  go  do  czasu,  aż  przestanie 
być  uznawany  za  podejrzany.  Ist-
nieją  również  serwisy  online  ska-
nujące plik dużą liczbą silników an-
tywirusowych, takie jak Jotti's mal-
ware scan
 czy VirusTotal, z których 
twórca  robaka  czy  trojana  może 
skorzystać. 

Z tego powodu firmy antywiruso-

we  trzymają  w  rękawie  kilka  asów, 
jakimi  są  niedostępne  ogólnie  me-
chanizmy detekcji, które umożliwia-
ją wczesne wykrycie nowego zagro-
żenia i dostarczenie próbki do firmy 
w celu błyskawicznego przygotowa-
nia remedium.

Podsumowanie

Heurystyka  w  programach  anty-
wirusowych  ewoluuje  wraz  z  za-
grożeniami. Programy antywiruso-
we  od  kilku  lat  nie  służą  jedynie 
do  wykrywania  i  usuwania  wiru-
sów  komputerowych,  ale  skupiają 
się na ochronie użytkownika przed 
szerokim wachlarzem ataków. Sta-
ły  się  pakietami  zabezpieczający-
mi  przed  złośliwym  oprogramo-
waniem, włamaniami, phishingiem, 
rootkitami,  a  nawet  spamem.  Do 
ich wykrycia mogą wykorzystać al-
bo  wzorce,  albo  mechanizmy  pre-
wencyjne,  jakimi  są  współcześnie 
heurystyki.  Co  jest  skuteczniej-
sze?  Wiadomo  –  lepiej  zapobie-
gać, niż leczyć. l

O autorze

Jakub Dębski, starszy analityk w firmie ESET (producent programu NOD32), spe-
cjalizującej się w ochronie proaktywnej z wykorzystaniem najbardziej zaawanso-
wanych mechanizmów analizy heurystycznej. Wcześniej wieloletni pracownik pol-
skich firm antywirusowych. Był kierownikiem projektu silnika mks_vir, następnie 
ArcaVir. Studia na Wojskowej Akademii Technicznej ukończył obroną pracy dy-
plomowej na temat wykorzystania sieci neuronowych w detekcji zagrożeń inter-
netowych. 
Kontakt z autorem:debski.jakub@wp.pl