Seminarski rad PDF dokumenat

 

DCOM exploit video RPC buffer overflow exploit video primjer

 

TFTP exploit video TFTP exploit video primjer
 

7. Race Conditions

Race conditions se javlja kada postoji mogućnost da korisnik prekine ili preusmjeri izvođenje programa. Na primjer, nesiguran program provjerava dali dopuštenja nad datotekom dopuštaju krajnjem korisniku da pristupi toj datoteci. Nakon što je provjera uspješno završena, neposredno prije pristupanja datoteci, napadač će preusmjerit pristup na drug datoteku nad kojom napadač nema valjana dopuštenja. Ovakva vrsta propusta se javlja zato što program provjerava sigurnosna pravila i prije nego program iskoristi sigurnosna pravila, napadač mijenja vanjsku ovisnost kako bi u vrijeme provjere vratio drugu vrijednost ( kao na primjer "access denied" ili "access granted").

7.1 File Race Conditions

 

Najčešći tip race condition propusta je vezan uz datoteke. File race conditions više puta je upleteno iskorištavanje vremenskih provjera. Na primjer, program mora kreirati privremenu datoteku u /tmp direktoriju, zapisati podatke u datoteku, očitati podatke iz datoteke, izbrisati datoteku, i nakon toga izaći. Između svih ovih stanja, ovisno o kojem se pozivu radi o kojoj je implementaciji riječ, moguće je da napadač promjeni uvjete koji su provjeravani od strane programa.

Pogledajmo sljedeći scenarij:

1. Pokrenemo program.
2. Program provjerava dali postoji /tmp/programname.lock.001 datoteka.
3. Ako ne postoji, tada kreira datoteku s odgovarajućim pravilima.
4. Zapiše PID ( engl. process id ) programa na zaključanu datoteku.
5. Nakon nekog vremena, očita PID s zaključane datoteke.
6. Kada je program završio, ukloniti zaključanu datoteku.

Također, ako uzmemo u obzir manjak kritičnih sigurnosnih koraka i da neki koraci nisu idealni, ovaj primjer će nam pomoći da pobliže proučimo race condition i shvatimo ga. Uzmemo li u obzir sljedeća pitanja koja se tiču scenarija:

