Obliczenia pasożytnicze

 Niezawodne przesyłanie danych w Internecie gwarantowane jest przez zestaw protokołów sieciowych implementowanych w systemach komputerowych. Artykuł ten pokaże, w jaki sposób protokoły te mogą zostać wykorzystane w celu zmuszenia zdalnych systemów do nieświadomego wykonania użytecznych z punktu widzenia napastnika obliczeń.

Author: Michał Styś

Source:Hakin9 01/2008

Przesyłanie informacji za pośrednictwem Internetu jest złożonym procesem regulowanym przez zestaw protokołów. Protokoły te implementowane są obecnie zgodnie z globalnym standardem – określającym warstwy funkcjonalne wymagane do obsługi połączeń – o nazwie OSI (Open System Interconnection). Kiedy użytkownik wpisuje do swojej przeglądarki internetowej adres URL w celu obejrzenia strony WWW, przeglądarka nawiązuje połączenie przy wykorzystaniu protokołu TCP (Transmission Control Protocol). W następnej kolejności, przy wykorzystaniu istniejącego połączenia TCP, wysyłane jest żądanie za pośrednictwem protokołu HTTP (Hyper Text Transfer Protocol). Pakiet TCP jest przesyłany przez sieć za pośrednictwem protokołu IP (Internet Protocol). Przesyłany komunikat może zostać podzielony na mniejsze pakiety, które przesłane zostaną niezależnie przez szereg routerów znajdujących się między źródłem a miejscem docelowym. Kiedy żądanie HTTP dotrze do miejsca przeznaczenia, odpowiedź odsyłana jest tym samym połączeniem TCP, jakie zostało nawiązane przez przeglądarkę użytkownika. Mechanizmy zaimplementowane w protokołach TCP/IP rekonstruują oryginalny komunikat ze zbioru pakietów, jakie zostały przesłane przez sieć. Komunikat ten jest ostatecznie przetwarzany w warstwie aplikacji przez protokół HTTP. Po zinterpretowaniu żądania przez serwer WWW zostaje wygenerowana odpowiedź (może to być właściwa strona, komunikat o błędzie itd.). Jak widać, prosty z pozoru proces wymaga dosyć znacznej liczby obliczeń – zarówno po stronie wysyłającej, jak i odbierającej żądanie. Niezawodność komunikacji, jaką zapewnia do datkowo protokół TCP, wprowadza takie elementy jak trójfazowe uzgadnianie połączenia, potwierdzanie otrzymania pakietu, sumy kontrolne oraz numery sekwencyjne. Elementy zapewniające niezawodność komunikacji można jednak wykorzystać w zupełnie innym celu niż ten, do którego zostały zaprojektowane.

Pasożytniczy komputer

Termin pasożytniczy komputer odnosi się do realizacji abstrakcyjnej maszyny składającej się z rozproszonych w sieci komputerów. Podobnie jak w przypadku standardowych projektów realizujących obliczenia rozproszone, maszyna ta zbudowana jest w oparciu o protokoły sieciowe. W odróżnieniu jednak od nich, układ pasożytniczy wykonuje obliczenia bez wiedzy i pozwolenia właściciela komputera ofiary, wykorzystywanego jako węzeł obliczeniowy. Informatyka pasożytnicza nie musi zakładać również konieczności ingerencji w oprogramowanie działające na komputerze ofiary. Nie dochodzi tutaj do włamania do zdalnego systemu ani też instalowania na nim jakiegokolwiek złośliwego oprogramowania.

Realizacja pasożytniczego komputera

