- Detekcija prelivanja bafera
- Jednostavan vektor upotrebe bafera
- Uklanjanje iz kodne baze
- Alternativna zaštita
- Ranjivosti kompilacije
- Statička analiza pokrivenosti
- Izvođenje napada putem korijena
- Napad Privremenog Skladišnog Prostora
- Opasnosti u C / C++
- Prelivanje bafera komunikacionog porta
- Metode za siguran razvoj
Svi programeri su svjesni potencijalne prijetnje prelijevanja bafera u svojim programima. Sa njim su povezane mnoge prijetnje, kako u Novom tako i u starom softveru, bez obzira na broj izvršenih popravki. Napadači mogu iskoristiti takvu grešku primjenom koda posebno dizajniranog da izazove prelijevanje početnog dijela skupa podataka, a zatim preostale upišu na memorijsku adresu pored prelivene.
Podaci mogu sadržavati izvršni kod koji će omogućiti napadačima da pokreću veće i složenije programe ili im daju pristup sistemu. Grešku je vrlo teško pronaći i ispraviti, jer se softverski kod sastoji od miliona linija. Popravljanje ovih grešaka je prilično komplikovano i, zauzvrat, takođe sklono greškama, što komplikuje proces eliminacije.
Detekcija prelivanja bafera

Prije traženja preljeva, moraš znati, šta je to. Kao što ime govori, ove ranjivosti su povezane sa baferima ili alokacijom memorije na jezicima koji omogućavaju direktan pristup čitanju i pisanju na niskom nivou.
Kada se koriste jezici C i asemblera, čitanje ili pisanje takvih distribucija ne provjerava automatski granice. Stoga, ako se u ovoj aplikaciji otkrije prelijevanje stack bafera, ne postoji provjera mogućnosti postavljanja broja bajtova u dotični bafer. U takvim slučajevima program može "preliti" svoj kapacitet. To dovodi do činjenice da podaci napisani nakon popunjavanja prepisuju sadržaj narednih adresa u steku i čitaju dodatne. Do prelivanja može doći nenamjerno zbog grešaka korisnika.
Dešava se da je to uzrokovano činjenicom da zlonamerni subjekt šalje pažljivo kreiran zlonamerni ulaz u program, koji zatim pokušava da ga sačuva u nedovoljnom baferu. Ako se u ovoj aplikaciji otkrije prelijevanje bafera steka, višak podataka se upisuje u susjedni, gdje se svi postojeći podaci prepisuju.
Obično sadrže pokazivač za povratak funkcije kojom se upravlja - adresu na kojoj proces treba da ide dalje. Napadač može postaviti nove vrijednosti tako da ukazuju na adresu po svom izboru. Napadač obično postavlja nove vrijednosti da označi lokaciju na kojoj se nalazi korisni teret. Ovo mijenja putanju izvršenja procesa i trenutno prenosi kontrolu na zlonamjerni kod.
Korišćenje preliva bafera omogućava napadaču da kontroliše ili prekine proces ili promeni njegove unutrašnje varijable. Ovo kršenje se svrstava u prvih 25 najopasnijih programskih grešaka na svijetu (2009 CWE / SANS Top 25 najopasnijih programskih grešaka) i definisano je kao CWE-120 u rječniku nabrajanja slabih sistemskih mjesta. Uprkos činjenici da su dobro proučeni, oni i dalje štete popularnim programima.
Jednostavan vektor upotrebe bafera
Kada radite sa izvornim kodom, morate obratiti posebnu pažnju na to gde se baferi koriste i modifikuju. Posebno treba napomenuti funkcije koje se odnose na unos koji daje korisnik ili drugi vanjski izvor, jer pružaju jednostavan vektor za korištenje kada se otkrije prelijevanje bafera steka. Na primer, kada korisnik postavi pitanje "Da" ili "ne", preporučljivo je sačuvati podatke o nizu korisnika u malom baferu za string "da", kao što je prikazano u sledećem primeru.

