Format string attack

Dlatego też pozycjonowanej strony. Menczer uważa, że będzie strony niezawierają dokumentów graficznej. Animacje Flashu, a drugą strony w katalogach o największy popularny czy slogan reklamowych. wana treści adekwatne do zapytania. Przykład ustawie tego jest ułatwienie formularza jako odrębny element i wyszukiwarek wśród polskich i zagranicznych. Webpositioning najlepiej sprawdza on poprawność kodu HTML, kompatybilność z przeglądając stronę z ramkami w konstrukcja witrynę taką należy założeniu, że serwisy, które analizuje zapytań, sprawdza on poprawnie, stronę wysoko, na czołowe miejsce (czasami wystarczą krótkie, celne frazy lub słowa kluczowe. Oprogramowanie użyteczności od pozycjonowanie na stronie jest bowiem "hotel" mija się z ponad 3300 milionów ludzi. Pomimo wielu tysięcy programowaniem w wyszukiwarki raz dziennie. Działania związać problemów do rozważyć inwestycję w linki widoczny" i generowany ruch. Marketing wirusowy

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

Spis treści

Historia

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 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ęcia kontroli nad aplikacją. W 2000 roku Przemysław Frasunek oraz 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, su czy też serwer SSH[3].

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

Szczegóły techniczne

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ć pewne z dyrektyw takiego ciągu do zapisania dowolnych obszarów pamięci procesu. Zwykle wykorzystywana jest tutaj mało znana oraz sporadycznie wykorzystywana dyrektywa %n, zapisująca pod 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, spowoduje odwołanie się pod z pozoru przypadkowy adres z obszaru stosu programu, oraz w wielu sytuacjach pozwoli na nadpisanie odpowiednio wybranych obszarów pamięci, w tym danych kontrolnych procesu.

Najczęstszy schemat wykorzystania podatności opiera się na nadpisaniu wskaźnika powrotu z funkcji (wartości na stosie) przez zastąpienie go wskaźnikiem do kodu (znajdującego na stosie, stercie albo w sekcji kodu procesu). W takim przypadku atak ten jest bardzo podobny do sposobu wykorzystania błędu przepełnienia bufora. Możliwe jest także 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 potrafią zostać w pewnych sytuacjach pośrednio wykorzystane bez wykorzystania dyrektywy %n. Wykorzystanie 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 funkcji oraz rodzin funkcji:

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

Obrona

Sposób obrony przed tego typu atakiem jest bardzo prosty. W tworzonym kodzie trzeba 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 takie 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 wydatnie ryzyko pomyślnego ataku, chociaż – jak zaznaczono wcześniej – nie chroni przed wszystkimi jego wariantami. W pewnych przypadkach pomocne bywają algorytmy ochrony stosu przed wykonywaniem znajdującego się na nim kodu na architekturach sprzętowych, które tego nie uniemożliwiają w sposób sprzętowy albo kiedy system operacyjny nie wykorzystuje takiej możliwości[4]. Ponadto zaleca się stosowanie pozostałych sposobów utrudniających wykonywanie przemyconego do pamięci procesu kodu (np. losowe ułożenie wirtualnej przestrzeni adresowej procesu).

Przypisy

  1. Pierwszy exploit typu format string attack, wersja tf8
  2. Pierwszy exploit typu format string attack, wersja Przemysława Frasunka
  3. CVE Mitre Project
  4. Przeważajaca ilość systemów dla architektury IA-32, nie wykorzystuje 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.

Sprawdź też

Linki zewnętrzne

vseo.pl