Protokół TCP dobrze nadaje się do zrealizowania idei pasożytniczego komputera w praktyce. Do tego celu posłużyć może mechanizm sumy kontrolnej. Pakiet przesyłany przez Internet może w którymś momencie ulec uszkodzeniu. Przykładowo, seria sygnałów elektrycznych reprezentujących bity może zostać zmieniona w czasie przepływu przez kabel koncentryczny wskutek tłumienia lub interferencji wywołanych przez źródła pól elektromagnetycznych znajdujących się w pobliżu medium transmisyjnego. Aby zapewnić niezawodność w tego typu sytuacjach, protokół TCP wprowadza mechanizm sumy kontrolnej. Komputer wysyłający pakiet oblicza jego sumę kontrolną i dołącza ją do pakietu. Następnie operację obliczenia sumy kontrolnej odbiorca wykonuje na otrzymanym pakiecie. Jeśli suma kontrolna zapisana w pakiecie zgadza się z sumą obliczoną dla tego pakietu, oznacza to, że dane są poprawne i mogą być przekazane do wyższych warstw protokołów modelu OSI. Jeśli wystąpiła niezgodność, pakiet uznawany jest za uszkodzony, a warstwa TCP usuwa go i nie wysyła do odbiorcy potwierdzenia otrzymania danych. Interesującą nas właściwością tego mechanizmu jest fakt, że suma kontrolna TCP wyliczana jest przy wykorzystaniu operacji wystarczających do wykonania każdej operacji mieszczącej się w zakresie algebry Boole’a. Istnieje zatem możliwość wykorzystania go jako bramki logicznej. To z kolei otwiera drzwi do wykonywania operacji arytmetycznych. Implementacja układu obliczeń pasożytniczych wykorzystujących protokół TCP polega na zbudowaniu pakietu ze specjalnie spreparowaną sumą kontrolną. Komputer ofiary w procesie przetwarzania żądania i generowania odpowiedzi automatycznie wykona zlecone obliczenie – podczas wykonywania algorytmu sprawdzania sumy kontrolnej. Zakres działania omawianych mechanizmów wystarcza do zbudowania pasożytniczego układu obliczeniowego.

Informatyka pasożytnicza

W obliczu omówionego potencjału związanego z możliwością korzystania z zasobów obliczeniowych komputerów w Internecie pojawia się pytanie: do czego można taki mechanizm zastosować? W roku 2001 czterech naukowców – Albert Laszlo Barabasi, Vincent W. Freeh, Hawoong Jeong oraz Jay B. Brockman – zaproponowało mechanizm rozwiązywania problemu klasy NP (non-polynomial) przy wykorzystaniu obliczeń pasożytniczych. Ich publikacja wzbudziła spore zainteresowanie, jako że na trudności rozwiązywania problemów tej klasy opiera się całe bezpieczeństwo współczesnych mechanizmów kryptograficznych. Gdyby znaleziony został sposób na rozwiązywanie problemów NP w rozsądnym czasie, większość znanych technik kryptograficznych stałaby się bezużyteczna. Aby rozwiązywać problemy matematyczne przy wykorzystaniu sumy kontrolnej TCP, konieczna jestodpowiednia reprezentacja problemu. Dla problemów NP stosowna w tym przypadku jest reprezentacja problemu jako Boole’owskie równanie spełnialności. Równania takie określa się jako SAT. Równania spełnialności SAT pozwalają na zapis problemu przy wykorzystaniu operatorów logiki Boole’a. Jako przykład równania SAT może posłużyć następująca konstrukcja:

P=(x1 XOR x2) AND (~x2 AND x3)