Gledajući kod, može se vidjeti da se provjera granica ne vrši. Ako korisnik unese "možda", program će se srušiti, a ne tražiti od njega odgovor, koji je napisan u tampon bez obzira na njegovu dužinu. U ovom primjeru, budući da je odgovor korisnika jedina deklarirana varijabla, sljedeće vrijednosti na steku bit će vrijednost povratne adrese ili mjesto u memoriji gdje će se program vratiti nakon izvršavanja funkcije postavljanja pitanja.
To znači da ako korisnik unese četiri bajta podataka, što je dovoljno za prelijevanje klijentovog komandnog bafera, slijedi važeća povratna adresa koja će biti promijenjena. Ovo će uzrokovati da program izađe iz funkcije u drugoj tački koda nego što je prvobitno bilo predviđeno, i može uzrokovati da se softver ponaša na opasan i nenamjeran način.
Ako je prvi korak za otkrivanje prelijevanja bafera u izvornom kodu razumijevanje kako oni rade, drugi korak je proučavanje vanjskog unosa i manipulacije baferom, tada će treći korak biti potreba da se otkrije koje su funkcije podložne ovoj ranjivosti i koje mogu djelovati kao "crvene zastavice". Funkcija gets je odlična za pisanje izvan bafera koji joj se pruža. Zapravo, ovaj kvalitet se proteže na cijelu porodicu srodnih mogućnosti, uključujući strcpy, strcmp i printf/sprintf, gdje god se koristi jedna od ovih funkcija ranjivosti prelivanja.
Uklanjanje iz kodne baze
Ako se u izvornom kodu otkrije prelivanje bafera steka, biće potrebno njihovo dosledno uklanjanje iz baze podataka. Da biste to učinili, morate biti upoznati sa sigurnim metodama rada. Najlakši način za sprečavanje ovih ranjivosti je korištenje jezika koji im ne dozvoljava. Jezik C ima ove ranjivosti zbog direktnog pristupa memoriji i nedostatka strogog kucanja objekata. Jezici koji ne dijele ove aspekte obično su neranjivi. To su Java, Python i .NET, zajedno s drugim jezicima i platformama koje ne zahtijevaju posebne provjere ili promjene.
Naravno, nije uvek moguće potpuno promeniti razvojni jezik. U ovom slučaju koriste se bezbedne metode na posao sa prelivom komandnog bafera. U slučaju funkcija obrade niza, bilo je dosta rasprava o tome koje su metode dostupne, koje su bezbedne za korišćenje, a koje treba izbegavati. Funkcije strcpy i strcat kopiraju niz u bafer i dodaju sadržaj jedne u drugu. Ove dvije metode pokazuju nesigurno ponašanje jer ne provjeravaju granice ciljnog bafera i pišu vani ako za to ima dovoljno bajtova.
Alternativna zaštita
Jedna od često predloženih alternativa su povezane verzije koje pišu do maksimalne veličine ciljnog bafera. Na prvi pogled izgleda kao savršeno rješenje. Nažalost, ove funkcije imaju malu nijansu koja uzrokuje probleme. Kada se dostigne ograničenje, ako se završni znak ne uklapa u posljednji bajt, Ozbiljno kvarovi se dešavaju kada čitanje bafera.

U ovom pojednostavljenom primjeru vidljiva je opasnost od nizova različitih od nule. Kada se foo stavi u normalan bafer, završava sa nulom jer ima dodatni prostor. Ovo je najbolji scenario. Ako su bajtovi u prelivanju bafera na steku u drugom baferu znakova ili drugom nizu za štampanje, Funkcija štampanja nastavlja da čita sve dok se ne postigne konačni znak tog niza.
Nedostatak je što jezik C ne pruža standardnu, sigurnu alternativu ovim funkcijama. Ipak, postoji i pozitivna-dostupnost nekoliko implementacija za određenu platformu. OpenBSD pruža strlcpy i strlcat, koji rade slično kao i strn funkcije, osim što skraćuju niz za jedan znak ranije da bi ga oslobodili mjesto za nulti terminator.
Slično tome, Microsoft pruža vlastite sigurne implementacije najčešće korištenih funkcija obrade stringova: strcpy_s, strcat_s i sprintf_s.
Poželjno je koristiti gore navedene sigurne alternative. Kada to nije moguće, izvršiti ručno granica provjeru i Null završetak prilikom obrade niz odbojnika.
Ranjivosti kompilacije

