Sytuacja kobiet w IT w 2024 roku
24.04.20206 min
Thomas Roccia

Thomas RocciaSecurity Researcher / Advanced Threat ResearchMcAfee

Wykrywanie złośliwego oprogramowania

Poznaj techniki wykrywania i klasyfikacji złośliwego oprogramowania za pomocą algorytmów hashujących - od prostego MD5 do bardziej skomplikowanych metod - oraz poznaj ich słabe i mocne strony.

Wykrywanie złośliwego oprogramowania

W kryminalistyce oraz badaniach nad złośliwym oprogramowaniem hashowanie jest jedną z najpowszechniejszych technik identyfikacji złośliwego oprogramowania. Hashowanie jest natomiast procesem matematycznym, który oblicza unikalną sygnaturę dla tego, co dostanie na wejściu. W przeszłości hashowanie było nawet używane we wczesnych silnikach antymalware do wykrywania zagrożenia na zainfekowanej maszynie. W dzisiejszych czasach stało się ono bardzo ważną częścią analizy zagrożeń i udostępniania złośliwego oprogramowania.

Osoby reagujące na incydent bezpieczeństwa wykorzystają tę metodę do oceniania zagrożenia ze strony nieznanych plików, podczas gdy badacze szkodliwego oprogramowania będą wymieniać między sobą informacje o zagrożeniach, dołączając hashe złośliwych programów. Czynności te służą nawet do bardziej zaawansowanej klasyfikacji w celu zidentyfikowania pojedynczej próbki, rodzin złośliwego oprogramowania lub podobieństwa kodu i treści.

Artykuł ten krótko analizuje algorytmy hashujące używane do klasyfikowania złośliwego oprogramowania przez przyjrzenie się koncepcji hashowania oraz proponuje narzędzie, które może wykorzystać niektóre algorytmy hashowania do wykrywania szkodliwych programów.

Klasyfikacja Złośliwego Oprogramowania

W przypadku złośliwego oprogramowania kluczowe jest zidentyfikowanie zachowania, a także jego rodziny oraz określenie, czy jest ono częścią arsenału należącego do konkretnej grupy. Klasyfikacja złośliwego oprogramowania pozwala rozróżniać i klasyfikować różne jego typy, a dzięki temu, oszacować poziom zagrożenia. Hashowanie jest częścią procesu identyfikowania rodzin złośliwego oprogramowania lub jego pojedynczego elementu. 

Funkcja skrótu

“[Jest to] funkcja przyporządkowująca dowolnie dużej liczbie krótką, zawsze posiadającą stały rozmiar, niespecyficzną, quasi-losową wartość” - tak mówi Wikipedia. Taka funkcja jest bardzo przydatna do badania złośliwego oprogramowania i, niezależnie od wielkości wejścia, wygeneruje stały rozmiar. Hashowanie to powszechnie stosowana metoda jednoznacznej identyfikacji złośliwego oprogramowania.

Zarys funkcji skrótu


Szkodliwe oprogramowanie jest przepuszczane przez funkcję skrótu, która wylicza unikalny skrót pozwalający na zidentyfikowanie danego wirusa (coś w rodzaju odcisku palca). Zwróć jednak uwagę, że nawet najmniejsza zmiana może zmienić wartość skrótu. Istnieje kilka funkcji, których można użyć do klasyfikacji złośliwego oprogramowania.

Najpowszechniejsze

Funkcja skrótu Message-Digest Algorithm 5 (MD5) jest najczęściej wykorzystywanym narzędziem. Daje ono 128-bitową wartość skrótu i może być używana na dowolnym sprzęcie z Linuxem.

$ md5sum file.txt 
4da0bb01a96e70ce43ece0147f8438d1 file.txt


Chociaż MD5 jest historycznie bardzo popularne w badaniach nad złośliwym oprogramowaniem, narzędzie to jest jednak podatne na ataki kolizyjne, co oznacza, że dwa rodzaje danych wejściowych mogą mieć ten sam skrót. Secure Hash Algorithm (SHA) jest również wykorzystywany w badaniach nad złośliwym oprogramowaniem. Niestety, algorytm SHA1 też jest podatny na ataki kolizyjne. W badaniach nad złośliwym oprogramowaniem SHA-2 staje się najbardziej popularny, chociaż MD5 jest nadal używany.

SHA-2 (Secure Hash Algorithm 2) to zestaw kryptograficznej funkcji skrótu, w tym SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256. Można ich bardzo łatwo używać na komputerach z Linuxem.

$ sha256sum file.txt
8aec7831ac5a3bfc000b098efd3de14f989036b23055bad6e004e90bf12299b2 file.txt


