User Tools

Site Tools


race_condition

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
race_condition [2025/04/26 13:03] ppalerace_condition [2025/12/01 11:40] (current) – external edit 127.0.0.1
Line 39: Line 39:
  
 {{  racecondition:slika2.png  }} {{  racecondition:slika2.png  }}
- 
-===PRIMJER - Zadatak s Hacknite platforme – Formule (Ovo je Hackultet platofrma)=== 
- 
-<file> 
-Jura je jako voli utrke pa je odlučio napraviti svoj web shop u kojem će prodavati stvari na temu formula i utrka. Za sad je dostupan samo jedan proizvod, dok još ne proširi svoju ponudu. 
-Kako bi promovirao svoj web shop i potaknuo ljude na kupnju, svim stvorenim računima Jura je odlučio dodijeliti 10 Eura i jednokratni popust za prvu kupnju od 25%. 
-Iako na računu nemate dovoljno novca za kupovinu artikla, postoji li način da ga ipak uspješno kupite? 
-</file> 
- 
-Čitajući tekst zadatka, mogu se primijetiti naputci (enlg. Hint) koji ukazuju na race condition. Tema zadatka su formule i utrke (engl. Race), a cilj zadatka je kupiti artikl za koji nemamo dovoljno novaca na računu, no imamo bon koji možemo iskoristiti za 25% popusta. 
-Nakon iskorištavanja popusta, na kratko se prikaže prazna stranica s natpisom „Postavljanje popusta“, koja može naznačiti nekakvo među stanje sustava u kojemu se postavlja popust. 
-Nakon toga se ponovno prikazuje stranica, s iskorištenim popustom od 25% i sniženom cijenom prikazanom na slici 3. 
- 
-{{  racecondition:slika3.png  }} 
- 
-Gumbi „Iskoristi popust“ i „Makni popust“ oba šalju POST request na istu putanju „/discount“, što može naznačivati da postoji „switch“ varijabla koja naznačuje je li popust postavljen ili nije, a koja mijenja vrijednost pri izvršavanju akcije za postavljanje ili micanje popusta. 
-Kako bi se provjerilo je li ova funkcionalnost ranjiva na race condition, može se koristiti Burp Suite alat „Repeater“ za slanje više istovremenih zahtjeva paralelno ili serijski preko jedne ili više konekcija. Ovaj alat je opisan na ovom linku: https://portswigger.net/burp/documentation/desktop/tools/repeater/send-group 
-Može se koristiti i drugi pristup, pisanja jednostavne JavaScript skripte koja će se izvršiti unutar konzole web preglednika. Ovaj pristup pruža manje mogućnosti, ali je dovoljan za jednostavne slučajeve, dok je u složenijim slučajevima bolje koristiti spomenuti alat. 
-Oblik skripte je definiran sljedećim izrazom: 
-<code> 
-for (let i = 0; i < N; i++) { fetch("/discount",{method: "POST"}); } 
-</code> 
-Gdje je N broj uzastopnih zahtjeva koji se šalju. Ova skripta se može pokrenuti na stranici zadatka u konzoli web preglednika, korištenjem razvojnih alata preglednika (F12). Prikazano na slici 4. 
- 
-{{  racecondition:slika4.png  }} 
- 
-Nakon pokretanja skripte za N = 10 i osvježavanja stranica, iskorišteni popust je -175%, a cijena još veća nego prije. Ovo naznačuje da je race condition ranjivost prisutna. Prikazano na slici 5. 
- 
-{{  racecondition:slika5.png  }} 
- 
-Uzevši u obzir da je prije pokretanja skripte, akcija pridružena putanji bila „Makni popust“, može se zaključiti da se ta akcija izvršila 8 puta, oduzimajući 200% popusta od originalnih 25%, rezultirajući krajnjim popustom od -175%. 
- 
-Stvaranjem novog korisnika ponovno se dolazi do početnog stanja bez iskorištenog popusta gdje je akcija pridružena uz putanju „/discount“ postavljena na iskoristi popust. Prikazano na slici 6. 
- 
-{{  racecondition:slika6.png  }} 
- 
-Ponovnim pokretanjem skripte, uz N=4, u stanju sustava dok popust nije postavljen, a predviđena akcija je postavljanje popusta, uspješno se čak 4 puta upotrebljava popust od 25%, što rezultira popustom od 100%, nakon čega je cijena 0. Prikazano na slici 7. 
- 
-{{  racecondition:slika7.png  }} 
- 
-Pritiskom na gumb „Buy“ uspješno se izvršava kupnja i dobiva rješenje zadatka. 
  
  
Line 142: Line 101:
  
 ===Zaštita od race conditiona=== ===Zaštita od race conditiona===