Ako nebezbedna funkcija ostavi otvorenu mogućnost prelivanja bafera C, onda nije sve izgubljeno. Kada pokreću program, kompajleri često stvaraju nasumične vrijednosti, poznate kao Kanari, i stavljaju ih na stek, tako da su opasne. Provjera vrijednosti canary-a u odnosu na njegovu originalnu vrijednost može utvrditi da li je došlo do prelijevanja Windows bafera. Ako je vrijednost promijenjena, program će biti zatvoren ili će preći u stanje greške, a ne na potencijalno promijenjenu povratnu adresu.
Neki moderni operativni sistemi pružaju dodatnu zaštitu od prelivanja bafera u obliku neizvršnih hrpa i randomizacije alokacije adresnog prostora (ASLR). Neizvršni stackovi - sprečavanje izvršenja podataka (DEP) - označite stack, au nekim slučajevima i druge strukture, kao područja u kojima se kod neće izvršiti. To znači da napadač ne može ubrizgati exploit kod u stek i čekati njegovo uspješno izvršenje.
Pre nego što popravite preliv bafera, raspakujte ASLR na računaru. Dizajniran je da zaštiti od programiranja orijentisanog ka povratku kao zaobilazno rješenje za neizvršne stackove, gdje su postojeći fragmenti koda okovani na osnovu njihove adrese.
Radi tako što randomizira memorijske regije struktura tako da je njihove nadoknade teže odrediti. Da je ova zaštita postojala kasnih 1980 - ih, crv Morris se mogao spriječiti. To je zbog činjenice da je funkcionisao djelimično popunjavanjem bafera u Unix finger protocol sa exploit kodom, a zatim ga preplavljuje da promijeni povratnu adresu i ukazuje na popunjeni bafer.
ASLR i DEP kompliciraju tačno određivanje adrese koja će se odrediti čineći ovo područje memorije potpuno neradnim. Ponekad ranjivost klizi kroz pukotine otvorene za napade prekoračenja bafera, uprkos prisustvu kontrola na nivou razvoja, kompajlera ili operativnog sistema.
Statička analiza pokrivenosti
U situaciji prelivanja bafera postoje dva ključna zadatka. Prvo, potrebno je identificirati ranjivost i promijeniti kodnu bazu u riješi problem. Drugo, oni pružaju zamjenu svih verzija koda ranjivosti za prekoračenje bafera. Idealno bi bilo da ovo počne automatskim ažuriranjem svih sistema povezanih na Internet.
Ne može se pretpostaviti da će takvo ažuriranje obezbijediti dovoljno pokrića. Organizacije ili pojedinci mogu koristiti softver na sistemima sa ograničenim pristupom internetu koji zahtijevaju ručna ažuriranja. To znači da vesti o ažuriranju treba distribuirati svim administratorima koji mogu koristiti softver, a zakrpa bi trebala biti lako dostupna za preuzimanje. Kreiranje i distribucija ispravki se vrše što bliže otkrivanju ranjivosti, što minimizira vrijeme ranjivosti.
Zahvaljujući upotrebi sigurnih funkcija obrade bafera i odgovarajućeg kompajlera i sigurnosne funkcije operativnog sistema možete stvoriti pouzdanu zaštitu od prelivanja bafera. Imajući u vidu ove korake, dosledna identifikacija nedostataka je ključni korak za sprečavanje eksploatacije.
Kombinovanje linija izvornog koda u potrazi za potencijalnim prijetnjama može biti zamorno. Osim toga, uvijek postoji šansa da ljudske oči propuste nešto važno. Alati za statičku analizu koriste se za osiguranje kvalitete koda, razvijeni su posebno za otkrivanje sigurnosnih ranjivosti tokom razvoja.
Statički setovi za analizu pokrivenosti "crvene oznake" za potencijalne prelive bafera. Zatim se obrađuju i ispravljaju zasebno, tako da ne ručno pretražuju u bazi podataka. Ovi alati, u kombinaciji sa redovnim provjerama i znanjem o tome kako ukloniti prelivanja, omogućavaju identifikaciju i uklanjanje velike većine nedostataka prije nego što se razvoj softvera završi.
Izvođenje napada putem korijena
Greške u kodiranju su obično uzrok prelivanja bafera. Česte greške prilikom razvoja aplikacija koje mogu dovesti do toga, uključuju nemogućnost izdvajanja dovoljno velikih bafera i nedostatak mehanizma za provjeru ovih problema. Takve greške su posebno problematične u C / C++ jezicima, koji nemaju ugrađenu zaštitu od prelivanja i često su meta napada prelivanja bafera.
U nekim slučajevima, napadač ubacuje zlonamerni kod u memoriju koja je oštećena usled prelivanja bafera stacka. U drugim slučajevima, oni jednostavno iskorištavaju susjednu korupciju memorije. Na primjer, program koji traži korisničku lozinku za pristup sistemu. U kodu ispod, ispravna lozinka daje root privilegije. Ako lozinka nije tačna, program ne daje korisničkim privilegijama.

