Rootkity oraz metody ich zwalczania
Wsp贸艂cze艣ni cyber-przest臋pcy przyjmuj膮 podej艣cie stosowane przez cybernetycznych wandali 10-15 lat temu. Jednym z pierwszych znanych wirus贸w dla komputer贸w PC by艂
Obecnie z艂o艣liwe programy dla systemu UNIX nie s膮 tak rozpowszechnione jak te dla 艣rodowiska DOS i Windows. Termin "rootkit" zosta艂 zapocz膮tkowany w 艣wiecie Uniksa. Obecnie jednak stosowany jest na okre艣lenie technologii ukrywania stosowanych przez autor贸w koni troja艅skich dla system贸w Windows. Pocz膮tkowo "rootkit" oznacza艂 zestaw program贸w, kt贸re pozwala艂y hakerowi na unikni臋cie wykrycia. W tym celu nale偶y zast膮pi膰 wykonywalne pliki systemowe (takie jak ligin, ps, ls, netstat itd.) lub biblioteki systemowe (libproc.a) lub zainstalowa膰 modu艂 j膮dra. Obydwa sposoby s艂u偶膮 temu samemu: uniemo偶liwiaj膮 u偶ytkownikom otrzymanie dok艂adnych informacji o tym, co si臋 dzieje w komputerze.
Jak pokazuje Wykres 1, coraz cz臋艣ciej stosuje si臋 rootkity w celu zamaskowania obecno艣ci z艂o艣liwego kodu w zainfekowanych systemach.

Wykres 1. Zwi臋kszenie zastosowania rootkit贸w w z艂o艣liwych programach
Wzrost popularno艣ci rootkit贸w spowodowany jest cz臋艣ciowo dost臋pno艣ci膮 w Internecie ich kodu 藕r贸d艂owego. Tw贸rcy wirus贸w bez trudu dokonaj膮 niewielkich modyfikacji takiego kodu. Innym czynnikiem wp艂ywaj膮cym na rozpowszechnienie rootkit贸w jest to, 偶e wi臋kszo艣膰 u偶ytkownik贸w systemu Windows u偶ywa konta administratora zamiast tworzenia oddzielnego konta u偶ytkownika. Znacznie u艂atwia to zainstalowanie rootkita na komputerze ofiary.
Tw贸rcy wirus贸w i producenci pseudo-legalnego oprogramowania typu spyware widz膮 dla siebie unikatow膮 reklam臋 w mo偶liwo艣ci wykorzystania rootkit贸w do ukrycia obecno艣ci z艂o艣liwego kodu zar贸wno przed u偶ytkownikami, jak i rozwi膮zaniami antywirusowymi.
Przyjrzyjmy si臋 bli偶ej rootkitom dla system贸w Windows i UNIX.
Rootkity dla system贸w Windows
Metody maskowania
Obecnie rootkity stosuj膮 dwie metody w celu maskowania swojej obecno艣ci w systemie:
- modyfikowanie 艣cie偶ek
- modyfikowanie struktur systemu
Metody te s艂u偶膮 zamaskowaniu aktywno艣ci sieciowej, kluczy w rejestrze, proces贸w, tj. wszystkiego, co mog艂oby sk艂oni膰 u偶ytkownika do zwr贸cenia uwagi na z艂o艣liwy program w systemie.
Pierwsz膮 metod臋 mo偶na zastosowa膰 w rootkitach zar贸wno w trybie u偶ytkownika, jak i j膮dra. W przypadku rootkit贸w w trybie u偶ytkownika implementacja jest stosunkowo prosta. W celu modyfikacji 艣cie偶ki najcz臋艣ciej wykorzystywana jest metoda opieraj膮ca si臋 na przechwytywaniu funkcji API.