■  Što će se dogoditi ako datoteka ne postoji u drugom koraku, ali prije trećeg koraka je izvršen napadačev simbolički link iz trenutne datoteke na datoteku koju napadač kontrolira, kao još jedna datoteka u /tmp direktoriju ? (simbolički link je slično kao pokazivač, on omogućuje da se pristupi datoteci pod drugim imenom pa čak i iz druge lokacije. Kada korisnik pokuša pristupiti datoteci koja je ustvari simbolički link, korisnik će biti preusmjeren na datoteku na koju pokazuje link. Zbog tog preusmjeravanja, sva datotečna prava su u biti ostala ista. Što ako napadač nema pristup datoteci na koju pokazuje link ?

■ Što su to dozvole zaključane datoteke ? Može li napadač zapisati proces ID (PID) u datoteku ?  Ili napadač može, preko prethodnog simboličkog linka, odabrati datoteku i PID?

■ Što će se dogoditi ako PID nije više valjan zbog toga što proces nije aktivan ? Što će se dogoditi ako neki drugi program ima isti PID ?

■ Kada je uklonjena zaključana datoteka, što ako je zaključana datoteka u biti bila simbolički link na datoteku nad kojom napadač nije imao dopuštenja pisati u nju ?

Ova pitanja demonstriraju metode ili početne točke odakle započeti napad kako bi napadač zadobio određene privilegije nad aplikacijom ili sistemom tj. eskalirao svoje trenutne dozvole nad sustavom.

7.2 Signal Race Conditions

 

Signal race conditions je vrlo sličan file race condition napadu. Program provjerava sigurnosna pravila, napadač zatim šalje signal okidač s drugačijim pravilima, i kada program izvrši svoje naredbe s dozvolama temeljenim na prethodnim sigurnosnim pravilima, dogodit će se drugačije ponašanje. Kritični signal race condition propust nađen je u popularnom mail paketu sendmail. Uzrok je bio što rukovatelj signalima race condition prouzročio propust u senmail paketu, napadač je iskoristio dvostruki preljev gomile propust.

Ovo je jednostavni tok izvođenja race condition propusta nad sendmail paketom:

1. Napadač šalje SIGHUP.
2. pozvana je funkcija rukovatelja signala, memorija je oslobođena.
3. Napadač šalje signal SIGTERM.
4. Ponovno se poziva funkcija rukovatelja signala, isti pokazivač je oslobođen.

Oslobađanjem dva puta iste memorije je tipični i česti heap propust u programima. Unatoč što signal race conditions se najčešće pronalazi u lokalnim aplikacijama, neke serverske aplikacije imaju implementiran SIGURG rukovatelj signala koji prihvaća signale s udaljenih računala odnosno udaljenih aplikacija. Signal urgent (SIGURG) je signal koji se zove kada je primljeno više podataka nego što i se može primiti preko mrežne utičnice (engl. Socket). Stoga, u daljinskom signal race condition scenariju, udaljeni napadač će poduzeti sljedeće korake, čekat će da aplikacija počne vršit provjeru, zatim će poslati veliku količinu podataka mrežnoj utičnici kako bi se pozvao urgent signal. U tom slučaju, ranjiva aplikacija će možda odobriti ponovno pozivanje istog signala i nakon što su primljena dva urgent signala, napadač će moći izvršiti dvostruki ( engl. .free bug) propust.

Race conditions je u osnovi logička greška bazirana na pretpostavci. Ako programer krivo pretpostavi da između dvije provjere uvjeta i obavljanja funkcije temeljene na uvjetima, uvjet se neće promijeniti. Takva vrsta propusta može se provesti na lokalnom računalu a isto tako i na udaljenom računalu, ali u stvarnosti takvu vrstu propusta je ipak lakše provesti na lokalnom računalu. To je zato što kad se race condition javi na udaljenom računalu, napadač nema uvijek mogućnost obaviti promjenu uvjeta kada aplikacija provjerava uvijete u željenom vremenu ( u pitanju su milisekunde ). Lokalni race conditions je puno lakše izvesti jer je takav napad direktno kontroliran od strane napadača. Važno je znati da race conditions napad nisu nužno bazirani na datotekama ili signalima. Bilo kakav događaj koji je provjeravan od strane programa i koji ovisi o rezultatu, teoretski vodi do izvršavanja koda koji dopušta eskalaciju privilegija. Osim toga, zato što je race condition prisutan, ne mora nužno značiti da napadač može pokrenuti uvjet u određenom vremenu, ili imati izravnu kontrolu preko memorije ili datoteke ako je on ili ona imao određena dopuštenja da pristupi određenom resursu.

7.3 Greška "man" ulazne validacije

 

Greška ulazne provjere postoji u man verziji 1.5. Ovaj propust je ispravljen u verziji 1.51, taj propust je omogućavao eskaliranje lokalnih privilegija i izvršavanje zlonamjernog koda. Kada se pristupilo man stranicama, stranice su nesigurno bile parsirane pa u slučaju zlonamjerne man stranice koja bi sadržavala zlonamjerni kod, bilo je moguće izvršiti taj kod pri pregledavanju man stranica koje traži korisnik.

Detalji propusta

Pa čak i kada je izvorni kod dostupan, propuste je prilično teško pronaći. Sljedeći odsječak koda je iz man-1.5k/src/util.c a ilustrira više funkcija koje su često provjeravane od propusta. Sve u svemu, u pitanju je trivijalna greščica, pokazano je kako funkcija kao ulazni argument  traži putanju, važan za provjeru sigurnosti. Prvi odsječak pokazuje poziv sistemske funkcije execv() od strane krajnjeg korisnika. Unošenjem podataka u execv() funkciju, zahtijeva oprezno parsiranje ulaznih podataka.

Primjer 7.3.1 util.c



static int
system0 (const char *command) {
int pid, pid2, status;

 pid = fork();
if (pid == -1) {
perror(progname);
fatal (CANNOT_FORK, command);
}
if (pid == 0) {
char *argv[4];
argv[0] = "sh";
argv[1] = "-c";
argv[2] = (char *) command;
argv[3] = 0;
execv("/bin/sh", argv);
exit(127);
}
do {
pid2 = wait(&status);
if (pid2 == -1)
return -1;
} while(pid2 != pid);
return status;
}

 

U drugom dijelu, podaci su kopirani u spremnik, i prije nego su ubačeni u sistemski poziv, prolaze kroz provjeru (poziva se funkcija is_shell_safe() ).

Primjer 7.3.2 util.c

 

 char *
my_xsprintf (char *format, ...) {
va_list p;
char *s, *ss, *fm;
int len;

len = strlen(format) + 1;
fm = my_strdup(format);

va_start(p, format);
for (s = fm; *s; s++) {
if (*s == '%') {
switch (s[1]) {
case 'Q':
case 'S': /* provjeri i pretvori u 's' */
ss = va_arg(p, char *);
if (!is_shell_safe(ss, (s[1] == 'Q')))
return NOT_SAFE;
len += strlen(ss);
s[1] = 's';
break;

#define NOT_SAFE "unsafe"

static int
is_shell_safe(const char *ss, int quoted) {
char *bad = " ;'\\\"<>|";
char *p;

if (quoted)
bad++;
for(p = bad; *p; p++)
if(index(ss, *p))
return 0;
return 1;
}

 

Kad se poziva funkcija my_xsprintf() u util.c man izvornog koda, kad se izvorno sretnu string s man stranice, vratit će NOT_SAFE. Nažalost, umjesto da vrati sigurni string, on vrati nesigurni string i pozove sistemski poziv s tim stringom. Ako je izvršni kod nazvan "nesiguran" i ako je ima korisničke (ili root) privilegije, tada je "nesigurni" binarni kod izvršen. Ovo je očito niski stupanj prijetnje zato što napadač mora imati eskalirane privilegije kako bi upisao zlonamjerni kod u man stranicu u direktorij s kazalom u koji imaju pristup krajnji korisnici. Ako to nije slučaj, moguće je da napadač već ima pristup korisničkom nalogu. Pa ipak, greška validacije ulaza man stranica ilustrira kako nije potrebo izvršiti preljev spremnika da bi došlo do ovakav problema, mogu voditi do sigurnosnih problema. Nisu svi propusti, pa čak ni izvršavanje zlonamjernog lokalnog koda, rezultat grešaka u programima. Mnoge greške u aplikacijama, osobito Web propusti, su uglavnom logičke greške i propusti u validaciji ulaznih parametara. Najbolji primjer tome su Cross-Site Scripting napadi, koji jednostavno iskorištavaju nedovoljno filtriranje ulaznih vrijednosti.