Wirusy polimorficzne, to rodzaj złośliwego kodu, oprogramowania, posiadający możliwość zmiany kodu swojego dekryptora, czyli narzędzia deszyfrującego, dzięki czemu każda kolejna kopia takiego wirusa wygląda inaczej.
Jest to jeden z najtrudniejszych wirusów do usunięcia z zainfekowanego urządzenia.
Bardziej szczegółowo o wirusach polimorficznych
Podstawowa zasada działania wirusów zwykłych, jak i polimorficznych, jest taka sama i generalnie sprowadza się do uszkadzania danych zapisanych na zarażonym urządzeniu, spowalnianiu pracy zainfekowanego urządzenia, na jego awarii kończąc. Oba rodzaje wirusów do swojego działania wymagają innego programu, do którego się „dołączają” – jest to tzw. host. Ponadto do skutecznego ich działania konieczne jest działanie użytkownika, np. uruchomienie programu, który w swoim kodzie ma zaszyty kod wirusa, dzięki czemu wirusy nie tylko infekują urządzenie, na którym został uruchomiony zarażony program (host), ale też przemieszczają się pomiędzy systemami, dołączają fragmenty złośliwego kodu do innych plików lub też całkowicie zastępują poszczególne pliki ich złośliwymi kopiami.
Jak wspomniałem we wstępie, wirusy polimorficzne cechują się niezwykłą zmiennością swojego kodu znacząco utrudniającą ich wykrycie. Nie posiadają one swojej określonej sygnatury, przez co nie są one wykrywane, m.in. przez systemy antywirusowe, które wykrywając złośliwe oprogramowanie opierają się właśnie na sygnaturach.
Nie oznacza to wszakże, że wirusy polimorficzne są pozbawione swojej sygnatury, jednakże każda kolejna kopia takiego złośliwego kodu posiada inną sygnaturę.
Budowa i działanie wirusa polimorficznego
Każdy wirus polimorficzny składa się z dwóch części, czyli polimorficznego loadera, który także jest nazywany deszyfratorem lub dekryptorem oraz części zaszyfrowanej stanowiącej właściwy (główny) kod takiego wirusa.
Podczas infekcji najpierw uruchamiany jest dekryptor odpowiadający za odszyfrowanie głównej części wirusa w pamięci infekowanego urządzenia. Po dokonaniu tej deszyfracji dekryptor przekazuje kontrolę do kodu składającego się na główną część wirusa polimorficznego.
Niemniej jednak w zależności od wirusa polimorficznego tworzony jest nowy deszyfrator, który czasem określany jest także jako silnik mutacyjny lub silnik polimorficzny (co oznacza zmianę sygnatury wirusa) albo przy każdym infekowanym pliku, albo przy ponownym uruchomieniu zainfekowanego urządzenia w przypadku wirusów polimorficznych powolnych.
Cechą charakterystyczną wirusów polimorficznych jest niezmienianie swojego kodu, a jedynie zmiana sygnatur na podstawie nowo tworzonych silników deszyfrujących lub samej nazwy pliku. Jest to znaczącą różnicą w stosunku do wirusów metamorficznych, które także zmieniają swój kod.
Wirus polimorficzny rozprzestrzeniając się na zainfekowanym urządzeniu dołącza swój kod do plików wykonywalnych, np.: .exe, .dll, czy .src, ale także potrafi infekować pliki w innych formatach, np.: .doc, .jpg, czy .pdf.
W tym miejscu warto dodać, że kodowanie procedur szyfrujących wirusy opiera się na tym, że różne ciągi instrukcji procesora dają ten sam efekt, np. rejestr AX może być wyzerowany za pomocą następujących ciągów instrukcji:
- MOV AX, 0 –> NOP;
- NOP –> MOV AL, 0 –> MOV AH, 0;
- XOR AX, AX –> NOP –> NOP.
Ponadto zmiana kodu bez zmiany wyniku może nastąpić poprzez wykorzystanie różnych rejestrów do obliczania tych samych wartości, a także poprzez użycie instrukcji SUB zamiast DEC lub użycie instrukcji ADD zamiast INC.
Mając powyższe na uwadze, przykładowy schemat działania wirusa polimorficznego może wyglądać następująco:
- wirus dokonuje zmiany nagłówka programu plików w postaci przemieszczalnej lub pierwszych trzech bajtów plików w postaci absolutnej, co ma na celu wykonanie się kodu wirusa w pierwszej kolejności,
- następnie złośliwy kod wirusa polimorficznego wywołuje funkcję kodującą, która odpowiedzialna jest za utworzenie zakodowanej wersji wirusa oraz wygenerowanie nowej procedury odkodowującej, przy czym co do zasady procedura odkodowująca jest za każdym razem inna, co już opisałem powyżej,
- kolejno wirus dopisuje do infekowanego przez siebie pliku utworzoną przez funkcję kodującą procedurę odkodowującą oraz zakodowaną wersję samego siebie, gdyż zawiera w sobie funkcję kodującą.
Krótko o generatorach wirusów polimorficznych
Wirusy polimorficzne można tworzyć przy wykorzystaniu bibliotek funkcji kodujących oraz generujących funkcje odkodowujące, które stają się generatorami wirusów polimorficznych. Do poprawnego działania tych funkcji konieczny jest generator liczb losowych, niemniej jednak jego proste wersje często dołączane są do takich bibliotek.
Mając dostęp do właściwej biblioteki, samo zbudowanie wirusa polimorficznego jest stosunkowo proste i składa się z następujących etapów (poniższy opis ma jedynie cele edukacyjne):
- napisanie zwykłego, niepolimorficznego wirusa, który przed infekcją wywołuje funkcję kodującą,
- napisanie własnego generatora liczb losowych, gdyż im lepszy jest generator tym lepiej działa funkcja kodująca – oczywiście można też użyć generatora dostarczonego wraz z biblioteką, niemniej jednak funkcja kodująca może nie działać tak skutecznie jak na podstawie generatora napisanego samemu,
- dokonanie kompilacji kodu wirusa i połączenie wirusa z wykorzystaną biblioteką funkcji kodujących.
Jednakże warto zaznaczyć, że dostępne są gotowe generatory wirusów polimorficznych, do których można zaliczyć:
- MtE, czyli Mutation Engine – jest to pierwszy generator użyty do stworzenia wirusów polimorficznych napisany przez Dark’a Ayenger’a; był on dystrybuowany w postaci pliku mte.obj, a samo kodowanie odbywało się słowo po słowie; ponadto generator liczb losowych był umiejscowiony w pliku ran.asm, lecz osoba wykorzystująca MtE mogła zamienić dostarczony generator liczb losowych na inny,
- TPE, czyli TridenT Polymorphic Engine – to jeden z najpopularniejszych i najbardziej rozpowszechnionych generatorów wirusów polimorficznych, wykorzystujący do szyfrowania procedurę Crypt.
Wirusy polimorficzne – przykłady:
Zanim przejdę do zaprezentowania przykładowych wirusów polimorficznych, chciałbym wskazać, że aktualnie 97% wszystkich odmian złośliwego oprogramowania korzysta z technik polimorficznych. Jednakże ta skala nie powinna dziwić biorąc pod uwagę zwiększającą się świadomość użytkowników, coraz skuteczniejsze systemy służące do wykrywania złośliwej aktywności, w tym złośliwego kodu, jak również zmieniające się taktyki ataków i infekcji złośliwym oprogramowaniem.
Wracając jednak do przykładów słynnych wersji złośliwego oprogramowania polimorficznego, nie można pominąć:
- Storm Worm Email, o którym świat usłyszał w 2007 roku. Była to wiadomość e-mail, której temat był następujący: „230 dead as storm batters Europe”, czyli „230 ofiar śmiertelnych burzy w Europie”. Złośliwość tej wiadomości polegała na posiadaniu załącznika, który po pobraniu instalował trojana przekształcającego zainfekowany komputer w bota. Wykrycie tego złośliwego oprogramowania było bardzo trudne, ponieważ jego sygnatury zmieniały się co 30 minut. W szczytowym momencie ten złośliwy kod odpowiadał za 8% wszystkich infekcji złośliwym oprogramowaniem na świecie.
- CryptoWall Ransom – złośliwe oprogramowanie ransomware, którego unikatowość polegała na tym, że zmieniał się dla każdego zainfekowanego systemu, dzięki czemu stawał się unikatowy dla danego systemu i przez to niezwykle trudny do wykrycia. Ponadto zawierał algorytm zmieniający jego cechy co określony czas, co także prowadziło do zmiany sygnatur i tym samym jeszcze bardziej utrudniało jego wykrycie.
Jak można wykryć wirusa polimorficznego?
Na samym początku należy wyraźnie zaznaczyć, że obecnie zarówno firewalle, IPS-y, systemy antywirusowe opierające się na sygnaturach oraz inne systemy służące do detekcji złośliwego oprogramowania na podstawie jego sygnatur nie są w stanie wykryć wirusów polimorficznych.
Polega to na tym, że tradycyjne oprogramowanie antywirusowe lub antymalware szuka sygnatur lub heurystyk, które są sekwencjami kodu w pliku. Wobec tego te systemy nie potrafią rozpoznać wirusa polimorficznego po jego ponownym zaszyfrowaniu. Dzieje się tak nawet wtedy, gdy inny punkt końcowy (np. komputer) będący w tej samej sieci został wcześniej zainfekowany przez znany wirus polimorficzny, który został dodany do listy blokowanych systemów (blocklisty).
W związku z powyższym, aby skutecznie wykrywać wirusy polimorficzne, należy stosować zaawansowane narzędzia cyberbezpieczeństwa, które umożliwiają ochronę przed złośliwym oprogramowaniem bez opierania się na jego sygnaturach.
Taka ochrona przed złośliwym oprogramowaniem polimorficznym wykorzystuje algorytmy uczenia maszynowego (ML) w celu określenia prawdopodobieństwa złośliwości danego pliku, poprzez rozszerzoną analizę i wyodrębnienie z analizowanych plików cech świadczących o ich złośliwym działaniu. Są to cechy wysokiego poziomu, które numerycznie opisują strukturę pliku. Na przykład dany model ML może analizować ilość losowości w różnych obszarach pliku, a także obrazy, ikony, szablony interfejsu użytkownika lub tabele ciągów. Takie narzędzia mogą również przeprowadzić inżynierię wsteczną i opisać kod w sposób numeryczny, aby można go było wprowadzić do klasyfikatora uczenia maszynowego.
Także skutecznym sposobem ochrony przed wirusami polimorficznymi jest wdrożenie solidnego rozwiązania antywirusowego nowej generacji (NGAV), które obejmuje ochronę przed znanymi i nieznanymi zagrożeniami, w tym atakami bezplikowymi i atakami bez sygnatur (polimorficznymi), a także zapobiega atakom bez użycia złośliwego oprogramowania i wprowadza integrację z narzędziami do analizy zagrożeń.
Najlepsze praktyki mające na celu zapobieganie infekcji wirusami polimorficznymi
Podstawową i najlepszą praktyką jest świadomość użytkowników w zakresie możliwych zagrożeń i technik wykorzystywanych przez cyberprzestępców.
Niemniej jednak nie należy także zapominać o pozostałych dobrych praktykach, czyli:
- posiadaniu oprogramowania antywirusowego nowej generacji,
- dbaniu o aktualność systemów operacyjnych i aplikacji,
- używaniu blokady wyskakujących okienek oraz nieklikaniu w wyskakujące reklamy,
- przestrzeganiu zasady, aby nigdy nie otwierać niechcianych lub podejrzanych załączników wiadomości e-mail otrzymanych od niezweryfikowanych lub nieznanych nadawców,
- nie korzystaniu z publicznie dostępnych niezabezpieczonych sieci Wi-Fi,
- nawiązywaniu komunikacji internetowej tylko ze stronami korzystającymi z bezpiecznego protokołu HTTPS,
- zachowaniu ostrożności przy korzystaniu z darmowego oprogramowania i dokładnym zapoznaniu się z warunkami korzystania z takiego oprogramowania,
- ustawieniu blokady ekranu,
- używaniu silnych i unikatowych haseł lub korzystaniu z uwierzytelniania bezhasłowego,
- korzystaniu z uwierzytelniania wieloskładnikowego na wszystkich urządzeniach i aplikacjach,
- szczegółowej weryfikacji uprawnień, które jako użytkownik, przyznaje się aplikacjom w momencie ich instalacji,
- zachowaniu ostrożności przy wyrażaniu zgody na pliki cookie danej witryny.
Podsumowanie
Pomimo, że wirusy polimorficzne są znane od wielu lat, wciąż stanowią jedno z największych zagrożeń dla sieci i systemów komputerowych. Ukrywanie się pod innymi sygnaturami, zmienianie nazw i podmienianie plików powoduje, że wirusy te są bardzo trudne do wykrycia.
Niemniej jednak stosowanie najnowszych systemów bezpieczeństwa opierających się na uczeniu maszynowym oraz zachowanie najlepszych praktyk bezpieczeństwa zapobiegnie a przynajmniej znacząco utrudni infekcję wirusem polimorficznym.
Autor: Michał Mamica