Tradycyjne algorytmy kryptograficzne, takie jak MD5 lub SHA2, pozostają najczęściej używane do identyfikowania złośliwego oprogramowania, ponieważ bardzo łatwo się je wymienia i udostępnia.

Context Triggered Piecewise Hashes — SSDEEP

Identyfikacja dokładnie tych samych plików jest możliwa dzięki powszechnie używanym funkcjom skrótu (np. MD5 lub SHA2). Co się jednak stanie, gdy pojedynczy element zmieni się w jeden z tych plików? Będziemy mieć dwa różne wartości.

$ hexdump file.txt
0000000 54 68 69 73 20 6d 79 20 74 65 73 74 20 66 69 6c
0000010 65 20 6e 75 6d 62 65 72 20 31 0a
$ hexdump file2.txt
0000000 54 68 69 73 20 6d 79 20 74 65 73 74 20 66 69 6c
0000010 65 20 6e 75 6d 62 65 72 20 31
$ shasum file*
c4ca69bd984d0fd5ca8f949de3a0969851c74c55 file.txt
8e53e4d236c99ba4dcf7c4cbf1cea93d023391ea file2.txt


Zwróć uwagę na ostatni bajt file.txt „0a”. Pomimo tego, że te dwa pliki  są prawie identyczne, to mamy dwa całkowicie różne skróty. W rzeczywistości MD5 lub SHA2 obliczy skrót całego pliku, ale zmiana pojedynczego elementu zmieni wartość wyjściową. Utworzono zatem SSDEEP (a.k.a skrót rozmyty), aby temu zapobiec. SSDEEP oblicza wiele skrótów dla części pliku o stałym rozmiarze. Nazywa się to rolling hash.

Algorytm rolling hash tworzy pseudolosową wartość opartą tylko na bieżącym kontekście danych wejściowych. Rolling hash działa poprzez utrzymywanie stanu opartego wyłącznie na ostatnich kilku bajtach z danych wejściowych. Każdy bajt jest dodawany podczas przetwarzania i usuwany po przetworzeniu określonej liczby innych bajtów. Dzięki SSDEEP można identyfikować podobieństwa między 2 różnymi plikami. Jest on zatem bardzo przydatny do identyfikowania podobieństw między złośliwymi programami. 

Poniżej mamy dwie próbki z różnymi skrótami.

$ sha256sum
3b0096d6798b1887cffa1288583e93f70e656270119087ceb2f832b69b89260a sample1.exe
e8e948e36fed93061062406693d1b2c402dd8e5788506bfbb50dbd86a5540829 sample2.exe


Dzięki SSDEEP możemy zauważyć między nimi podobieństwo.

ssdeep *
1536:YQjsITrLg4xUSI6g+Oet/m0CJORgyaWxZnONksWjcdLoIhDBK2dks4QTg12A58A+:YusoUSpg+Rm00UaNLcIhDB6CgrQp0MV,"sample1.exe"
1536:YQjsITrLg4xUSI6g+Oet/m0CJORgyaWxZnONksWjcd5oIhDBK2dks4QTg12A58A+:YusoUSpg+Rm00UaNLOIhDB6CgrQp0MV,"sample2.exe"


SSDEEP ma jednak swoje własne słabości. Rozmiar skrótu można łatwo zmodyfikować, dodając, na przykład, sekcję w binarce. Pozostaje on jednak interesującym narzędziem do identyfikacji podobieństw między złośliwym oprogramowaniem.

Import Address Table Hashing (Imphash, ImpFuzzy)

Inną techniką identyfikowania podobieństw między szkodliwymi programami jest obliczanie wartości skrótu poprzez Import Address Table (IAT). Ślad ten jest oparty na liście funkcji IAT wskazujących, że 2 różne próbki używają tych samych funkcji.

Import Hashing został utworzony przez FireEye i oblicza skrót MD5 IAT. Można go używać z biblioteką PeFile.

>>> import pefile
>>> pefile.PE(“sample2.exe”)
>>> pe.get_imphash()
'3e419f563516b0b50bb14cfe54e4f1ac'


Jednym z problemów związanych z ImpHash jest to, że jeśli linker zmieni kolejność funkcji, zmieni się również jej skrót. ImpFuzzy jest alternatywą dla ImpHash. Oblicza ono również skrót IAT, ale zamiast MD5, używa SSDEEP.

>>> import pyimpfuzzy
>>> pyimpfuzzy.get_impfuzzy(“sample2.ese”)
48:rxfCL7plw9NUviUwOUtRDA3qXR0HpuKa/wlU:rxaL7plw9NUaUwOUtRTR0HpuKSwW

Rich PE Hashing, znany też jako RichHash