Rys. 2. Przechwytywanie funkcji API.
Metoda ta wykorzystuje fakt, 偶e aplikacje wywo艂uj膮 funkcje API przy u偶yciu specjalnych p贸l danych (tabela importowa/eksportowa) lub przez po艂膮czenie si臋 z adresem uzyskanym za pomoc膮 funkcji API "GetProcAddress". Kod programu zaimplementowany jest w modu艂ach DDL, kt贸re s膮 nast臋pnie integrowane z przestrzeni膮 adresow膮 istniej膮cych proces贸w systemowych. Dzi臋ki temu zdalny haker mo偶e kontrolowa膰 wszystkie aplikacje u偶ytkownika. Modyfikacja 艣cie偶ek jest dobrze udokumentowan膮 i 艂atw膮 w implementacji metod膮, kt贸r膮 mo偶na cz臋sto zastosowa膰 w rootkitach.
Pomimo wielu zalet podej艣cie to posiada r贸wnie偶 powa偶ne wady: rootkit nie jest w stanie zamaskowa膰 aktywno艣ci ze stuprocentow膮 skuteczno艣ci膮. Oznacza to, 偶e rootkit w trybie u偶ytkownika jest 艂atwy do wykrycia w systemie przy u偶yciu wyspecjalizowanych narz臋dzi, takich jak RootKit Revealer, SoftIce itd. Niew膮tpliwie jest to przyczyn膮 rosn膮cej popularno艣ci rootkit贸w w trybie j膮dra pomimo faktu, 偶e znacznie trudniej jest je stworzy膰.
Rootkity w trybie j膮dra znacznie lepiej maskuj膮 informacje. Wi臋kszo艣膰 z nich wykorzystuje nieudokumentowane struktury systemu operacyjnego. Rootkity te cz臋sto przechwytuj膮 na przyk艂ad us艂ugi z tabeli KeServiceDescriptorTable. Liczba us艂ug w tej tabeli r贸偶ni si臋 w zale偶no艣ci od wersji systemu operacyjnego. Oznacza to, 偶e przy opracowywaniu rootkit贸w nale偶y przeprowadzi膰 dodatkow膮 analiz臋 kodu systemu operacyjnego, aby znale藕膰 w tabeli wykaz program贸w obs艂ugi. Podej艣cie to jest bardzo zbli偶one do przechwytywania funkcji API.
Modyfikacja PsActiveProcessList jest jednym z przyk艂ad贸w drugiego podej艣cia, tj. zmiany struktur systemu. Podej艣cie to wykorzystywane jest przez rootkit FU i umo偶liwia mu ukrycie ka偶dego procesu przed wi臋kszo艣ci膮 narz臋dzi systemowych.

Rys. 3. Lista proces贸w przed uruchomieniem rootkita

Rys. 4. Lista proces贸w po uruchomieniu rootkita.
Ilustracja pokazuje, 偶e program Notepad widnieje na li艣cie aktywnych proces贸w jako notepad.exe (zaznaczony czerwon膮 obw贸dk膮). Zrzut ekranu na rysunku 4 zosta艂 wykonany po uruchomieniu rootkita FU z poleceniem ukrycia procesu. Zrzut ekranu pokazuje, 偶e nawet je艣li edytor jest aktywny, jego proces nie jest widoczny na li艣cie aktywnych proces贸w.
Wykrywanie rootkit贸w
Pierwszym krokiem w zwalczaniu rootkit贸w jest ich wykrycie. Autorzy rootkit贸w zawsze mog膮 o krok wyprzedza膰 narz臋dzia do ich wykrywania, poniewa偶 nieustannie rozwijaj膮 nowe technologie, natomiast producenci oprogramowania antywirusowego potrzebuj膮 czasu do zanalizowania tych technologii i opracowania narz臋dzi wykrywaj膮cych. Pomimo z艂o偶ono艣ci rootkit贸w produkty firmy Kaspersky Lab w wersji 6 posiadaj膮 zdolno艣膰 skutecznego wykrywania rootkit贸w (Wersja 6.0 przechodzi obecnie wewn臋trzne testy). W jaki spos贸b produkty firmy Kaspersky Lab reaguj膮 na opisane powy偶ej rootkity FU?
Dla przypomnienia: instalacja rootkita spowodowa艂a ukrycie proces贸w systemowych. Podsystem przeznaczony do zwalczania rootkit贸w wykrywa to i ostrzega u偶ytkownika (rysunek 5).

Rys. 5. Wykrywanie nieznanych, ukrytych proces贸w
Podsystem pozwala na wykrycie nie tylko rootkit贸w, kt贸re zosta艂y ju偶 dodane do antywirusowych baz danych, ale r贸wnie偶 tych nieznanych, jak pokazuje rysunek 6.
Podobny podsystem wykorzystywany jest do wykrywania rootkit贸w w trybie u偶ytkownika (om贸wionym w pierwszej cz臋艣ci artyku艂u), kt贸ry wprowadza DLL do innych proces贸w.
W takich wypadkach podsystem reaguje powiadamiaj膮c u偶ytkownika, 偶e okre艣lony proces pr贸buje wprowadzi膰 kod do innego procesu (rysunek 6).

