Pliki Flash, pomimo zbieżności nazwy, nie mają nic wspólnego z przenośnymi pamięciami USB. Flash to zwyczajowe określenie na pliki o rozszerzeniu .swf, przenoszące animacje oraz zapewniające pewien poziom interaktywności. SWF, z angielskiego wymawiane swiff, początkowo przenosiły wyłącznie grafiki wektorowe, lecz szybko okazało się, że jest zapotrzebowanie na coś więcej. Kiedy w 1996 roku firma Macromedia zaprezentowała FutureSplash Animator, program do tworzenia animacji wektorowych, nikt nie spodziewał się, że efekt pracy kilkunastu osób zwróci uwagę takiego giganta jak Microsoft. Niewątpliwie, wykorzystanie technologii Flash do realizacji stron MSN czy Disneya, wpłynęło bardzo pozytywnie na dalszy rozwój tego nieformalnego standardu animacji internetowych.
Pierwszy FlashPlayer, opatrzony numerem 3, jest datowany na rok 1998. Jego wyróżnikiem stała się możliwość ładowania zewnętrznych zasobów multimedialnych, postrzegana jako wielka zaleta tego programu. Początkowo, tą zawartość zewnętrzną stanowiły wyłącznie pliki wideo, audio lub grafiki, lecz wraz z pojawianiem się kolejnych edycji odtwarzacza Flash okazało się, że potrzeba czegoś więcej. Twórcy stron internetowych nie chcieli przepisywać swoich źródeł przy każdej zmianie formatu SWF, a niejednokrotnie szata graficzna stron była rozbudowywana bazując na wcześniej skompilowanych modułach. Z tej przyczyny Macromedia zadecydowała o konieczności zapewnienia kompatybilności wstecznej. Kolejne edycje odtwarzacza, po dziś dzień, są w stanie odtworzyć dowolnie dawną wersję pliku. Ponadto, przewidziano możliwość zagnieżdżania starszych wersji plików SWF wewnątrz siebie. To, co miało być udogodnieniem, stało się udręką dla poszukiwaczy złośliwego kodu. W sieci nastąpił wysyp plików o strukturze matrioszki – plik zgodny z najnowszą wersją formatu przenosił w sobie pełen zestaw opakowanych plików, a szkodliwe instrukcje znajdowały się w najstarszym i najgłębiej schowanym SWF-ie – potomku. Jak łatwo przewidzieć, dodatkowym zabezpieczeniem przed odkryciem obecności niepożądanych komend stało się szyfrowanie plików zagnieżdżonych, najczęściej realizowane przy wykorzystaniu operacji XOR.
W tym miejscu należy się zastanowić, czego właściwie można się spodziewać po złośliwych plikach Flash. Niewątpliwie, większość z nich ma na celu skierowanie nieświadomego użytkownika na adres strony WWW przeprowadzającej ataki. Drugim najpopularniejszym sposobem ataku jest wywołanie awarii działania odtwarzacza w taki sposób, by uzyskać dostęp do zasobów systemowych i zainfekować bieżące procesy przy pomocy kodu maszynowego ukrytego w SWF-ie.
Wróćmy jednak do historii: w 2000 roku spod skrzydeł Macromedii wyszła kolejna, piąta wersja odtwarzacza, obsługująca język skryptowy ActionScript 1.0. Raptem trzy lata później pojawiła się kolejna wersja tego języka, ActionScript 2.0. Nie trzeba było długo czekać, bo kolejne trzy lata, by i ta wersja została zastąpiona przez nowszą. Ta ostatnia zmiana była o tyle znamienna, że wiązała się również ze zmianą maszyny wirtualnej obsługującej ten język. Ponadto, sam Flash trafił pod skrzydła firmy Adobe Systems. Wydawać by się mogło, że nie są to znaczące zmiany, a standard podlega płynnej ewolucji. Nic bardziej mylnego – kolejne modyfikacje doprowadziły do ogromnej złożoności Flasha, a powodowane były niemożnością rezygnacji z poprzednich rozwiązań.
Barokowość formatu, choć przydatna dla twórców grafiki, stała się przekleństwem poszukiwaczy złośliwego kodu. Większość z dostępnych analizatorów nadal tkwi na etapie pierwszej maszyny wirtualnej, która tylko teoretycznie wyszła z użycia w 2006 roku. Dodatkową komplikacją jest złożoność samego formatu pliku SWF, która jest strukturą bajtową, a wiele typów danych jest kodowanych przy pomocy zmiennej liczby bajtów. Sam szkielet struktury pliku jest względnie prosty: występuje nagłówek, znacznik z listą atrybutów pliku, a po nich ciąg znaczników w dowolnej kolejności, każdy przenoszący zawartość innego typu. Wszystkie znaczniki mają swój identyfikator typu, który umożliwia odtwarzaczowi prawidłową interpretację zawartości jako plik audio, grafikę, kod wykonywalny, itp. Stosunkowo często wykorzystywanym wybiegiem autorów złośliwego kodu jest dodawanie do pliku SWF znaczników o nieznanym typie, które są ignorowane przez FlashPlayer w procesie odtwarzania, natomiast mogą kamuflować obecność kodu maszynowego.
Dodatkowym utrudnieniem w procesie analizy pliku Flash jest zwyczaj zaciemniania kodu, który sam w sobie, nie powinien implikować „wątpliwego” pochodzenia kodu. Jest to typowa metoda ochrony praw autorskich, wykorzystywana przez grafików dla potrzeb ukrycia logiki działania programu czy też zabezpieczenia przed kradzieżą przenoszonej zawartości multimedialnej.
Dość ciekawa jest również kwestia znajdowania podatności w odtwarzaczu FlashPlayer – zazwyczaj jest to dokonywane przy wykorzystaniu tzw. techniki fuzzingu, która polega na badaniu reakcji odtwarzacza na spreparowane SWF-y, w których losowo podmieniono wartości pewnych parametrów. Niejednokrotnie, w efekcie zastąpienia jednego bajtu, możliwe staje się przejęcie kontroli nad działaniem odtwarzacza i realizacja niedozwolonego przeskoku w pamięci operacyjnej, co z kolei pociąga za sobą wykonanie spreparowanego zestawu szkodliwych poleceń.
Ta technika zyskuje ostatnio na popularności, ze względu na możliwość jej wykorzystania w połączeniu ze złośliwymi plikami PDF. Typowym scenariuszem jest zagnieżdżenie wadliwego SWF-a w PDF-ie, wyłącznie celem wywołania awarii odtwarzacza. W tym przypadku wektorem niszczycielskiego kodu jest najczęściej sam PDF. Ta metoda jest atrakcyjna z punktu widzenia autorów szkodliwych programów, ponieważ AcrobatReader posiada własny, wbudowany odtwarzacz plików SWF. Ten wewnętrzny Player jest łatany zgodnie z innym harmonogramem niż właściwy FlashPlayer (opóźnienie dochodzi nawet do dwóch tygodni), w związku z czym podatności ujawnione w kontekście formatu SWF są dłużej wystawione na ataki. Z tego powodu należy z dużą ostrożnością podchodzić do multimedialnych plików PDF.
(Artykuł autorstwa Elżbiety Zielińskiej z Zespołu Metod Bezpieczeństwa Sieci i Informacji NASK)