P oznacza tu problem, natomiast x1, x2 oraz x3 są parametrami. W prezentowanym przykładzie istnieje 23 potencjalnych rozwiązań, ale równanie będzie spełnione tylko dla jednego z nich – w tym przypadku x1=1, x2=0, x3=1. Rozwiązywanie problemów SAT polega na odnalezieniu takiej wartości wszystkich parametrów, aby całe równanie mogło być spełnione. Zaprezentowany przykład równania SAT jest trywialny i może być rozwiązany bardzo łatwo. W przypadku bardziej złożonych równań zawierających więcej parametrów problem staje się NP-zupełny. Z uwagi na swoją specyfikę, równanie SAT może zostać zapisane jako sekwencja bitów, która zostaje następnie uformowana w pakiet TCP i wysłana do ofiary jako element problemu do policzenia. Scenariusz pasożytniczego komputera zilustrowany został na Rysunkach 1 oraz 2. W pierwszym kroku komputer-pasożyt, nadzorujący proces wykonywania obliczeń, przygotowuje 2n specjalnie skonstruowanych pakietów zawierających wszystkie możliwe kombinacje parametrów równania SAT. Następnie wysyła spreparowane pakiety TCP do pewnej liczby maszyn- ofiar. Maszyny te wyposażone są w jednostki arytmetycznologiczne, umożliwiające wykonywanie obliczeń oraz w interfejsy sieciowe umożliwiające zdalne połączenia (warunki te spełnia każdy komputer podłączony do Internetu). Pakiety zawierające błędne rozwiązania nie posiadają prawidłowej sumy kontrolnej i zostają odrzucone (ilustruje to strzałka z opisująca błędne rozwiązanie). W przypadku, gdy rozwiązanie problemu jest poprawne, obliczenie sumy kontrolnej zakończy się sukcesem, a pakiet trafi w górę stosu protokołów. Ponieważ protokół HTTP zakłada generowanie odpowiedzi na wszystkie, nawet niepoprawne, żądania, zostanie ona wysłana, gdy tylko pakiet dotrze do warstwy aplikacji. Dzięki temu można rozpoznać, który zestaw parametrów jest poprawnym rozwiązaniem problemu SAT. Po wysłaniu wszystkich pakietów do milionów komputerów w Internecie odpowiedziałyby tylko te, które otrzymały pakiety zawierające parametry równania SAT będące prawidłowym rozwiązaniem. Reszta pakietów zostałaby po prostu odrzucona. Możliwe jest zatem odnalezienie rozwiązania bez wykonywania obliczeń na lokalnym komputerze. Barabasi, Freeh, Jeong oraz Brockman przeprowadzili udaną próbę rozwiązania równania SAT przy wykorzystaniu omawianej techniki. Udowodnili tym samym tezę, że możliwe jest zmuszanie komputerów w Internecie do wykonywania konkretnych obliczeń bez konieczności naruszania ich infrastruktury i instalowania na nich dodatkowego oprogramowania. Dodatkowo spore problemy stwarza zabezpieczenie się przed tego typu technikami. Ponieważ wykorzystywane są standardowe mechanizmy zapewniające funkcjonowanie komputera w sieci, uniemożliwienie takich obliczeń jest praktycznie nierealne.

Obliczenia pasożytnicze w praktyce

Czy opisane techniki wystarczają do praktycznego zastosowania obliczeń pasożytniczych w postaci skonstruowania gigantycznego superkomputera i zagrożenia technikom kryptograficznym? Okazuje się, że nie do końca. Omawiane podejście prezentuje jak najbardziej godny uwagi, wręcz rewolucyjny sposób spojrzenia na możliwości prowadzenia obliczeń rozproszonych, ale sprawa komplikuje się po rozważeniu kilku dodatkowych czynników.
Pierwszy problem rodzi mechanizm identyfikowania prawidłowych rozwiązań. W przypadku niepoprawnego obliczenia sumy kontrolnej pakietu przez komputer-ofiarę, TCP usuwa pakiet i nie generuje żadnej odpowiedzi. W efekcie trudne jest ustalenie, czy nie otrzymaliśmy odpowiedzi wskutek faktycznie niepoprawnej sumy kontrolnej, czy też na przykład w wyniku zmiany polityki firewalla lub po prostu odłączenia komputera-ofiary od sieci. Drugim aspektem trudności wykorzystania informatyki pasożytniczej w obecnej postaci jest fakt dużego zapotrzebowania na pasmo potrzebne do rozesłania wielkiej ilości pakietów SAT. Samo przygotowanie takich pakietów również wymaga sporej mocy obliczeniowej. Czynniki te powodują, że na dzień dzisiejszy opisywane podejście nie jest wystarczająco wydajne, aby mogło służyć budowie i praktycznemu wykorzystaniu gigantycznego klastra zbudowanego z milionów komputerów znajdujących się w Internecie.

Przykładowa aplikacja pasożytnicza

Rysunek 1. Prototyp pasożytniczego komputera

Rysunek 1. Prototyp pasożytniczego komputera

Dobrym przykładem aplikacji realizującej obliczenia pasożytnicze przy wykorzystaniu omawianej metodologii jest stworzona przez Jürga Reussera oraz Luziana Scherrera maszyna wirtualna. Oprogramowanie to jest publicznie dostępne pod adresem http://szene.ch/parasit/. Omawiana maszyna jest w pełni programowalna i zdolna rozwiązać dowolny znany problem matematyczny. W celu zainstalowania oprogramowania pasożytniczej maszyny wirtualnej, należy pobrać kod źródłowy. Dostępny jest on pod adresem http:// szene.ch/parasit/code/parasitic_ computing.tar.gz Niniejszy artykuł zawiera opis wykorzystania omawianej aplikacji w systemie Linux. Po pobraniu archiwum należy je rozpakować. Można to zrobić poleceniem:

tar -zxf parasitic_computing.tar.gz

