Format string attack – atak informatyczny, będący stosunkowo nową techniką wykorzystywania błędów programistycznych w aplikacjach. Błędnie napisana aplikacja może być przy wykorzystaniu tej techniki usunięta przez system operacyjny z listy uruchomionych procesów (tzw. crash) lub zmuszona do wykonania kodu dostarczonego przez napastnika.

Historia

edytuj

Pierwsze informacje na temat błędnego użycia funkcji wykorzystujących łańcuchy formatujące pojawiły się w wynikach analizy kodu źródłowego powłoki csh w 1990 r. przy wykorzystaniu techniki automatycznego testowania aplikacji (tzw. fuzzingu) na Uniwersytecie Wisconsin ([Miller, Fredriksen, So 1990]).

Przez wiele lat niewłaściwe wykorzystanie funkcji operujących na ciągach formatujących było uważane za błąd nie umożliwiający jednak przejęcie kontroli nad aplikacją. W 2000 roku Przemysław Frasunek i równolegle osoba o pseudonimie „tf8” przedstawili na liście dyskusyjnej Bugtraq po raz pierwszy exploity wykorzystujące błędy tego typu w szeroko stosowanym serwerze usługi FTP[1][2]. Kod źródłowy exploita pokazywał technikę umożliwiającą przejęcie kontroli nad aplikacją przy wykorzystaniu błędnego wywołania funkcji vsnprintf() wewnątrz własnej funkcji, odpowiedzialnej za formułowanie odpowiedzi (lreply()).

Pierwsze udane wykorzystanie tego błędu programistycznego szybko zaowocowało kolejnymi exploitami wykorzystującymi błędy w istniejących implementacjach aplikacji. Podatnymi na atak z wykorzystaniem błędu format bug okazały się tak szeroko stosowane w internecie aplikacje, jak: ProFTPD(inne języki), su(inne języki) czy też serwer SSH[3].

Obecnie format bugi są coraz rzadziej spotykane w dostępnym oprogramowaniu ze względu na znacznie rozpowszechnienie wiedzy o skutkach i sposobach unikania tego typu błędów oraz dosyć łatwe techniki wykrywania tej klasy błędów.

Szczegóły techniczne

edytuj

Atakujący wykorzystuje błędny sposób przekazywania argumentów do funkcji operujących na ciągach formatujących, takich jak printf(), w języku C. W przypadku posiadania przez napastnika kontroli nad ciągiem formatującym może on wykorzystać niektóre z jego dyrektyw do zapisania dowolnych obszarów pamięci procesu. Zwykle wykorzystywana jest tutaj mało znana i sporadycznie wykorzystywana dyrektywa %n, zapisująca w obszar pamięci wskazywany przez kolejny argument (który powinien znajdować się na stosie procesu) liczbę dotychczas zapisanych przez atakowaną funkcję znaków. Umiejętne użycie dyrektywy %n oraz dyrektyw określających liczbę znaków do wypisania, np. %<liczba>s, powoduje odwołanie się do, z pozoru przypadkowego, adresu z obszaru stosu programu i w wielu sytuacjach pozwoli na nadpisanie odpowiednio wybranych obszarów pamięci, w tym danych kontrolnych procesu.

Najczęstszy schemat wykorzystania podatności polega na nadpisaniu wskaźnika powrotu z funkcji (będącego wartością na stosie) przez zastąpienie go wskaźnikiem do kodu znajdującego na stosie, stercie lub w sekcji kodu procesu. W takim przypadku atak ten jest bardzo podobny do sposobu wykorzystania błędu przepełnienia bufora. Innym schematem jest nadpisanie danych (zmiennych), co może prowadzić do korzystnych, z punktu widzenia atakującego, zmian w przepływie sterowania procesu, np. eskalacji uprawnień.

Błędy tego typu mogą zostać w pewnych sytuacjach pośrednio wykorzystane bez zastosowania dyrektywy %n. Użycie dyrektywy %s może doprowadzić do ujawnienia zawartości pamięci procesu uprzywilejowanego, w tym np. haseł; w innym scenariuszu możliwe jest doprowadzenie do skopiowania do bufora (np. funkcją sprintf()) większej ilości danych niż przewidział programista.