Rys. 6. Wykrywanie wprowadzania kodu do innego procesu
Rootkity dla systemu UNIX
Maskowanie obecno艣ci w systemie
W systemach Unix rootkity wykorzystywane s膮 w taki sam spos贸b jak w systemach Windows. Haker instaluje rootkita na komputerze ofiary, jak tylko zdo艂a uzyska膰 przywileje administratora. Przywileje te s膮 niezb臋dne do zainstalowania wi臋kszo艣ci rootkit贸w i mo偶na je uzyska膰 wykorzystuj膮c znane luki w zabezpieczeniach pod warunkiem, 偶e haker posiada standardowe przywileje u偶ytkownika w systemie ofiary. Zdalny u偶ytkownik mo偶e wykorzysta膰 lokalny exploit lub narz臋dzie do z艂amania bazy danych hase艂. Je艣li haker nie posiada odpowiednich uprawnie艅, w celu przechwycenia hase艂 mo偶e u偶y膰 zdalnego eksploita lub aplikacji pods艂uchuj膮cej (sniffera). Has艂a mo偶na przechwytywa膰 w szeregu r贸偶nych us艂ug (ftp, telnet itd.), poniewa偶 wszystkie te us艂ugi przesy艂aj膮 has艂a poprzez sie膰 w formie czystego tekstu.
Rootkity mog膮 zawiera膰 wiele r贸偶nych z艂o艣liwych program贸w (Trojan-DDos, backdoor itd.), kt贸re po zainstalowaniu na zainfekowanym komputerze b臋d膮 czeka艂y na polecenia od zdalnego hakera. Dodatkowo, rootkity mog膮 r贸wnie偶 zawiera膰 艂aty na luki w systemie maj膮ce na celu uniemo偶liwienie przenikni臋cia do systemu innego hakera.
Podobnie jak w przypadku systemu Windows, rootkity dla Uniksa mog膮 wykorzystywa膰 zar贸wno tryb u偶ytkownika, jak i tryb j膮dra.
Rootkity w trybie u偶ytkownika posiadaj膮 zazwyczaj troja艅skie wersje standardowych program贸w, kt贸re maskuj膮 obecno艣膰 ich komponent贸w w systemie oraz backdoora, kt贸ry umo偶liwia ukryty dost臋p do systemu. Przyk艂ady rootkit贸w w trybie u偶ytkownika obejmuj膮 lkr, trOn, ark. Przyjrzyjmy si臋 rootkitowi w trybie u偶ytkownika na przyk艂adzie trOn. W celu zamaskowania swojej obecno艣ci w systemie rootkity te wykonuj膮 szereg czynno艣ci. Po zainstalowaniu rootkit zatrzymuje demona syslogd, a nast臋pnie zast臋puje swoj膮 w艂asn膮 troja艅sk膮 wersj膮 nast臋puj膮ce narz臋dzia systemowe: du, find, ifconfig, login, ls, netstat, ps, top, sz. Poza tym, do systemu dodawana jest troja艅ska wersja demona sshd. Na koniec w tle zostaje uruchomiony sniffer. Do pliku inetd.conf zostaje dodane polecenie uruchamiaj膮ce demony telnetd, rsh oraz finger; inetd zostaje powt贸rnie uruchomiony, a syslogd zrestartowany.
TrOn zazwyczaj zlokalizowany jest w /usr/src/.puta. Katalog ten jest jednak niewidoczny z powodu komponentu ls, kt贸ry zosta艂 ju偶 zainstalowany.
Przyjrzyjmy si臋 teraz rootkitom w trybie j膮dra. Rootkity tego typu posiadaj膮 wszystkie funkcje rootkit贸w w trybie u偶ytkownika, ale na ni偶szym poziomie. Rootkity w trybie u偶ytkownika przeznaczone s膮 do modyfikacji poszczeg贸lnych plik贸w binarnych, podczas gdy rootkity w trybie j膮dra mog膮 modyfikowa膰 tylko j膮dro. Rootkity te s膮 znacznie efektywniejsze w maskowaniu aktywno艣ci.
Istnieje kilka metod wprowadzenia rootkit贸w do j膮dra systemu:
- wykorzystanie LKM: j膮dro Linuksa (podobnie jak w wielu innych systemach operacyjnych) umo偶liwia pod艂adowanie modu艂贸w (lub sterownik贸w urz膮dze艅) w locie, co pozwala zdalnemu hakerowi na modyfikacj臋 odwo艂a艅 systemu do j膮dra i prowadzi do zwr贸cenia nieprawid艂owych informacji (np. zmodyfikowana lista plik贸w). Atakom takim mo偶na zapobiec kompiluj膮c j膮dro monolityczne bez obs艂ugi LKM. Jednak wad膮 tego rozwi膮zania jest to, 偶e j膮dro musi posiada膰 wszystkie sterowniki.
- zapisanie (rootkita) w /dev/kmem, co pozwala na uzyskanie dost臋pu do obszaru pami臋ci zajmowanej przez j膮dro. Powoduje to przepisanie j膮dra bez powiadamiania u偶ytkownika. J膮dro mo偶na zmodyfikowa膰 poprzez zlokalizowanie odpowiedniego obszaru pami臋ci. Mo偶na jednak dokona膰 modyfikacji, k贸re uniemo偶liwi膮 zapisanie bezpo艣rednio do /dev/kmem. Zapisanie do /dev/kmem mo偶ne r贸wnie偶 zosta膰 wykonane przy u偶yciu odwo艂a艅 mmap.
- infekcja istniej膮cych modu艂贸w; metoda ta r贸偶ni si臋 od pierwszego sposobu tym, 偶e sam rootkit nie zawiera oddzielnego modu艂u i wprowadza si臋 do istniej膮cych modu艂贸w. Oznacza to, 偶e rootkit "opiera si臋" ponownemu uruchomieniu systemu, poniewa偶 infekuje modu艂y, kt贸re s膮 zawsze 艂adowane (np. sterowniki systemu plik贸w).
Wykrywanie rootkit贸w
Niestety podanie uniwersalnych metod wykrywania rootkit贸w jest niemo偶liwe. Nast臋puj膮ce czynno艣ci mo偶na jednak zastosowa膰 w przypadku wi臋kszo艣ci rootkit贸w:
- 艣ledzenie nietypowych zachowa艅 plik贸w, zu偶ycia zasob贸w sieciowych, uruchamiania zada艅 wed艂ug terminarza oraz po ponownym uruchomieniu komputera, monitorowanie kont u偶ytkownika.
- zastosowanie nast臋puj膮cych narz臋dzi, kt贸re mog膮 by膰 pomocne w wykryciu obecno艣ci rootkita w systemie: Saint Jude, Chrootkit, RkScan, Carbonite, Kstat, Rootkithunter, Tripware, Samhain i inne.
Wnioski
Wszystkie metody wykrywania aktywnych rootkit贸w wykorzystuj膮 fakt, ze rootkity w ten czy inny spos贸b zak艂贸caj膮 funkcjonowanie systemu. T臋 w艂a艣ciwo艣膰 rootkit贸w wykorzystuj膮 produkty firmy Kaspersky Lab. Dzi臋ki temu potrafi膮 r贸wnie偶 wykrywa膰 nieznane rootkity. Znacznie trudniej b臋dzie napisa膰 rootkity dla przysz艂ych wersji systemu Windows, kt贸re nie b臋d膮 pozwala艂y na modyfikacj臋 kodu i architektury systemowej. Przedsi臋wzi臋cie to powinno zmniejszy膰, przynajmniej na jaki艣 czas, liczb臋 nowych rootkit贸w dla nowych wersji system贸w Windows.
Obecnie z艂o艣liwe programy dla systemu Windows s膮 bardziej rozpowszechnione ni偶 dla systemu UNIX, poniewa偶 Windows jest najpopularniejszym systemem operacyjnym. Sytuacja zmieni si臋 jednak wraz ze wzrostem popularno艣ci Uniksa; tworzone b臋d膮 nowe rootkity dla Uniksa oraz nowe metody ich zwalczania.
Nale偶y pami臋ta膰, 偶e najlepsz膮 ochron膮 przed rootkitami jest podj臋cie dzia艂a艅 zapobiegawczych poprzez zapewnienie systemom w艂a艣ciwej ochrony.
Bibliografia
- [Encyklopedia Wirus贸w] Kaspersky Lab, Viruslist.pl, 2005
- [iDEF2003] Anton Chuvakin, An Overview of Unix Rootkits, 2003
- Linux Kernel Rootkit. Rainer Wichmann
- Rootkit: Attacker undecover tools. Saliman Manap
- www.phrack.org
- www.securityfocus.org