Nagłówek Rich PE jest sekcją nagłówka Portable Executable w dowolnym pliku wykonywalnym skompilowanym za pomocą programu Microsoft Visual Studio. Nagłówek Rich zawiera informacje o środowisku kompilacji i jest przechowywany za pomocą prostego XOR. Sekcja ta może być zatem wykorzystana do wyszukiwania złośliwego oprogramowania. Podobnie jak ImpHash, możliwe jest obliczenie skrótu tej sekcji, aby ułatwić korzystanie z nagłówka Rich podczas szukania wirusów. Nazwałem ten skrót RichHash.

Aby uprościć ten proces, stworzyłem własne narzędzie, które zaprezentuję na końcu tego artykułu.

>>> import superpehasher
>>> pe = superpehasher.SuperPEHasher(‘calc.exe’)
>>> pe.get_richhash
(‘87107a65f8d4bac1712543f317925b49711249b750f31c4f21376c9385117fd8’, ‘951cfa6151f9b4301ba58bde359effe21b6af7d87a168de750067396ec4e5f78’)


Za jego pomocą można wyodrębnić i obliczyć RichHash  z nagłówka Rich potraktowanego XOR-em i tego przed operacją XOR. W powyższym przypadku pierwszy RichHash to ten z XOR, a drugi RichHash to ten bez XOR. Chociaż korzystanie z RichHash do wykrywania złośliwego oprogramowania jest interesujące, to raport firmy Kaspersky Lab wykazał, że atakujący może niestety przejąć Rich Header.

Machoc Hash

Machoc Hash został wprowadzony przez ANSSI jako część frameworka Polychombr. Celem Machoc jest obliczenie skrótu grafu Control Flow (CFG), który jest reprezentacją wywołania funkcji w postaci binarnej.

Przykład CFG przy użyciu R2


Kolejną implementacją Machoc Hash jest ta z Conix Security korzystającego z Radare2. Rozmiar skrótu zależy od liczby funkcji w pliku binarnym. Poniżej znajduje się przykład skrótu wygenerowanego dla binarki calc.exe (zwróć uwagę, że obcięliśmy ten skrót).

ed7c76d41a02300e08e7177411a02300ead543fa0d346c2ed4ac25a954ac25a951a02300e1a02300e000039423f2825315453253154531a02300e2531545325315453253154532531545325315453253154533d44802b006caf82761a02300e1a02300e6caf8276253154532531545339423f2803d44802b25315453253154532531545325315453253154532531545325315453253154532531545325315453253154536be74d642531
[TRUNCATED]
a02300eb952297bd48279c6b0641afe19ed01b71a02300e1a02300e3db8a17a1a02300e1a02300e1a02300e1a02300e1a02300ed3fa94a6bf35dfb1a02300e1a02300e1a02300e1a02300e1a02300e3db8a17a1a02300e1a02300e1a02300e1a02300e1a02300e5713ec027316d74635e8b94f1a02300e1a02300e1a02300e1a02300e1a02300e1a02300e632a48103db8a17a3761c266aac7593c1498d641ccab38bbdfbc3c64a676758fb8d3e2e4777cf88c4f3ee4ad92c053444dba42188102c4af4bb0b0b71bab2d341bd89ec14eb1f8dbfe77ed7ce39e359cf7634ff245567cec45567cec45567cec986167a43db8a17a3db8a17a


Na Machoc Hash można w miarę polegać i może ono zostać użyte do obliczenia podobieństw między dwiema próbkami.

SuperPeHasher

Stworzyłem w Pythonie wrapper dla niektórych z tych algorytmów. Biblioteka nazywa się SuperPeHasher i jest dostępna na moim Githubie. Narzędzie to jest dedykowane dla pliku PE. Po instalacji wymagań można zaimportować bibliotekę, aby użyć tego narzędzia.

>>> import superpehasher
>>> pe = superpehasher.SuperPEHasher(‘calc.exe’)
>>> pe.get_md5())
>>> pe.get_sha1())
>>> pe.get_sha2())
>>> pe.get_sha5())
>>> pe.get_ssdeep())
>>> pe.get_imphash())
>>> pe.get_impfuzzy())
>>> pe.get_richhash
>>> pe.get_pehash())
>>> pe.get_machoc_hash())


Przykład wyjścia SuperPeHashera


Wygeneruje to skróty, których możesz użyć do badań nad złośliwym oprogramowaniem.

Podsumowanie

Istnieje kilka innych algorytmów hashujących, takich jak PeHash, TLSH, czy MinHash. Artykuł ten omawia tylko niektóre z metod badania i klasyfikacja złośliwego oprogramowania.

<p>Loading...</p>