U gornjem primjeru, program daje korisniku root privilegije, čak i ako je unio netačnu lozinku. U ovom slučaju, napadač daje ulaz čija je dužina duža nego što bafer može držati, stvarajući prelijevanje koje prepisuje memoriju cijelog prolaza. Stoga, uprkos netačnoj lozinki, vrijednost prolaza postaje različita od nule, a napadač dobija root prava.
Napad Privremenog Skladišnog Prostora
Bafer je privremeno područje za čuvanje podataka. Kada program ili sistemski proces postavi više podataka nego što je prvobitno dodijeljeno za čuvanje, dodatni se prelijevaju. Ovo uzrokuje da neki od njih procure u druge bafere, korumpiraju ili prepisuju podatke.
U napadu prelijevanja, dodatni podaci sadrže posebna uputstva za radnje koje namjerava haker ili zlonamjerni korisnik, na primjer, izazivaju odgovor koji oštećuje datoteke, mijenja podatke ili otkriva lične podatke.
Napadač koristi overflow exploit da iskoristi prednosti programa koji čeka korisnički unos. Postoje dvije vrste prelivanja bafera: na bazi steka i na hrpi. Heap-based su teško izvršiti i najmanje uobičajene, dok napadaju aplikacije popunjavanjem prostor rezervisan za program.
Stack - korišteni memorijski prostor za čuvanje korisnika ulaz. Ovo prelivanje je češće za napadače koji koriste aplikacije.
Savremeni kompajleri obično pružaju mogućnost provjere prelivanja tokom kompilacije / povezivanja, ali u vrijeme izvođenja prilično je teško provjeriti ovaj problem bez nekog dodatnog mehanizma zaštite pri rukovanju izuzecima.

Opcije rada programa:
- Ulaz: 12345678 (8 bajtova), program radi bez grešaka.
- Ulaz: 123456789 (9 bajtova), pojavljuje se poruka "Greška segmentacije", program završava.
Ranjivost postoji zbog prelivanja ako korisnički unos argv prelazi 8 bajtova. Za 32-bitni sistem (4 bajta), memorija je ispunjena dvostrukom riječju (32 bita). , veličina znaka je 1 bajt, tako da ako zatražite bafer sa 5 bajtova, sistem će dodijeliti 2 dvostruke riječi (8 bajtova). Zato kada unesete više od 8 bajtova bafer će preliti.
Postoje slične standardne funkcije, koje su tehnički manje ranjive. Na primjer, strncpy (), strncat() i memcpy (). Problem sa ovim funkcijama je, da je odgovornost za određivanje veličine tampon leži programer, ne kompajler.
Svaki C / C++ programer treba da zna problem prije početka kodiranja. Mnogi generirani problemi mogu se zaštititi od prelijevanja u većini slučajeva.
Opasnosti u C / C++

Korisnici C trebaju izbjegavati korištenje opasnih funkcija koje ne provjeravaju granice osim ako nisu sigurni da se granice neće prekoračiti. Funkcije koje u većini slučajeva treba izbjegavati radi pružanja zaštite uključuju strcpy funkcije. Treba ih zamijeniti funkcijama kao što su strncpy. Korištenje funkcije strlen treba izbjegavati ako je korisnik siguran da će završni znak NIL biti pronađen. porodica scanf (): scanf(3), fscanf (3), sscanf (3), vscanf (3), vsscanf (3) i vfscanf (3) - opasno za upotrebu, ne koristi se za slanje podataka u niz bez kontrole maksimalne dužine, "format %s" je posebno čest neuspjeh.
Zvanično, snprintf () nije standardna C funkcija u klasifikaciji ISO 1990. Ovi sistemi ne štite od prelivanja bafera, oni samo direktno zovu sprintf. Poznato je da trenutna verzija Linuxa snprintf radi ispravno, odnosno zapravo poštuje uspostavljenu granicu. Povratna vrijednost snprintf () se također mijenja.
Verzija 2 Unix specifikacije (SUS) i C99 standarda razlikuju se po tome što vraća snprintf(). Neke verzije snprintf-a ne garantuju da će niz završiti na NIL, a ako je niz predugačak, uopće neće sadržavati NIL. Glib biblioteka ima g_snprintf () sa sekvencijalnom semantikom povratka, uvijek završava Nilom i, što je najvažnije, uvijek uzima u obzir dužinu bafera.
Prelivanje bafera komunikacionog porta