Następnie przechodzimy do instalacji:

make

make install

Aplikacja instaluje się domyślnie w katalogu /usr/local, a więc wariant ten wymaga uprawnień do zapisuw tym katalogu. Aby zmienić docelowy katalog, należy zmienić wartość zmiennej PREFIX w pliku Makefile. Do korzystania z programu konieczne jest zrozumienie podstaw jego działania. Maszyna wirtualna wyposażona została w zestaw rejestrów, które wykorzystywane są do wykonywania zadań. Rejestry posiadają oznaczenia rn gdzie n określa numer rejestru. Wyróżnić można tu trzy typy rejestrów:

• r0 – rejestr instrukcji. Przeznaczony do przechowywania numeru aktualnie wykonywanej instrukcji. Manipulacja jego zawartością pozwala na sterowanie przebiegiem zadania,

• r1 – rejestr flagi. Pozwala na wykrywanie warunku zakończenia działania pętli. Przyjmuje wartość 1, gdy w którymś z rejestrów ogólnego przeznaczenia dojdzie do przepełnienia wywołanego działaniem instrukcji ADD (instrukcje omówione zostały poniżej),

• r2…rn – rejestry ogólnego przeznaczenia. Można przechowywać w nich wartości oraz wykonywać operacje arytmetyczne. Autorzy aplikacji stworzyli zestaw instrukcji pozwalający na definiowanie zadań obliczeniowych realizowanych na zdalnych maszynach. Język ten bazuje na klasycznym assemblerze. Określony został jako 4IA, co oznacza czteroinstrukcyjny assembler (4 Instruktionen Assembler). Zgodnie z nazwą, posiada on cztery podstawowe instrukcje:

• HLT – instrukcja przerywa wykonanie zadania obliczeniowego,

• SET dst, const – instrukcja umieszcza wartość const w rejestrze określonym na pozycji dst, • MOV dst, src – instrukcja ta kopiuje wartość rejestru src do rejestru określonego jako dst,

• ADD dst, src – instrukcja ADD pozwala na dodanie wartości przechowywanej w rejestrze src do wartości rejestru dst. Wynik zapisany zostaje w rejestrze dst. Jeśli dojdzie do przepełnienia zakresu rejestru, ustawiona zostaje flaga r1.
Zestaw powyższych instrukcji wystarcza do realizacji każdej operacji arytmetycznej. Jako przykład zrealizowana zostanie prosta operacja odejmowania. Trywialny problem 100 – 5 zdefiniować można w następujący sposób: Tak przygotowany program gotowy jest do uruchomienia na pasożytniczej maszynie. Sama maszyna uruchamiana jest przy wykorzystaniu polecenia:

/usr/local/bin/pshell

Najpierw należy przygotować plik z adresami IP komputerów, które wykorzystane zostaną jako ofiary. Adresy rozdzielane są znakami nowej linii. Po przygotowaniu pliku i uruchomieniu pshell, należy go załadować:

lh /sciezka/do/pliku/adresow_IP

Przykład:

lh /home/parasite/hosts

Hostlist loaded

Hosty wylistować można przy wykorzystaniu polecenia sh: W celu wykonania napisanego zadania posłużyć należy się następującym poleceniem:

xp /home/parasite/sub.4ia

Jeśli wszystko zakończy się powodzeniem (hosty – ofiary powinny być włączone), otrzymamy komunikat:

Execution successfully terminated.

Wyniki (stan rejestrów) obejrzeć można przy wykorzystaniu polecenia sr. Rejestr r9 przechowuje zgodną z oczekiwaniami wartość 100 – 5 = 95. Obliczenia powiodły się. Teraz zobaczyć można także, ile pasożytniczych pakietów wysłanych zostało do poszczególnych komputerów. Szczegółowe statystyki obejrzeć można po wydaniu polecenia ss. Przykłady bardziej skomplikowanych zadań dostarczone są wraz z maszyną wirtualną i po instalacji znaleźć je można w katalogu /usr/ local/share/parasit/4ia/. Strukturę wysyłanych pakietów można obejrzeć na maszynachofiarach przy wykorzystaniu dowolnego sniffera sieciowego (najlepiej Wireshark). Obserwować należy pakiety ICMP przesyłane między ofiarą i pasożytem, ponieważ pasożytniczy mechanizm obliczeń został zaimplementowany przy wykorzystaniu właśnie tego protokołu.

