Stan zagrożeń w internecie znajduje się obecnie na poziomie standardowym. Nie występują duże epidemie a eksperci z Kaspersky Lab nie zanotowali żadnych poważnych incydentów związanych z bezpieczeństwem. Poziom zagrożenia: 1

Mac OS X

Tagi:

Konstantin Sapronov

Rok temu użytkownikami komputerów firmy Apple byli głównie projektanci i specjaliści DTP, fotografowie oraz muzycy. Poprzedni rok okazał się jednak pod wieloma względami przełomowy dla komputerów Mac. Po tym, jak firma Apple ogłosiła, że zamierza wytwarzać komputery z procesorami Intel, wiele osób zaczęło rozważać wykorzystywanie takich komputerów w domu. Również programiści dostrzegli wzrost popularności systemu Mac OS X i zaczęli sprzedawać własne produkty dla tej platformy.

Mimo to Mac OS X nadal stanowi zagadkę zarówno dla wielu użytkowników, jak i specjalistów od bezpieczeństwa IT. Artykuł ten ma pomóc czytelnikom lepiej zrozumieć funkcje systemu Mac OS X, które są krytyczne podczas badania szkodliwych programów przeznaczonych dla tego systemu operacyjnego.

Należy zauważyć, że Mac OS X jest uniksowym systemem operacyjnym i posiada wiele funkcji z innych systemów uniksowych. Z tego powodu artykuł ten będzie bardziej przystępny dla użytkowników posiadających doświadczenie z systemami takimi jak Linux czy FreeBSD. Pewne doświadczenie w badaniu programów dla dowolnego typu systemu operacyjnego również ułatwi zrozumienie tego artykułu.

Kluczowe funkcje systemu Mac OS X

Podczas analizy programów, w tym także tych szkodliwych, zawsze przydatna jest znajomość kluczowych funkcji systemu operacyjnego. Mac OS X opiera się na Uniksie, co jest widoczne w designie OS X oraz ogólnych zasadach działania systemu. System ten przejął interakcję międzyprocesorową od Macha oraz stos sieciowy od BSD.

Odwołania systemowe z systemów Mach oraz BSD

Xnu - jądro Mac OS X - opiera się na jądrach systemu Mach oraz FreeBSD, zawiera jednak również funkcje z MkLinux, NetBSD, OpenBSD i kilku projektów rozwojowych Macha. Mac OS X obsługuje odwołania systemowe zarówno z systemu Mach, jak i BSD. Ponieważ jądro systemu OS X opiera się w równym stopniu na systemie operacyjnym Mach, jak i FreeBSD, jądro systemu Mac OS X - xnu - zawiera dwie tabele odwołań systemowych (Mach i BSD) i obsługuje API dla systemów BSD i Mach.

Środowisko Runtime

W celu zapewnienia obsługi poprzednich systemów operacyjnych Mac OS X posiada środowisko runtime z trzema komponentami:

  1. Dyld Runtime Environment, oparty na dynamicznym programie ładującym (dyld dynamic loader).
  2. CFM Runtime Environment. Ta spuścizna po OS 9 zapewnia obsługę aplikacji, które nie mogą zostać uruchomione poprzez dyld, ale wykorzystują możliwości Mac OS X. Zostało to zaimplementowane w bibliotece Carbon.
  3. Classic Runtime Environment - środowisko wykorzystywane do uruchamiania starszych aplikacji dla OS 9 w OS X.

Dzięki powyższym funkcjom w systemie Mac OS X można uruchomić szereg aplikacji, łącznie ze starszymi wersjami systemu operacyjnego Mac.

Format pliku wykonywalnego Mach-O

W systemie Mac OS X prawie wszystkie pliki, które zawierają kod wykonywalny, łącznie z aplikacjami, bibliotekami i modułami jądra, posiadają format Mach-O.

