Zlouporaba ranjivosti računalnih sustava |
Exploit |
Vrste exploita |
Buffer overflow |
Heap overflow |
Integer overflow |
Format string attack |
SQL injection |
Cross-site scripting |
Napad formatiranim nizom znakova (engl. Format string attack) je klasa ranjivosti programske opreme koja je otkrivena oko 1999. godine, a koja se prethodno smatrala bezazlenom. Napad ove vrste može prouzročiti rušenje programa ili izvođenje opasnog programskog kôda. Problem proizlazi iz korištenja nefiltriranih korisničkih ulaza poput formata znakovnog niza u nekim funkcijama programskog jezika C koje obavljaju formatiranje, poput funkcije printf(). Zlonamjerni korisnik može koristiti specifikatore formata poput %s (oznaka za niz znakova koji završava nul znakom – string) i %x (označava heksadecimalni cijeli broj bez predznaka) da bi ispisao podatke sa stoga ili neke druge memorijske lokacije. Moguće je također ispisati proizvoljne podatke na proizvoljne memorijske lokacije koristeći specifikator formata %n koji zapisuje broj formatiranih bajtova na adresu koja je pohranjena na stogu.
Ako napadač preda niz znakova koji sadrži specifikatore znakova printf() naredbe kao vrijednost parametra web aplikacije, on može:
Exploiti ove vrste obično koriste kombinaciju različitih tehnika da bi natjerali program da prepiše npr. povratnu adresu na stogu sa pokazivačem na neki zlonamjerni shellcode.
Pretpostavimo da web aplikacija ima parametar emailAdresa kojeg određuje korisnik i da aplikacija ispisuje vrijednost tog parametra koristeći funkciju printf() na sljedeći način: printf(emailAddress);
Ako vrijednost parametra emailAdresa sadrži specifikatore formata, funkcija printf() će parsirati te specifikatore i koristiti naknadno isporučene odgovarajuće argumente. Ako ti argumenti ne postoje, ispisat će se elementi stoga u skladu sa specifikatorima formata u funkciji printf().
Napad formatiranim nizom znakova prema tome možemo iskoristiti za:
Greške u programu, koje omogućuju napad formatiranim nizom znakova, se pojavljuju kada programer želi ispisati znakovni niz koji sadrži podatke koje je predao korisnik. Programer može krivo napisati printf(buffer) umjesto printf(''%s'', buffer). U prvom slučaju niz znakova buffer će se protumačiti kao formatirani niz i parsirat će se sve naredbe formatiranja koje sadrži. Druga verzija ispisuje niz znakova na ekran, što je bila i namjera programera. Greške ovog tipa se uz C mogu pojaviti i u drugim programskim jezicima, iako su vrlo rijetke i obično se ne mogu eksploatirati.
LITERATURA
autor: Marijana Zelanto, 0036400264