Poprzednie przykładowe narzędzie wymaga tylko jednego koloru skażenia, ponieważ bajty są albo kontrolowane przez atakującego, albo nie. Teraz zbudujmy narzędzie, które używa wielu kolorów skażenia do wykrywania wycieków informacji w plikach, tak aby po odebraniu pliku można było określić, który plik został znaleziony. Idea tego narzędzia jest podobna do obrony opartej na int o nazwie ta przed błędem Heartbleed, który omówiliśmy w rozdziale 10, z tą różnicą, że tutaj narzędzie wykorzystuje odczyty z plików zamiast buforów pamięci jako źródło skażenia. Listing przedstawia pierwszą część tego nowego narzędzia, które nazwę dta -dataleak. Ponownie, dla zwięzłości pomijam pliki nagłówkowe standardowego języka C.
Listing : dta-dataleak.cpp


Podobnie jak w poprzednim narzędziu DTA, dta-dataleak zawiera plik pin.H i wszystkie odpowiednie pliki nagłówkowe libdft (1). Zawiera również znaną deklarację extern tablicy syscall_desc (2), która przechwytuje wywołania systemowe dla źródeł i odbiorników skażeń. Ponadto dta-dataleak definiuje pewne struktury danych, których nie było w dta-execve. Pierwsza z nich, fd2color, to mapa C++, która odwzorowuje deskryptory plików na kolory skażeń (3). Druga, również w C++, o nazwie color2fname, odwzorowuje kolory skażeń na nazwy plików (4). W kolejnych listingach zobaczysz, dlaczego te struktury danych są potrzebne. Istnieje również #define stałej o nazwie MAX_COLOR (5), która jest maksymalną możliwą wartością koloru skażenia, 0x80. Główna funkcja dta-dataleak jest niemal identyczna z funkcją dta-execve, ponieważ inicjuje Pin i libdft, a następnie uruchamia aplikację. Jedyną różnicą jest to, które źródła i odbiorniki taintów definiuje dta-dataleak. Instaluje on dwa programy obsługi post-handlerów, zwane post_open_hook (6) i post_read_hook (7), które są uruchamiane tuż po wywołaniach systemowych open i read. Hak open śledzi, które deskryptory plików są otwarte, podczas gdy hak read jest faktycznym źródłem taintów, który taintuje bajty odczytane z otwartych plików, co wyjaśnię za chwilę. Ponadto dta-dataleak instaluje program obsługi wstępnej dla wywołania systemowego socketcall o nazwie pre_socketcall_hook (8). Pre_socketcall_hook to odbiornik taintów, który przechwytuje wszelkie dane, które mają zostać wysłane przez sieć, aby upewnić się, że dane nie są skażone przed zezwoleniem na wysłanie. Jeśli istnieje ryzyko wycieku jakichkolwiek zanieczyszczonych danych, funkcja pre_socketcall_hook generuje alert za pomocą funkcji o nazwie alert, którą wyjaśnię poniżej. Należy pamiętać, że to przykładowe narzędzie jest uproszczone. W prawdziwym narzędziu należy podłączyć dodatkowe źródła skażenia (takie jak wywołanie systemowe readv) i odbiorniki (takie jak wywołania systemowe write na gnieździe), aby zapewnić kompletność. Należy również zaimplementować reguły określające, które pliki mogą wyciekać przez sieć, a które nie, zamiast zakładać, że wszystkie wycieki plików są złośliwe. Przyjrzyjmy się teraz funkcji alert, pokazanej na listingu, która jest wywoływana, gdy jakiekolwiek zanieczyszczone dane mają wyciekać przez sieć. Ponieważ jest ona podobna do funkcji alert programu dta-execve, opiszę ją tutaj tylko pokrótce.
Listing : dta-dataleak.cpp (ciąg dalszy)

Funkcja alertu rozpoczyna się od wyświetlenia komunikatu ostrzegawczego, szczegółowo określającego, który adres jest skażony i jakimi kolorami (1). Możliwe, że dane wyciekające przez sieć są zanieczyszczone wieloma plikami i dlatego są skażone wieloma kolorami. Dlatego alert przechodzi przez wszystkie możliwe kolory skażenia (2) i sprawdza, które z nich znajdują się w znaczniku skażonego bajtu, który spowodował alert (3). Dla każdego koloru włączonego w znaczniku alert wyświetla kolor i odpowiadającą mu nazwę pliku (4), którą odczytuje ze struktury danych color2fname. Na koniec alert wywołuje exit, aby zatrzymać aplikację i zapobiec wyciekowi danych (5). Następnie przeanalizujmy źródła skażenia dla narzędzia dta-dataleak.