Aspekty legalności

Rysunek 2. Działania mechanizmu obliczeń pasożytniczych

Rysunek 2. Działania mechanizmu obliczeń pasożytniczych

Mimo, że informatyka pasożytnicza nie narusza integralności systemów wykonujących zlecone obliczenia, może powodować opóźnienia ich działania. Duże ilości pakietów przesyłane do interfejsów sieciowych powodują efekty podobne do ataku typu Denial of Service. Z tego powodu powstaje szereg pytań natury etyczno-prawnej dotyczących wykorzystywania mocy obliczeniowej maszyn znajdujących się w Internecie bez pozwolenia ich właścicieli. Wszystko to skłania do refleksji na temat określenia granic własności zasobów Internetu.

Podsumowanie

Podsumowując, da się zauważyć, że informatyka pasożytnicza zaciera granice pomiędzy komunikacją a obliczeniami w sieci. Udowodniono, że możliwe jest wymuszenie użytecznych obliczeń na zdalnych komputerach przy wykorzystaniu samej infrastruktury obecnego Internetu. Mimo, iż w praktyce zastosowanie obliczeń pasożytniczych w ich obecnej formie jest mocno ograniczone, otwiera drogę do kolejnych eksperymentów i znacząco wpływa na aspekty spojrzenia na Internet.

_______________
Michał Styś
Aktualnie jest studentem drugiego roku SUM Informatyki na Akademii Górniczo-Hutniczej w Krakowie. Do jego głównych zainteresowań należy programowanie, administracja systemów komputerowych oraz aspekty bezpieczeństwa informatycznego. Kontakt z autorem: michal.stys@gmail.com

Listing 1. Program dla pasożytniczej maszyny wirtualnej napisany w mikroassemblerze 4IA (plik sub.4ia)
ARCH 8 10 ; Definicja architektury. Rejestry o długości 8 bitów, liczba rejestrów – 10
00: SET r3, 0xFF ; Do rejestru r3 ładujemy wartość -1
01: SET r2, 5 ; Do rejestru r2 ładujemy 5. Będzie to ilość iteracji w pętli
02: SET r9, 100 ; Rejestr r9 przechowa wartość, od której będziemy odejmować
03: SET r0, 4 ; Do rejestru instrukcji ładujemy numer, od którego zacznie się pętla
04: ADD r9, r3 ; Wykonujemy operację odejmowania na rejestrze r9 (100+(-1))
05: SET r1, 0 ; Reset flagi przepełnienia
06: ADD r2, r3 ; Zmniejszamy licznik pętli o 1
07: ADD r0, r1 ; Jeśli flaga przepełnienia==1, skaczemy do instrukcji 09
08: SET r0, 9 ; Koniec pętli, skok do linii 10
09: SET r0, 3 ; Pętla trwa, skok do linii 04
10: HLT ; Koniec działania programu

Listing 2. Stan rejestrów pasożytniczej maszyny wirtualnej po
zakończeniu wykonywania zadania obliczeniowego
Register Decimal Hex Comment
-------- ------- ------- ---------------------------
r0000000 10 0x000a Instruction pointer (ip)
r0000001 0 0x0000 Flag register (fl)
r0000002 255 0x00ff XIA error register
r0000003 255 0x00ff XIA carry register
r0000004 0 0x0000
r0000005 0 0x0000
r0000006 0 0x0000
r0000007 0 0x0000
r0000008 0 0x0000
r0000009 95 0x005f
r0000010 0 0x0000

Listing 3. Polecenie sh do wylistowania hosta
sh
Hostname Address Packets Timeouts Enabled Falsepos.
-------------------- --------------- ------- -------- ------- -----------
192.168.0.2 192.168.0.2 0 0 yes untested
192.168.0.3 192.168.0.3 0 0 yes untested

Listing 4. Ilość pakietów pasożytniczych
sh
Hostname Address Packets Timeouts Enabled Falsepos.
-------------------- --------------- ------- -------- ------- -----------
192.168.0.2 192.168.0.2 817 0 yes untested
192.168.0.3 192.168.0.3 809 0 yes untested

Komentarze

Popularne posty z tego bloga

Bezpieczeństwo teleinformatyczne danych osobowych

Co zrobić po wycieku danych, hasła w Internecie?

Niebezpieczne nazwy plików