Najpopularniejsze z podatnych na atak funkcje i rodziny funkcji:

  • printf()
  • syslog()
  • err()
  • warn()
  • setproctitle()

Obrona

edytuj

Sposób obrony przed tego typu atakiem jest bardzo prosty. W tworzonym kodzie należy unikać przekazywania ciągów formatujących, dostarczonych przez użytkownika, do funkcji wykorzystujących ciągi formatujące (np. printf()) oraz takich, które tego typu funkcje wewnętrznie wykorzystują (np. syslog()). W ogólnym przypadku sprowadza się to zamiany wywołań typu:

printf(string);

na

printf("%s", string);

Dodatkowo, możliwe jest zabezpieczenie zamkniętego oprogramowania przez taką zmianę funkcji bibliotecznych, by odrzucać relatywnie mało przydatną dyrektywę %n we wszystkich odwołaniach do biblioteki. Zmniejsza to znacznie ryzyko pomyślnego ataku, chociaż – jak zaznaczono wcześniej – nie chroni przed wszystkimi jego wariantami. W niektórych przypadkach pomocne mogą być algorytmy ochrony stosu przed wykonywaniem znajdującego się na nim kodu na architekturach, które tego nie uniemożliwiają w sposób sprzętowy lub gdy system operacyjny nie wykorzystuje takiej możliwości[4]. Ponadto zaleca się stosowanie pozostałych sposobów utrudniających wykonywanie kodu przemyconego do pamięci procesu (np. losowe umiejscowienie wirtualnej przestrzeni adresowej procesu).

Zobacz też

edytuj

Przypisy

edytuj
  1. Pierwszy exploit typu format string attack, wersja tf8
  2. Pierwszy exploit typu format string attack, wersja Przemysława Frasunka
  3. CVE Mitre Project. [dostęp 2006-09-03]. [zarchiwizowane z tego adresu (2004-04-03)].
  4. Większość systemów dla architektury IA-32, nie korzysta z takiej możliwości na poziomie segmentów pamięci ze względu na małą elastyczność zarządzania nimi, choć jest to technicznie możliwe. Dopiero od pewnego czasu możliwe jest sprzętowe wspomaganie na poziomie pojedynczych stron pamięci w postaci bitu NX. Na tym poziomie najczęściej implementuje się podsystem pamięci wirtualnej we współczesnych systemach operacyjnych.

Linki zewnętrzne

edytuj

📚 Artikel Terkait di Wikipedia

Przemysław Frasunek

oraz udostępniono dalsze kody źródłowe eksploitów wykorzystujących format string attack. Krótkofalowiec (znak: SQ5JIV). W Internecie posługuje się pseudonimem

Printf

printf wiążą się dwie podstawowe grupy zagrożeń bezpieczeństwa: Format string attack – w sytuacji, gdy użytkownik ma możliwość wpływu na użyty łańcuch

Return-to-libc attack

w niektórych rozwiązaniach – w sekcji kodu procesu. Exec Shield format string attack NX-bit przepełnienie bufora Opis łatki Exec Shield dla systemu GNU/Linux

Eskalacja uprawnień

prowadzącą do eskalacji uprawnień, jest wykorzystanie błędów programistycznych w jądrze systemu operacyjnego. format string attack exploit przepełnienie bufora

Bezpieczeństwo teleinformatyczne

bufora, nadużycie szablonu formatowania funkcji *printf() (ang. format string attack) czy przekroczenie zakresu liczb całkowitych. Częstym efektem błędów

Summer of ’69

innymi piosenkami: „I got my first real six string” – „Juke Box Hero” Foreigner („I bought a beat up six-string in a second-hand store”) „Standin’ on your

Dżem (zespół muzyczny)

zagrał saksofonista Alek Korecki oraz perkusista Krzysztof Przybyłowicz ze String Connection, który zastąpił tymczasowo Giercuszkiewicza, który został wyrzucony

Waterloo (singel)

„Non ho l’età” „Poupée de cire, poupée de son” „Merci Chérie” „Puppet on a String” „La, la, la” „Un jour, un enfant” „De troubadour” „Boom Bang-a-Bang” „Vivo