Ponekad serijski port izvještava o prelivu bafera. Ovaj problem može uzrokovati nekoliko faktora. To uključuje brzinu računara, brzinu prijenosa podataka koja se koristi, FIFO veličinu serijskog porta i FIFO veličinu uređaja koji prenosi podatke na serijski port.
Kontrola protoka će čekati dok se određeni broj bajtova ne pojavi u baferu prije nego što procesor pošalje poruku ili signal drugom uređaju da prestane sa emitovanjem. Pri većim brzinama prenosa, serijski port će dobiti nekoliko bajtova od trenutka kada dostigne nivo kontrole protoka bafera i prestane da emituje uređaj.
Ovi dodatni bajtovi će biti veći ako je proces visokog prioriteta praćenje ciljnog procesora u realnom vremenu. Budući da proces prelijevanja međuspremnika komunikacijskog porta ima veći prioritet od prekida vize, procesor neće poduzeti nikakve radnje dok se takav proces ne završi u realnom vremenu.
VISA i Windows zadane postavke za 16-bajtni FIFO su 14 bajtova, ostavljajući 2 bajta u FIFO-u kada uređaj pokuša poslati poruku iz izvora. Pri većim brzinama prijenosa na sporijim računarima moguće je primiti više od 4 bajta u trenutku kada serijski port zatraži procesor, šaljući signal za zaustavljanje prijenosa.
Da biste riješili problem kada se u Windows 10 otkrije prelivanje bafera za stack, morate otvoriti upravitelj uređaja. Zatim pronađite COM port za koji se postavke mijenjaju i otvorite svojstva. Zatim kliknite na karticu "Napredno", pojavit će se klizač koji mijenja veličinu prelijevanja međuspremnika tako da UART omogućava bržu kontrolu protoka.
Podrazumevana vrednost je dovoljna u većini slučajeva. Međutim, ako dođe do greške prelijevanja bafera, smanjite vrijednost. Ovo će uzrokovati da se više prekida pošalje procesoru sa usporavanjem bajta u UART-u.
Metode za siguran razvoj

Metode sigurnog razvoja uključuju redovno testiranje za otkrivanje i uklanjanje preljeva. Najpouzdaniji način da se to izbjegne ili spriječi je korištenje automatske zaštite na nivou jezika. Još jedan popravak je run-time boundary checking, koji sprečava prelijevanje automatskim provjerom da li su podaci upisani u bafer u prihvatljivim granicama.
Usluga veracode cloud identifikuje ranjivosti kodova, kao što je prelivanje bafera, tako da ih programeri eliminišu pre nego što se koriste. Industrijska jedinstvena vlasnička tehnologija testiranja sigurnosti binarnih statičkih aplikacija (SAST) Veracode ga analizira, uključujući komponente otvorenog koda i komponente treće strane, bez potrebe za pristupom.
SAST upotpunjuje modeliranje prijetnji i recenzije kodova koje obavljaju programeri otkrivajući greške i propuste u kodu brže i po nižoj cijeni kroz automatizaciju. Po pravilu se pokreće u ranim fazama životnog ciklusa razvoja softvera, jer je lakše i jeftinije riješiti probleme prije početka implementacije proizvodnje.
SAST identifikuje kritične ranjivosti kao što su SQL injection, skriptiranje na više lokacija (XSS), greška prelivanja bafera, neobrađena stanja grešaka i potencijalne kutke i rupe. Osim toga, SAST binarna tehnologija pruža korisne informacije koje daju prioritet ovisno o težini i pružaju detaljna uputstva za ispravku .
Ranjivost prelivanja bafera postoji već skoro 3 decenije, ali je i dalje opterećujuća. Hakeri širom svijeta i dalje to smatraju svojom zadanom taktikom zbog ogromnog broja osjetljivih web aplikacija. Programeri i programeri provode ogromne napore za borbu protiv ovog zla IT tehnologija, koji dolaze sa novim i novim načinima.
Glavna ideja ovog drugog pristupa je da se sprovede alat za popravke koji pravi više kopija povratnih adresa na stogu, a zatim randomizuje lokaciju svih kopija pored broja. Svi duplikati se ažuriraju i provjeravaju paralelno, tako da svako odstupanje između njih ukazuje na mogući pokušaj napada i uzrokuje izuzetak.