Format Mach-O nie został pierwotnie stworzony przez firmę Apple; został zaprojektowany przez Open Source Foundation dla systemu operacyjnego OSF/1 (który jest oparty na systemie Mach) i zaadaptowany przez firmę Apple dla architektury x86 w ramach projektu OpenStep.

Format pliku Mach-O oraz specyfikacje Application Binary Interface (ABI) przedstawiają, w jaki sposób plik wykonywalny powinien zostać załadowany i uruchomiony przez jądro. Przekazują systemowi operacyjnemu następujące informacje:

  • w jaki sposób działa dynamiczny program ładujący,
  • jak załadować oddzielne biblioteki,
  • jak zorganizować przestrzeń adresową procesu,
  • gdzie znaleźć punkt wejścia,
  • itp.

Ponieważ Mach-O jest głównym formatem plików wykonywalnych w systemie Mac OS X, przyjrzyjmy się dokładniej jego strukturze.

Struktura Mach-O

Pliki Mach-O można w przybliżeniu podzielić na trzy części: nagłówek, polecenia ładowania oraz segmenty, które mogą składać się z kilku sekcji. Nagłówek i polecenia ładowania określają główne cechy pliku, a segment danych zawiera zestaw bajtów, które łączą się z poleceniami ładowania.

Nagłówek. Pierwsze cztery bajty w nagłówku określają tak zwany magiczny numer, który identyfikuje plik jako 32- lub 64-bitowy. Pomaga on również określić porządek bajtów dla procesora. Nagłówek określa architekturę, dla której plik został skompilowany. Dzięki temu jądro może zagwarantować, że pliki zostaną uruchomione tylko na platformie, dla której plik został skompilowany. Czasami pliki binarne mogą zawierać kod dla więcej niż jednej architektury. Format ten znany jest jako Universal Binaries. W tym przypadku plik rozpocznie się od rozszerzonego nagłówka (fat header).

Polecenia ładowania. Obszar poleceń ładowania zawiera listę poleceń, które informują jądro, w jaki sposób ładować różne segmenty pliku. Polecenia te opisują, w jaki sposób każdy segment jest zbalansowany w pamięci, jakie prawa dostępu posiada i gdzie jest zlokalizowany w pamięci.

Segmenty i sekcje. Pliki wykonywalne w formacie Mach-O posiadają zazwyczaj 5 segmentów:

  • __PAGEZERO jest zlokalizowany pod zerowym adresem wirtualnym i nie posiada żadnego rodzaju ochrony. Segment ten nie posiada obszaru w pliku ani na dysku.
  • __TEXT zawiera dane, do których można uzyskać dostęp jedynie w celu odczytu lub wykonania.
  • __DATA zawiera dane, do których można coś dopisać. Sekcja ta jest oznaczona jako copy-on-write.
  • __OBJC zawiera dane wykorzystywane dla środowisk uruchomieniowych Objective-C.
  • __LINKEDIT zawiera dane wykorzystywane do ustanowienia dynamicznych połączeń.

Segmenty __TEXT oraz __DATA zawierają zero lub więcej sekcji. Każda sekcja zawiera pewien rodzaj danych, np. kod wykonywalny, stałe, ciągi itd. W ten sposób kod wykonywalny i niewykonywalny jest przechowywany w tym samym segmencie, ale oddzielnie.

Narzędzia analizy programów

Wyróżnia się dwa główne podejścia do analizy programów: dynamiczne i statyczne. Analiza dynamiczna polega na uruchomieniu kodu programu w obrębie debuggera lub środowiska wirtualnego oraz analizowania jego zachowania. Statyczna analiza programu wykorzystuje dezasembler bez uruchamiania kodu.

To, które podejście jest najlepsze, zależy od indywidualnej sytuacji. Metody te nie wykluczają się wzajemnie i często jedna stosowana jest jako dopełnienie drugiej.

Narzędzia analizy dynamicznej