-Race condition ranjivost se može pojaviti u više oblika i u raznim funkcionalnostima, zato nema jednog rješenja koje se može primijeniti u svim situacijama, no najčešće rješenje je korištenje semafora i mutex zaključavanja pri korištenju kritičnih resursa. Mogu se koristiti ključevi za čitanje i ključevi za pisanje, gdje može istovremeno biti postavljeno više ključeva za čitanje na isti resurs, ali ključ za pisanje ne može biti postavljen istovremeno s drugim ključem za čitanje ili pisanje. Ovo rješenje ponekad može biti nepraktično, radi nepoželjnih karakteristika ili šanse da dođe do „deadlocka“, pa se ranjivost treba osigurati drugim načinom. +Race condition ranjivost se može pojaviti u više oblika i u raznim funkcionalnostima, pa zato nema jednog rješenja koje se može primijeniti u svim situacijama, no najčešće rješenje je korištenje semafora i mutex zaključavanja resursa pri korištenju kritičnih resursa. 
- Često su dostupna već gotova rješenja i biblioteke za resurse koji su predviđeni da se koriste u više-dretvenim okruženjima, jedan primjer je ConcurrentHashMap u Java programskom jeziku. Pri korištenju HashMap-a, koji se upotrebljava kao dijeljeni resurs između više dretvi, umjesto da dodatno implementiraju zaključavanja, može se koristiti dostupno rješenje koje je sigurno u više-dretvenim okruženjima.  +
-Također treba izbjegavati postepeno stvaranje objekata, gdje je objekt pri stvaranju u nedovršenom međustanju. Na primjer pri stvaranju novog korisnika u sustavu, prvo se izvodi jedna SQL transakcija za stvaranje dijela korisničkih podataka, onda se vrše druge operacije, pa se izvodi druga SQL operacija za stvaranje ostataka korisničkih podataka novog korisnika u bazi. Ovisno o funkcionalnostima, vremenski prozor između prve SQL transakcije gdje se stvara djelomični objekt i druge SQL transakcija nakon koje je objekt dovršen može otvoriti vrata nepredviđenom ponašanju i race condition ranjivosti. Umjesto toga, bolje je izvršiti cijeli proces stvaranja objekta u jednoj atomarnoj operaciji. +
- Važno je biti svjestan postojanja ove ranjivosti pri pisanju koda, paziti na redoslijed i razmak između operacija za provjeravanje i korištenje resursa i napraviti odgovarajuće promjene dizajna ako se uobičajena i gotova rješenja ne mogu koristiti. Napisani kod se može kasnije analizirati alatima za statički analizu koda koji imaju mogućnost detekcije race conditiona te se ciljani dio koda također može testirati pod opterećenjem, je li ispravno funkcionira pri obrađivanju više paralelnih zahtjeva. +
  
 +Mogu se koristiti ključevi za čitanje i ključevi za pisanje, gdje može istovremeno biti postavljeno više ključeva za čitanje na isti resurs, ali ključ za pisanje ne može biti postavljen istovremeno s drugim ključem za čitanje ili pisanje. Ovo rješenje ponekad može biti nepraktično, radi nepoželjnih karakteristika ili šanse da dođe do „deadlocka“, pa se ranjivost treba ukloniti drugim načinom.
  
 + Često su dostupna već gotova rješenja i biblioteke za resurse koji su predviđeni da se koriste u više-dretvenim okruženjima. Jedan primjer je ConcurrentHashMap u programskom jeziku Java. Pri korištenju HashMap-a, koji se upotrebljava kao dijeljeni resurs između više dretvi, umjesto da dodatno implementiraju zaključavanja, može se koristiti dostupno rješenje koje je sigurno u više-dretvenim okruženjima.
 + 
 +Također treba izbjegavati postupno stvaranje objekata, gdje je objekt tijekom stvaranja u nedovršenom međustanju. Na primjer, pri stvaranju novog korisnika u sustavu, prvo se izvodi jedna SQL transakcija za stvaranje dijela korisničkih podataka, onda se vrše druge operacije, pa se izvodi druga SQL operacija za stvaranje ostatka korisničkih podataka novog korisnika u bazi. Ovisno o funkcionalnostima, vremenski prozor između prve SQL transakcije gdje se stvara djelomični objekt i druge SQL transakcije nakon koje je objekt dovršen može otvoriti vrata nepredviđenom ponašanju i race condition ranjivosti. Umjesto toga, bolje je izvršiti cijeli proces stvaranja objekta u jednoj atomarnoj operaciji.
  
 +Važno je biti svjestan postojanja ove ranjivosti pri pisanju koda, paziti na redoslijed i razmak između operacija za provjeravanje i korištenje resursa i napraviti odgovarajuće promjene dizajna ako se uobičajena i gotova rješenja ne mogu koristiti. Napisani kod se može kasnije analizirati alatima za statičku analizu koda koji imaju mogućnost detekcije race conditiona te se ciljani dio koda također može testirati pod opterećenjem, funkcionira li ispravno pri obrađivanju više paralelnih zahtjeva.
  
  
race_condition.1745672595.txt.gz · Last modified: 2025/12/01 11:40 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki