ATAK
MICHAA GYNVAEL
COLDWIND
SKAADNIKIEWICZ
Format GIF
okiem hakera
Stopień trudności
Format GIF, oprócz podstawowej funkcjonalności oferowanej
przez wszystkie standardowe formaty graficzne, udostępnia
również kilka rozszerzeń umożliwiających stworzenie animacji czy
też dodanie komentarza do grafiki.
pierwszej części artykułu, Według dokumentacji jeden taki blok może
opublikowanej w Hakin9 5/2008, (ale nie musi) poprzedzać dane obrazu (a
Wopisałem podstawową strukturę pliku konkretniej nagłówek Image Descriptor) lub
graficznego GIF oraz omówiłem kompresję rozszerzenie zwykłego tekstu (ang. Plain Text
LZW. Niniejsza druga część artykułu Extension). Dany blok ma zasięg lokalny, czyli
poświęcona będzie rozszerzeniom formatu wpływa jedynie na następującą po nim klatkę
GIF (takim, jak animacja, komentarze czy animacji.
wreszcie rozszerzenia aplikacji), miejscom, Znaczna część pól w strukturze GCE
w których można ukryć/szukać dodatkowych (patrz Tabela 1) ma stałą, ustaloną z góry,
danych oraz możliwym do popełnienia podczas wartość. Wyjątkami są pola DisposalMethod,
implementacji błędom. UserInputFlag, TransparentColorFlag,
Przed przystąpieniem do lektury warto DelayTime oraz TransparentColorIndex. Pole
przypomnieć sobie ogólną budowę formatu DisposalMethod (metoda usunięcia) określa, w
GIF, podział na części oraz podział danych jaki sposób dana klatka ma zostać skasowana
na fragmenty data Sub-blocks (w tym celu przed narysowaniem następnej. Dostępne są 4
Z ARTYKUAU
można posłużyć się na przykład poprzednią opcje:
DOWIESZ SI
częścią artykułu lub sięgnąć do opisu
jakie rozszerzenia zostały
standardu GIF [1]). " [0] Nieokreślona metoda usunięcia
wprowadzone do formatu GIF w
wersji 89a, (zazwyczaj równoważna z opcją 1),
Animowane GIFy " [1] Nie usuwaj (następna klatka zostanie
na co uważać podczas
implementowania rozszerzeń
Plik GIF nawet bez korzystania z rozszerzeń wyrysowana na obecnej),
formatu GIF,
oferuje możliwość zapisania więcej niż jednej " [2] Wypełnij obraz kolorem tła,
gdzie szukać błędów w
klatki obrazu w takim przypadku wszystkie " [3] Powróć do poprzedniego obrazu.
aplikacjach korzystających z GIF,
klatki są używane do stworzenia jednej wynikowej
gdzie ukryć lub szukać ukrytych
danych w plikach GIF.
grafiki. Standard 89a wprowadził dodatkową Dokumentacja zaleca, aby opcji trzeciej używać
strukturę blok kontroli grafiki (ang. Graphic jedynie w przypadku niewielkich fragmentów
CO POWINIENEŚ
Control Extension, GCE), który zawiera dodatkowe obrazu (z uwagi na subiektywnie wysokie zużycie
WIEDZIEĆ
informacje umożliwiające stworzenie z serii pamięci chociaż dla obecnych komputerów nie
mieć ogólne pojęcie na temat
klatek faktycznej animacji. Blok zawiera między stanowi to problemu), a w razie, gdyby dekoder
plików binarnych,
innymi takie informacje, jak wielkość opóznienia nie potrafił poradzić sobie z przywróceniem
mieć ogólne pojęcie na temat
bitmap,
przed wyświetleniem następnej klatki czy sposób poprzedniego obrazu, dopuszczalne jest
mieć pojęcie o plikach GIF. przejścia do następnej klatki. wypełnienie obrazu kolorem tła.
38 HAKIN9 7-8/2008
FORMAT GIF OKIEM HAKERA
Pozostałe opcje (4-7) są porównania, testowy GIF (50 klatek przycisku myszy lub dowolnego
zarezerwowane do przyszłego użytku 256x256) na Firefoksie renderował klawisza). W przypadku, gdy flaga jest
ale w praktyce różne dekodery się około 5 sekund, natomiast Safari aktywna oraz gdy ustawiony jest czas
(przy testach zostały wykorzystane: FF poświęciło na niego prawie 3 minuty, opóznienia (tj. jest niezerowy), dekoder
Mozilla Firefox 2.0.0.14, O Opera 9.24, dodatkowo każda kolejna klatka powinien zaprezentować kolejną klatkę
S Safari 3.1 (525.13), IE Microsoft renderowała się dłużej od poprzedniej, po odczekaniu wskazanego czasu lub
Internet Explorer 7.0.6000.16643, IV a przeglądarka odpowiadała na po zaistnieniu określonego zdarzenia. W
IrfanView 4.10) już je implementują, i to polecenia użytkownika tylko pomiędzy praktyce wszystkie z testowanych przeze
w odmienny sposób: klatkami. Końcowe klatki renderowały mnie dekoderów ignorowały tę flagę i nie
się około 20 sekund, więc możliwe czekały na interakcję.
" [4] IE, IV i FF traktują jako powrót do jest przeprowadzenie skutecznego Dodatkowe dane mogą zostać
poprzedniego obrazu, O i S jako nie ataku DoS przy pomocy odpowiednio przechowane w polu Reserved, które
usuwaj, spreparowanej strony WWW (test został zazwyczaj nie jest kontrolowane przez
" [5] IE i IV traktują jako powrót do wykonany na komputerze Intel Core 2 dekodery.
poprzedniego obrazu, a FF, O, S jako Quad 2.4GHz z 4GB RAM). Warto zaznaczyć, iż w praktyce
nie usuwaj, Pole TransparentColorFlag możliwe jest wielokrotne umieszczenie
" [6] IE i IV traktują jako powrót do (flaga przezroczystości) oraz struktury GCE przed danymi.
poprzedniego obrazu, FF jako nie TransparentColorIndex (numer Wszystkie testowane dekodery traktują
usuwaj, a O i S jako wypełnij obraz przezroczystego koloru) odpowiedzialne wtedy ostatnią strukturę GCE jako
kolorem tła, są oczywiście za istnienie i wybór koloru, obowiązującą, a resztę ignorują jest to
" [7] IE, IV, S i O traktują jako powrót który będzie uznany za przezroczysty więc całkiem niezłe miejsce na ukrycie
do poprzedniego obrazu, a FF jako nie czyli oznaczał piksele nie narysowane, dodatkowych informacji.
usuwaj. pod którymi prześwitywać będzie Dodatkowo, programista może
poprzednia zawartość bufora. Warto popełnić ewentualny błąd zakładając, iż
Jak widać, nie ma w dekoderach zgody zaznaczyć, iż jeżeli flaga przezroczystości BlockSize będzie na pewno równe 4 i
co do tego, jak traktować metody jest wygaszona (tj. równa 0), to pole jednocześnie korzystając z niego w celu
niezdefiniowane przez dokumentację. TransparentColorIndex może zostać załadowania danych do statycznego
IE oraz IV są zgodne, iż wszystkie przeznaczone na przechowanie bufora taka sytuacja prowadzi w
niestandardowe wartości powinny być dowolnego bajtu danych. prostej linii do przepełnienia bufora. W
traktowane jako powrót do poprzedniego Pole DelayTime (opóznienie) jest praktyce większość dekoderów wymaga,
obrazu, natomiast pozostałe dekodery informacją o wielkości opóznienia (w aby BlockSize był rzeczywiście równy 4
nie mają jednego określonego zdania. setnych sekundy) przed wyświetleniem (jest to sprawdzane, w przypadku innej
Różnice te teoretycznie pozwalają na kolejnej klatki. Ostatnie pole (a w zasadzie wartości dekoder przerywa pracę).
stworzenie GIFa, który wyglądać będzie flaga) UserInputFlag określa, czy
inaczej w każdej z wspomnianych dekoder powinien zaczekać na interakcję Rozszerzenie Netscape
przeglądarek graficznych czy z użytkownikiem (pojęcie to nie jest W GCE zabrakło informacji o tym,
internetowych. definiowane przez dokumentację, tak czy animacja jest jednorazowa,
Należy jeszcze dodać, iż Safari ma więc interakcją z użytkownikiem może czy też powinna być zapętlona w
poważne problemy wydajnościowe być dowolne zdarzenie uznane za nieskończoność. W tym celu powstało
w przypadku opcji nie usuwaj dla takowe przez dekoder, np. naciśnięcie rozszerzenie aplikacji NETSCAPE2.0
(jego obsługa została wprowadzona
Tabela 1. Struktura Graphic Control Extension
w Netscape Navigator 2.0 Beta 4),
Typ i nazwa pola Opis
którego pole NumberOfIterations (patrz
Tabela 2) określa, czy aplikacja powinna
BYTE ExtensionIntroducer Znacznik rozszerzenia, zawsze 0x21
animować GIF w nieskończoność
BYTE GraphicControlLabel Rodzaj rozszerzenia, zawsze 0xF9
(wartość 0), czy zaprzestać po określonej
BYTE BlockSize Wielkość następującego bloku danych, zawsze 4
BYTE Reserved:3 Zarezerwowane
BYTE DisposalMethod:3 Metoda usunięcia klatki
BYTE UserInputFlag:1 Flaga oczekiwania na interakcje
BYTE TransparentColorFlag:1 Flaga przezroczystości
WORD DelayTime Czas opóznienia
BYTE TransparentColorIndex Numer koloru przezroczystego
Rysunek 1. Artystyczna wizja własnej
BYTE BlockTerminator Terminator bloku, zawsze 0
interpretacji GIF przez różne przeglądarki
7-8/2008 HAKIN9 39
ATAK
liczbie przebiegów. Co ciekawe, Komentarze Programista może łatwo przeoczyć
NN 2.0 Beta 4 uznawała wszystkie Struktura komentarzy (ang. Comment także inny błąd, zakładając podczas
animacje posiadające niniejszą Extension, CE) jest bardzo prosta (co implementacji obsługi komentarzy, iż
strukturę jako mające się wykonywać w pokazuje Tabela 3) składa się ze komentarz nie będzie większy od jednego
nieskończoność, bez względu na wartość stałego nagłówka komentarzy, po nim sub-bloku (czyli nie będzie przekraczał
pola NumberOfIterations ; zostało to następuje seria sub-bloków z danymi 255 znaków) takie założenie może
poprawione w wersji Beta 5. Animacja (dla przypomnienia: każdy sub-blok doprowadzić do przepełnienia bufora.
nie posiadająca tej struktury (która składa się z bajtu określającego Plik GIF może zawierać dowolną ilość
powinna się znajdować zaraz za GCT) wielkość danych w bajtach oraz struktur CE.
jest traktowana przez dekodery wedle odpowiednią ilość bajtów danych)
uznania zazwyczaj jako animacja, i wreszcie sub-blok terminujący (z Rozszerzenie Plain Text
którą powinno odegrać się raz (IE, FF, wielkością danych równą 0). Ostatnim rozszerzeniem GIF jest Plain
O, S). Istnieją jednak dekodery (IV), Komentarze z plików GIF wyświetlają Text Extension rozszerzenie teoretycznie
które uznają, iż animacja powinna być jedynie nieliczne aplikacje, większość umożliwiające zapisanie tekstu na
odgrywana w nieskończoność. dekoderów je ignoruje. bitmapie jako faktycznego tekstu, a nie
Niektóre dekodery (np. IE i FF) Głównym błędem, jaki można serii pikseli. W takim wypadku dekoder
wyświetlają klatki animacji również popełnić podczas obsługi komentarzy byłby odpowiedzialny za prawidłowe
podczas ładowania GIFa. To wyświetlenie GIF, jest brak sprawdzania, co komentarz wyrysowanie tekstu na wynikowej bitmapie.
nie jest przez nie zaliczane jako faktycznie zawiera czy nie znajdują Niestety, w praktyce okazuje się, iż
faktyczne wyświetlenie animacji, przez się w nim znaki specjalne (np. końca żaden z przetestowanych dekoderów nie
co efektywnie animacja wyświetlana jest linii, terminatora tekstu) lub specjalnych miał zaimplementowanej obsługi tego
o jeden raz więcej. IrfanView natomiast sekwencji. Tego typu błąd został rozszerzenia.
ignoruje nagłówek całkowicie. znaleziony w roku 2001 w przeglądarce Co więcej, w kilku artykułach, na które
Pole One powinno mieć zawsze Netscape Navigator przez Floriana natknąłem się podczas badań, autorzy
wartość 1, natomiast nie wszystkie Wescha i umożliwiał umieszczenie kodu sugerują, iż jest to martwe rozszerzenie
dekodery je testują. Ze sprawdzonych JavaScript wewnątrz komentarza. Skrypt i powinno zostać zignorowane przez
dekoderów jedynie Firefox zwrócił uwagę ten zostałby wykonany w momencie programistę.
na jego zmianę jest to więc miejsce, w wyświetlenia pliku GIF (NN wyświetlał Niemniej jednak z uwagi na
którym można ukryć bajt danych. również komentarze) przez przeglądarkę, możliwość przyszłego pojawienia się
Kolejną możliwą modyfikacją jest np. w wyniku wejścia przez użytkownika tego typu dekoderów, lub pojawienia się
powiększenie bloku zawierającego na daną stronę WWW. potrzeby zaimplementowania takiego
wartość Magic. Dekodery zawarte
w IE oraz FF nie zwróciły uwagi na Tabela 2. Struktura NETSCAPE2.0
zmianę (powstało trochę miejsca
Typ i nazwa pola Opis
do umieszczenia danych), natomiast
BYTE Znacznik rozszerzenia, zawsze 0x21
dekoder zawarty w Operze uznał, iż
ExtensionIntroducer
animację należy odtworzyć jedynie raz,
BYTE ApplicationExtensi Rodzaj rozszerzenia, zawsze 0xFF
a dekoder z Safari że animację należy
onLabel
odtwarzać w nieskończoność.
BYTE BlockSize1 Długość sub-bloku danych, zawsze 0x0B
W przypadku zwiększenia drugiego
sub-bloku danych jedynie Opera
BYTE Magic[11] Zawsze NETSCAPE2.0
zareagowała identycznie, jak poprzednim
BYTE BlockSize2 Długość sub-bloku danych, zawsze 0x03
razem, reszta dekoderów zignorowała
BYTE One Zawsze 0x01
zmianę i zachowała się tak, jak gdyby
otrzymała prawidłowo wypełniony
WORD Ilość powtórzeń animacji
NumberOfIterations
nagłówek.
Analogicznie, jak w poprzednim
BYTE BlockTerminator Terminator bloku, zawsze 0
przypadku, programista powinien zwrócić
uwagę na możliwość wystąpienia
Tabela 3. Struktura Comment Extension
przepełnienia bufora.
Typ i nazwa pola Opis
BYTE ExtensionIntroducer Znacznik rozszerzenia, zawsze 0x21
W Sieci
BYTE CommentLabel Rodzaj rozszerzenia, zawsze 0xFE
" http://www.w3.org/Graphics/GIF/spec-
SubBlock CommentData[] Jeden lub więcej sub-bloków danych
gif89a.txt standard GIF89a.
BYTE BlockTerminator Terminator bloku, zawsze 0
40 HAKIN9 7-8/2008
FORMAT GIF OKIEM HAKERA
dekodera, postanowiłem omówić również Pierwszym wektorem ataku, który nieuważny programista mógł nie
i to rozszerzenie. nasuwa się od razu po przeczytaniu sprawdzić wielkości, co skończyło by
Rozszerzenie PTE opiera się o zaleceń standardu, jest użycie innej się przepełnieniem bufora z nadal
koncept stary jak świat znany z konsoli wielkości znaku niż 8x8 czy 8x16. niewielkim (ale jednak większym niż
poleceń stałą wielkość pojedynczego Zauważmy iż dla programisty ważną poprzednio) prawdopodobieństwem
znaku oraz podzielenie ekranu na siatkę informacją będzie ilość znaków w wykonania kodu.
o stałej całkowitej rozdzielczości. W linii, którą wylicza się za pomocą Innym wektorem ataku mogły by
strukturze PTE podaje się takie informacje prostego dzielenia TextGridWidth/ być indeksy kolorów tła i znaku. Jeżeli
jak początek siatki (położenie lewego CharacterCellWidth (można się obyć programista nie sprawdzi czy index nie
górnego rogu) pola TextGridLeftPosition bez tego równania, jednak z dużym wykracza po za paletę kolorów, może
oraz TextGridTopPosition (siatka prawdopodobieństwem pojawi się ono to doprowadzić do wycieku informacji
w cale nie musi się zaczynać na w programie; analogicznie liczy się (analogicznego jak w przypadku palety,
0,0!), szerokość i wysokość siatki maksymalną ilość linii w siatce). Celnym plików BMP i przeglądarek Mozilla
pola TextGridWidth i TextGridHeight, atakiem na każde dzielenie jest użycie z Firefox i Opera błąd został opisany
szerokość i wysokość pojedynczego zera w mianowniku co, niesprawdzone, w hakin9 3/2008), lub odmowy usługi
znaku pola CharacterCellWidth oraz powoduje wygenerowanie wyjątku Divide (DoS). Pojawia się również pytanie a
CharacterCellHeight, i kolor czcionki By Zero, a z kolei nieobsłużony wyjątek co jeśli plik nie będzie w ogóle posiadał
oraz tła (kolor korzysta z Global Color prowadzi do skutecznego ataku typu DoS. globalnej palety kolorów? Kolejny
Table). Sam tekst który ma zostać Innym podejściem do problemu możliwy wyciek informacji lub DoS.
wyrenderowany jest podzielony na wielkości znaku może być użycie Podobnie jak w przypadku
sub-bloki i jest dołączony po sub- większego znaku od siatki, oraz, w poprzednich rozszerzeń, można
bloku zawierającym konfigurację PTE. drugim podejściu, większego znaku przetestować zachowanie dekodera
Całość zakończona jest podobnie jak od całego obrazu. Można w tym celu w przypadku zmiany wielkości sub-
w przypadku poprzednich rozszerzeń użyć odpowiednio dużego znaku (np. bloku konfiguracyjnego. Warto również
terminującym bajtem o wartości 0. 255x255), lub odpowiednio małego sprawdzić czy dekoder jest w jakiś
Standard zaleca aby korzystać obrazu (np. 4x4) dla standardowej sposób wrażliwy na nieobecność
jedynie ze znaków o wielkości 8x8 lub wielkości znaku. Jeżeli programista sub-bloku konfiguracyjnego, oraz
8x16, oraz aby szerokość i wysokość zaniedba sprawdzanie takich na ekstremalną ilość sub-bloków
siatki była tak dobrana aby ilość znaków przypadków, taki atak doprowadzi do zawierających tekst.
w wierszu czy kolumnie była całkowita przepełnienia bufora obrazu jednak Z uwagi na fakt iż obecnie mało który
w przypadku gdy nie jest, część prawdopodobieństwo uruchomienia dekoder obsługuje rozszerzenie PTE, to
ułamkowa powinna zostać zignorowana. zewnętrznego kodu w takim wypadku rozszerzenie staje się bardzo dobrym
Należy zauważyć iż wybór kroju wydaje się być niezwykle niskie. miejscem na ukrycie dodatkowych
czcionki należy całkowicie do dekodera, Niejako rozwinięciem tego pomysłu informacji.
i jest niezależne od intencji osoby jest użycie siatki większej niż obraz,
tworzącej GIF'a. ale z wieloma małymi znakami Podsumowanie
We wszystkich wymienionych
Tabela 4. Struktura Plain Text Extension
rozszerzeniach warto zwrócić również
Typ i nazwa pola Opis
uwagę na możliwość dołożenia
BYTE ExtensionIntroducer Znacznik rozszerzenia, zawsze 0x21 kolejnego sub-bloku danych do
wymaganych sub-bloków powinno
BYTE PlainTextLabel Rodzaj rozszerzenia, zawsze 0x01
to pomóc stworzyć miejsce do ukrycia
BYTE BlockSize Wielkość sub-bloku zawsze 0x0C
kolejnych danych.
WORD TextGridLeftPosition Początek siatki współrzędna X
Tym artykułem kończę tematykę
plików GIF. Po lekturze obu artykułów
WORD TextGridTopPosition Początek siatki współrzędna Y
uważny Czytelnik powinien być w stanie
WORD TextGridWidth Szerokość siatki
zaimplementować bezpiecznie obsługę
WORD TextGridHeight Wysokość siatki
formatu GIF, wraz z rozszerzeniami, a
także skutecznie odnalezć błędy ukryte w
BYTE CharacterCellWidth Szerokość pojedynczego znaku
testowanych aplikacjach.
BYTE CharacterCellHeight Wysokość pojedynczego znaku
BYTE TextForegroundColorIndex Kolor znaku
Michał Składnikiewicz
Michał Składnikiewicz, inżynier informatyki, ma
BYTE TextBackgroundColorIndex Kolor tła znaku
wieloletnie doświadczenie jako programista oraz
reverse engineer. Obecnie pracuje w Hispasec
SubBlock PlainTextData[] Sub-bloki zawierające tekst
międzynarodowej firmie specjalizującej się w
bezpieczeństwie komputerowym.
BYTE BlockTerminator Terminator bloku, zawsze 0
Kontakt z autorem: gynvael@coldwind.pl
7-8/2008 HAKIN9 41
Wyszukiwarka
Podobne podstrony:
Format BMP okiem hakeraFORMATY PLIKóW GifFadal Format 2 (AC) B807 12Fadal Format 2 [MM] MW60 89Fadal Format 2 [PEP] M116 89 1SGH Flasher Dumper v 07 dif formatKonwersja Filmów Z Płyt Dvd Do Formatu DivxO hakerachFadal Format 2 [HM] MV16 89 1mFadal Format 2 [NW] D611 16 2mFormat jsformatwebctFadal Format 1 [DM] M179 15 1iCare Format Recovery naprawa systemu plikowFadal Format 2 LH [Co] MW66 12mwięcej podobnych podstron