Podobnie jak w przypadku większości systemów uniksowych, Mac OS X oferuje wiele narzędzi, które mogą być przydatne w dynamicznej analizie aplikacji oraz diagnostyce systemu. Wiele z nich przeszło do systemu Mac z Uniksa, jednak są również programy, które zostały zaprojektowane wyłącznie dla Mac OS X. Poniżej przedstawiamy krótkie opisy kilku narzędzi, które mogą zostać zainstalowane z pakietu dystrybucyjnego Mac OS X.

Narzędzia te można podzielić na dwie kategorie:

  1. Narzędzia wykorzystywane do badania procesów:
    • fs_usage — dostarcza informacje o odwołaniach systemowych odnoszących się do aktywności systemu plików;
    • heap — wyszczególnia wszystkie bloki pamięci przydzielone do pamięci dynamicznej przez oddzielny proces;

    • lsof — wyświetla pliki otwierane przez różne procesy;

    • top — wyświetla statystyki wykorzystania dla różnych zasobów systemowych;
    • vm_stat — wyświetla statystyki wykorzystania pamięci wirtualnej;
    • gdb — debugger umożliwiający zdalne usuwanie błędów z programów;
    • ddb — debugger jądra wymagający połączenia poprzez port szeregowy;
    • ktrace — śledzi informacje o zdarzeniach systemowych na poziomie jądra dla określonych procesów;
    • kdump — wyświetla informacje generowane przez program ktrace;
    • sc_usage — wyświetla statystyki dla określonego procesu, takie jak wykorzystanie czasu procesora, wykorzystanie odwołań systemowych itd.

  2. Narzędzia sieciowe.

    Wymienione poniżej narzędzia systemowe są dobrze znane w świecie Uniksa.

    • netstat — dostarcza różne dane dotyczące podsystemu sieci;

    • tcpdump — wyświetla ruch sieciowy.

Wiele innych narzędzi sieciowych, dobrze znanych użytkownikom Uniksa, może być również wykorzystanych przez system Mac OS X, np. nmap oraz WireShark.

Należy zauważyć, że większość programów opartych na Uniksie z otwartym dostępem do kodu źródłowego można łatwo przystosować do działania w systemie Mac OS X. Doświadczony użytkownik Uniksa będzie w stanie stworzyć środowisko pracy, które jest niemal identyczne jak znane środowisko uniksowe.

Narzędzia analizy statycznej

Stosunkowo często nie ma możliwości uruchomienia analizowanego programu. Czasami, ze względów bezpieczeństwa, lepiej jest nie uruchamiać programu.

Ponieważ formatem plików wykonywalnych w systemie Mac OS X jest Mach-O, podczas analizy statycznej w tym systemie operacyjnym należy uwzględnić kilka rzeczy.

Podstawowym narzędziem do analizy plików Mach-O jest program otool, który może być wykorzystany w celu uzyskania informacji o nagłówku pliku, poleceniach ładowania oraz punkcie wejścia. Można go nawet użyć do deasemblacji zawartości sekcji zawierających kod wykonywalny.

  • file - określa typ plików;

  • otool - wykorzystywany do analizowania plików Mach-O;

  • xxd - umożliwia przekładanie plików binarnych na format szesnastkowy i odwrotnie;
  • IDAPro - dezasembler.

Wraz z rosnącą popularnością systemu Mac OS X działającego z procesorem Intel wielu producentów oprogramowania opublikowało wersje swoich aplikacji dla tej platformy. Na liście systemów operacyjnych obsługiwanych przez nową wersję systemu Mac OS X, 5.1, znajduje się IDAPro.

Znacznie ułatwi to życie użytkowników migrujących z systemu Windows. Niekiedy wykorzystywanie IDAPro umożliwia szybsze i łatwiejsze wykonywanie niektórych zadań niż przy użyciu standardowych narzędzi Mac OS X.

Analiza szkodliwego kodu: przykłady

Aby przedstawić kilka przykładów, przeanalizujemy szkodniki IM-Worm.OSX.Leap oraz Virus.OSX.Macarena przy użyciu niektórych z wymienionych wyżej narzędzi. Należy zauważyć, że badane szkodliwe programy są programami typu "proof of concept"; nie posiadają szkodliwej funkcji i nie stanowią poważnego zagrożenia. Ich głównym celem jest pokazanie, że stworzenie takiego programu jest możliwe.

IM-Worm.OSX.Leap

Leap nie potrafi rozprzestrzeniać się za pośrednictwem Internetu - w tym celu wykorzystuje komunikator iChat. W pierwszym etapie Leap rozprzestrzenia się przy użyciu aplikacji iChat jako załącznik do pliku w RapidShare, "udając", że plik zawiera zrzuty ekranu najnowszej wersji systemu Mac OS X, Leopard. Aby maszyna została zainfekowana, odbiorca musi kliknąć odsyłacz, potwierdzić pobranie pliku, rozpakować plik, a następnie otworzyć go. Po tym, jak komputer zostanie zainfekowany, plik wyśle siebie (bez żadnych modyfikacji) do wszystkich z listy kontaktów użytkownika poprzez Bonjour.

Leap rozprzestrzenia się jako plik o nazwie latestpics.tgz. Po rozpakowaniu pliku w Finderze, okaże się, że jest to plik jpeg.

Ponieważ Leap wykorzystuje Spotlight, będzie działał tylko w wersji Tiger (wersja 10.4.x systemu Mac OS X). Do uruchomienia Leap wymaga InputManager, mimo że nie działa w systemach dla x86. Co więcej, plik binarny zawiera kod tylko dla PowerPC. W rezultacie, Leap działa tylko na komputerach z PowerPC.

W celu rozpoczęcia analizy musimy określić rzeczywisty format pliku latestpics. Najpierw uruchamiamy narzędzie file z argumentem latestpics: #file latestpics. Okazuje się, że plik ten jest w rzeczywistości plikiem Mach-O.

Następnie wykorzystujemy otool, aby przejrzeć nagłówek pliku binarnego: #otool -h latestpics.

Potem można zobaczyć punkt wejścia Leapa. Punkt wejścia w pliku w formacie Mach-O można znaleźć przy użyciu #:otool -l latestpics, który wyświetla polecenia ładowania. W tym przypadku interesującym poleceniem jest LC_UNIXTHREAD, które wyświetla początkowy stan głównego wątku procesu. Na PowerPC będziemy chcieli znaleźć zawartość rejestru srr0 - jest to punkt wejścia.

Następnie wykorzystujemy nm - narzędzie znane wszystkim użytkownikom Uniksa - w celu przejrzenia listy wszystkich symboli w pliku binarnym, łącznie z poniższymi funkcjami. Ich nazwy mówią same za siebie i potwierdzają, że jest to potencjalnie szkodliwy plik:

  • _copySelf
  • _infect
  • _infectApps

Teraz możemy przyjrzeć się bliżej kodowi, wykorzystując narzędzie otool -vt, które pozwoli nam przeglądać zawartość sekcji w segmencie __TEXT, gdzie jest zlokalizowany kod wykonywalny pliku latestpics:

Ciągi są wysyłane do funkcji systemowych, są jednak szyfrowane za pomocą funkcji _xor:

Po odszyfrowaniu ciągów otrzymujemy następujący rezultat:

/usr/bin/tar -zxf /tmp/hook -C /tmp
/Library/InputManagers
/bin/rm -rf /Library/InputManagers/apphook
/bin/mv -f /tmp/apphook /Library/InputManagers
~/Library/InputManagers
/bin/rm -rf ~/Library/InputManagers/apphook
/bin/mv -f /tmp/apphook ~/Library/InputManagers
%s/Contents/MacOS/%s /bin/cp '%s' '%s/..namedfork/rsrc'
/bin/cp -f '%s' '%s'
(kMDItemKind == 'Application') (kMDItemLastUsedDate >= $time.this_month)<wbr>  /usr/bin/ditto %s /tmp/latestpics /usr/bin/gzip -f -q /tmp/latestpics

Analiza tych ciągów pokazuje, co właściwie robi IM-Worm.OSX.Leap:

  • Kopiuje się do /tmp jako latestpics;
  • Następnie tworzy plik tgz;
  • Wydobywa Input Manager o nazwie “apphook.bundle” i kopiuje go do /tmp;
  • Jeśli identyfikator ma postać 0, tworzony jest folder /Library/InputManagers/; usuwne są wszystkie istniejące apphooki i nowy apphook zostaje skopiowany z /tmp;
  • Jeśli identyfikator ma postać inną niż 0, tworzony jest ~/Library/InputManagers/;
  • Teraz gdy została uruchomiona nowa aplikacja systemu Mac OS X, nowy apphook zostanie załadowany do przestrzeni adresowej;
  • Wraz z każdym uruchomieniem aplikacji będzie podejmowana próba wysłania latestpics.tgz za pośrednictwem komunikatora iChat.

Virus.OSX.Macarena

Aby rozpocząć analizę, należy zidentyfikować format pliku. Jak wyżej, użyjemy narzędzia file.

Wyniki pokazują, że jest to plik w formacie Mach-O.

Następnie używamy otool w celu obejrzenia nagłówka pliku i określenia punktu wejścia:

Dokładne badanie wskazuje na nietypowy punkt wejścia pod adresem zero. Następnym krokiem powinna być analiza kodu, rozpoczynając od punktu wejścia. Napotykamy jednak mały problem. Nie możemy dezasemblować tej części pliku Mach-O przy użyciu narzędzia otool, ponieważ można je wykorzystać jedynie do analizy kodu w sekcji tekstowej segmentu __TEXT.

W tej sytuacji możemy użyć IDAPro. Najpierw jednak musimy załadować plik do narzędzia IDA jako plik binarny. Następnie plik może zostać zdezasemblowany.

Macarena jest pierwszym wirusem, który infekuje pliki w formacie Mach-O w bieżącym folderze.

Podczas analizy zainfekowanego pliku można zauważyć następujące rzeczy:

Wirus zmienia punkt wejścia na adres zero. Tam właśnie segment __PAGEZERO ładuje się w formacie Mach-O. Jak zauważyliśmy wyżej, podczas analizowania struktury plików Mach-O, __PAGEZERO nie ma żadnego miejsca w pliku na dysku. Dlatego właśnie kod zapisuje się na koniec pliku na dysku. Technika ta może mieć niespodziewany rezultat: aplikacje takie jak gdb, IDA oraz otool nie będą wyświetlać kodu wirusa.

Macarena jest stosunkowo prostym wirusem. Po uruchomieniu infekuje pliki w formacie Mach-O dla architektury x86. Są również nowsze wersje tego wirusa, które infekują także pliki ppc, jednak warianty te bardzo niewiele różnią się od oryginału.

Wirus ten nie posiada innej funkcji szkodliwej.

Wniosek

Mac OS X nadal przyciąga klientów. Chociaż jedynymi szkodliwymi programami dla tego systemu operacyjnego są programy typu "proof of concept", szkodliwi użytkownicy będą coraz bardziej interesowali się platformą Mac OS X, ponieważ liczba jej użytkowników szybko rośnie. To oznacza, że będziemy musieli częściej analizować szkodliwe programy dla systemu Mac OS X.

Na szczęście, Mac OS X posiada wiele narzędzi, które można wykorzystać zarówno do analizy innych programów, jak i ogólnej diagnozy systemu. Co więcej, pojawia się coraz więcej programów od "osób trzecich", które mogą być wykorzystywane zarówno przez specjalistów ds IT, jak i badaczy amatorów.

Źródło:
Kaspersky Lab