Buffer Overflow: uzroci, učinkovite metode za rješavanje problema i potrebna zaštita

Svi programeri su svjesni potencijalne prijetnje prelijevanja međuspremnika u svojim programima. Uz to postoje mnoge prijetnje, kako u novom tako iu starom, bez obzira na broj izvršenih ispravaka. Hakeri mogu upotrijebiti ovu grešku implementirajući kod koji je posebno dizajniran da uzrokuje prelijevanje početnog dijela skupa podataka, a zatim napiše preostali dio na memorijsku adresu u susjedstvu preljeva. Podaci mogu sadržavati izvršni kod koji napadačima omogućuje pokretanje većih i složenijih programa ili im omogućiti pristup sustavu. Pogreške je vrlo teško pronaći i popraviti jer se kod za kôd sastoji od milijuna redaka. Ispravljanje tih pogrešaka prilično je složeno i zauzvrat je također podložno pogreškama, što komplicira proces eliminacije.


Definicija preljeva međuspremnika

Prije traženja prelijevanja, morate znati što on predstavlja. Kao što ime implicira, te se ranjivosti odnose na međuspremnike ili dodjeljivanje memorije u jezicima koji omogućuju izravan pristup čitanju i pisanju na niskoj razini. Kada se koriste jezici C i Assembler, čitanje ili pisanje takvih distribucija ne povlači za sobom automatske granične provjere. U vezi s tim, ako je otkriven preljev bafera u ovoj aplikaciji, nema provjere mogućnosti postavljanja broja bajtova u razmatrani međuspremnik. U takvim slučajevima, program može "prelijevati" svoj kapacitet. To dovodi do činjenice da su podacisnimljene nakon punjenja, ponovno napišite sadržaj sljedećih adresa stogova i pročitajte ekstra. Prelijevanje se može pojaviti nenamjerno zbog korisničkih pogrešaka.


Događa se da je uzrokovana činjenicom da zlonamjerni entitet šalje program pažljivo stvoren zlonamjerni softver, koji ga zatim pokušava zadržati u neadekvatnom tamponu. Ako se u ovom programu otkrije preljev pretinca međuspremnika, višak podataka pohranjuje se u susjedstvu, zamjenjujući sve dostupne podatke. Obično sadrže povratnu točku za iskorištenu funkciju, adresu pod kojom proces treba ići dalje. Napadač može postaviti nove vrijednosti kako bi ukazao na odabranu adresu. Napadač obično postavlja nove vrijednosti kako bi označio gdje je korisno opterećenje. To mijenja način na koji se proces odvija i trenutačno prenosi upravljanje zlonamjernim kodom. Korištenje preljeva međuspremnika omogućuje napadaču nadzor ili izlazak iz procesa ili izmjenu njegovih internih varijabli. Ovo kršenje se događa u prvih 25 najopasnijih softverskih pogrešaka na svijetu (2009 CWE /SANS Top 25 najopasnijih programskih pogrešaka) i definirano je kao CWE-120 u prijevodu rječnika slabih lokacija sustava. Unatoč činjenici da su dobro proučeni, oni i dalje oštećuju popularne programe.

Jednostavni vektor pufera

Prilikom rada s izvornim kodom, morate obratiti posebnu pozornost na to gdje se koriste međuspremnici i mijenjati ih. Osobito vrijedna pažnje su funkcije koje se odnose na zaključak koji je dao korisnik ilidrugi vanjski izvor, budući da oni pružaju jednostavan vektor za upotrebu kada se otkrije prelijevanje međuspremnika. Na primjer, kada korisnik upita "da" ili "ne", preporučljivo je spremiti podatke o nizu korisnika u mali međuspremnik za redak "da", kao što je prikazano u sljedećem primjeru.
Gledajući kod, jasno je da granična provjera nije izvršena. Ako korisnik unese "moguće" onda program ruši posao i ne pita ga odgovor, koji je napisan u međuspremniku bez obzira na njegovu duljinu. U ovom primjeru, budući da je korisnički odgovor jedina deklarirana varijabla, vrijednost u skupu će biti vrijednost obrnute adrese ili memorijske lokacije, gdje će se program vratiti nakon pitanja postavljanja funkcije. To znači da ako korisnik unese četiri podatkovna bajta koja je dovoljna za prelijevanje klijentovog međuspremnika klijenta, bit će valjana povratna adresa koja će biti promijenjena. To će prisiliti program da prekine funkciju na različitoj točki u kodu nego što je prvobitno predviđeno, i može dovesti do toga što će se ponašati opasno i nenamjerno. Ako je prvi korak u otkrivanju prelijevanja međuspremnika u izvornom kodu razumijevanje načina na koji oni rade, drugi korak je ispitivanje vanjskog ulaza i manipulacije s međuspremnikom, a treći korak je potreba da se otkriju koje su značajke skloni ovom problemu i koje mogu djelovati kao "crvene zastavice" ”. Funkcija get je izvrsna za snimanje izvan spremnika koji mu je dodijeljen. U stvari, ta se kvaliteta proteže na cijelu obitelj povezanih značajki, uključujući strcpy, strcmp i printf /sprintf, gdje godjedna od tih funkcija je ranjivost prelijevanja.

Brisanje iz baze podataka koda

Ako se u izvornom kodu nađe preljev međuspremnika, potrebno je dosljedno uklanjanje iz baze podataka. Da biste to učinili, morate biti upoznati sa sigurnim metodama rada. Najlakši način da se spriječe ove ranjivosti je korištenje jezika koji im ne dopušta. Jezik C ima te ranjivosti zbog izravnog pristupa memoriji i nedostatka stroge tipizacije objekata. Jezici koji ne dijele ove aspekte obično nisu dostupni. To su Java, Python i .NET, zajedno s drugim jezicima i platformama koje ne zahtijevaju posebne provjere ili promjene. Naravno, ne možete uvijek potpuno promijeniti jezik razvoja. U ovom slučaju, sigurne metode koriste se za rad s preljevom međuspremnika naredbi. U slučaju funkcija linijske obrade, bilo je mnogo rasprava o tome koje su metode dostupne, koje je sigurno koristiti i koje treba izbjegavati. Funkcije strcpy i strcat kopiraju niz u međuspremnik i dodaju sadržaj jedni drugima. Ove dvije metode pokazuju nesigurno ponašanje jer ne provjeravaju granice ciljnog me uspremnika i izvode zapis izvan ako ima dovoljno bajtova za to.

Alternativna zaštita

Jedna od često predloženih alternativa su povezane verzije koje su napisane u maksimalnoj veličini ciljnog međuspremnika. Na prvi pogled, ovo izgleda kao idealno rješenje. Nažalost, ove značajke imaju malu nijansu koja uzrokuje probleme. Kada se dosegne granica, ako konačni znak nije postavljen u posljednjem bajtu, postoje ozbiljni kvarovi pri čitanju međuspremnika.

U ovomePojednostavljeni primjer pokazuje opasnost od žica, ne završava s nulom. Kada se foo smjesti u normalan međuspremnik, završava s nulom jer ima dodatni prostor. Ovo je najbolja opcija za razvoj događaja. Ako su bajtovi u preljevu međuspremnika na stogu u drugom međuspremniku znakova ili drugom nizu ispisa, funkcija ispisa će nastaviti čitati sve dok se ne dostigne završni znak tog retka. Nedostatak je što jezik C ne pruža standardnu, sigurnu alternativu tim značajkama. Ipak, postoji pozitivna - dostupnost nekoliko implementacija za određenu platformu. OpenBSD pruža strlcpy i strlcat koji rade slično strn-u, osim što skraćuju string jedan znak ranije, kako bi oslobodili prostor za nula terminatora. Isto tako, Microsoft nudi vlastitu sigurnu implementaciju često korištenih funkcija za obradu nizova: strcpy_s, strcat_s i sprintf_s. Upotreba gore navedenih sigurnih alternativa je najbolja. Kada to nije moguće, izvršite ručnu provjeru granice i nulti završetak kod obrade međuspremnika nizova.

Ranjivosti kompilacije

U slučaju da opasna funkcija ostavi otvorenu mogućnost prelijevanja tampon C, tada se ne gubi sve. Kada pokrenete program, sastavljači često stvaraju slučajne vrijednosti, poznate kao kanarinci, i stavljaju ih u stog, tako da predstavljaju opasnost. Provjerom vrijednosti kanala u odnosu na njegovu izvornu vrijednost može se odrediti je li došlo do prelijevanja međuspremnika u sustavu Windows. Ako je vrijednost promijenjena, program će biti zatvoren ili će preći u stanje pogreške, ali ne i potencijalnopromijenjena povratna adresa.
Neki suvremeni operativni sustavi pružaju dodatnu zaštitu od prelijevanja bafera u obliku nedostupnih hrpe i nasumične dodjele adresnog prostora (ASLR). Neizvršivo slaganje - Data Prevention (DEP) - označava hrpe, au nekim slučajevima i druge strukture kao područja gdje se kod neće izvršiti. To znači da napadač ne može implementirati exploit kod u stog i čekati njegovo uspješno izvršenje. Prije nego što popravite preljev međuspremnika, raspakirajte ga na ASLR PC. Osmišljen je da štiti od programiranih povrata kao premosnicu za neostvarive hrpe, gdje se postojeći odlomci koda skupljaju u lancu na temelju pristranosti njihovih adresa. Djeluje slučajnim odabirom memorijskih područja struktura, tako da je njihovo pomicanje teže definirati. Ako je ta zaštita postojala u kasnim 1980-ima, crv Morris mogao se spriječiti. To je zbog činjenice da je djelovao djelomično tako što je popunio spremnik u UNIX kodu iskorištavanja prstiju, a zatim ga prepunio kako bi promijenio povratnu adresu i pokazao na puni međuspremnik. ASLR i DEP kompliciraju preciznu definiciju adrese koju treba specificirati, dok je to područje memorije potpuno neumjesno. Povremeno ranjivost prolazi kroz pukotine otvorene za prelijevanje međuspremnika napada, unatoč prisutnosti kontrola na razini razvoja, kompilatora ili operativnog sustava.

Analiza statičke pokrivenosti

U situaciji preljeva međuspremnika postoje dva kritična zadatka. Prvo, morate identificirati ranjivost ipromijenite bazu koda kako biste riješili problem. Drugo, osigurati za zamjenu svih verzija buffer overflow kod ranjivosti. U idealnom slučaju to će započeti automatskim ažuriranjem svih sustava povezanih s internetom. Ne može se pretpostaviti da će takvo ažuriranje pružiti dovoljnu pokrivenost. Organizacije ili pojedinci mogu koristiti softver na sustavima s ograničenim pristupom internetu, koji zahtijevaju ručno ažuriranje. To znači da vijesti ažuriranja moraju biti distribuirane svim administratorima koji ga mogu koristiti, a zakrpa bi trebala biti lako dostupna za preuzimanje. Stvaranje i distribucija ispravaka obavlja se što je moguće bliže otkrivanju ranjivosti, što minimalizira vrijeme ranjivosti. Zahvaljujući upotrebi sigurnih funkcija obrade međuspremnika i odgovarajućih sigurnosnih značajki prevodioca i operacijskog sustava, možete stvoriti pouzdanu zaštitu od prelijevanja međuspremnika. U svjetlu ovih koraka, dosljedna identifikacija nedostataka je odlučujući korak u sprječavanju iskorištavanja. Kombiniranje izvornih nizova u potrazi za potencijalnim prijetnjama može biti iscrpljujuće. Osim toga, uvijek postoji mogućnost da ljudske oči propuste nešto važno. Alati za statičku analizu koriste se kako bi se osigurala kvaliteta koda, posebno su dizajnirani za otkrivanje ranjivosti tijekom razvoja. Statička analiza pokrivenosti postavlja "crvene oznake" za potencijalne preljeve međuspremnika. Tada se tretiraju i ispravljaju odvojeno kako se ne bi tražili u bazi podataka. Ovi alati su uu kombinaciji s redovitim provjerama i znanjem kako eliminirati prelijevanje, omogućuju vam da identificirate i uklonite veliku većinu nedostataka prije dovršetka softvera.

Izvođenje korijenskih napada

Pogreške kodiranja obično su uzrok preljeva međuspremnika. Uobičajene pogreške u razvoju aplikacija koje mogu dovesti do toga uključuju nemogućnost dodjeljivanja dovoljno velikih bafera i nedostatak mehanizma za provjeru tih problema. Takve su pogreške posebno problematične u C /C ++ jezicima, koji nemaju ugrađenu zaštitu od prelijevanja i često su predmet napada prelijevanja međuspremnika. U nekim slučajevima, napadač uvodi zlonamjerni kôd u memoriju koja je oštećena zbog prekoračenja međuspremnika. U drugim slučajevima jednostavno iskoristite prednosti oštećenja susjedne memorije. Na primjer, program koji traži korisničku lozinku za pristup sustavu. U donjem kodu, ispravna lozinka daje root prava. Ako je lozinka netočna, program ne daje korisničke ovlasti.
U gornjem primjeru, program pruža korisniku s root privilegijama čak i ako je unio pogrešnu lozinku. U ovom slučaju, napadač daje ulaz čija je duljina veća nego što se međuspremnik može prilagoditi, stvarajući preljeve, prepisujući memoriju cijelog broja. Stoga, unatoč pogrešnoj zaporci, vrijednost prijelaza postaje ne-nula, a napadač dobiva root prava.

Napad na vremensku zonu

Pufer je privremeno područje za pohranu. Kada aplikacija ili sistemski proces stavi više podataka nego što je biododijeljeno za pohranu, dodatne preljeve. To uzrokuje da neki od njih prodru u druge odbojnike, oštete ili zamijene podatke. U napadu prelijevanja, dodatni podaci sadrže posebne upute za radnje koje je počinio haker ili zlonamjerni korisnik, na primjer, uzrokuju odgovor koji oštećuje datoteke, mijenja podatke ili otkriva osobne podatke. Napadač koristi preljev za korištenje programa koji očekuje unos korisnika. Postoje dvije vrste preljevnog međuspremnika: stack i heap based. Složene pakete je teško izvršiti i najmanje uobičajeno, dok napadaju aplikaciju, popunjavajući prostor rezerviran za program. Stack je memorijski prostor koji se koristi za spremanje korisničkog unosa. Takav preljev je češći kod napadača koji koristi programe. Moderni kompilatori obično pružaju mogućnost provjere prelijevanja tijekom kompilacije /kompilacije, ali je tijekom izvođenja vrlo teško provjeriti ovaj problem bez ikakvog dodatnog mehanizma zaštite za rukovanje iznimkama.
Varijante programa:
  • Unesite: 12345678 (8 bajtova), program radi bez padova.
  • Unesite: 123456789 (9 bajtova), pojavit će se poruka "Greška segmentacije", program je dovršen.
  • Ranjivost postoji zbog prelijevanja ako korisnički unos argv premašuje 8 bajta. Za 32-bitni sustav (4 bajta) oni popunjavaju memoriju dvostrukom riječju (32 bita). Veličina znaka je 1 bajt, pa ako zatražite spremnik s 5 bajta,sustav će dodijeliti 2 dvostruke riječi (8 bajtova). Zato kada unesete više od 8 bajtova, Buffer će biti pun. Slične standardne značajke koje su tehnički manje osjetljive postoje. Na primjer, strncpy (), strncat () i memcpy (). Problem s ovim značajkama je u tome što odgovornost za određivanje veličine međuspremnika leži na programeru, a ne na prevodiocu. Svaki programer C /C ++ trebao bi znati problem prije početka kodiranja. Mnogi generirani problemi u većini slučajeva mogu biti zaštićeni od prelijevanja.

    Opasnosti u C /C ++

    Korisnici bi trebali izbjegavati uporabu opasnih funkcija koje ne provjeravaju granicu ako nisu sigurne da granice neće biti prekoračene. Funkcije koje treba izbjegavati u većini slučajeva kako bi se osigurala zaštita uključuju strcpy funkcije. Treba ih zamijeniti funkcijama kao što je strncpy. Izbjegavajte korištenje funkcije strlen ako je korisnik siguran da će se naći konačni NIL simbol. Obitelj scanf (): scanf
    , fscanf
    , sscanf
    , vscanf
    , vsscanf
    i vfscanf
    nisu sigurni za uporabu, ne koristi se za slanje podataka nizu bez kontrole maksimalnog duljina, "format% s" je osobito česta pogreška. Službeno, snprintf () nije standardna značajka C klasifikacije ISO 1990. Ovi sustavi ne štite od prelijevanja međuspremnika, oni jednostavno uzrokuju izravno sprintf. Poznato je da trenutna verzija Linuxa snprintf radi ispravno, odnosno da se zapravo pridržava postavljenog limita. Izračunata vrijednost snprintf () također varira. Verzija 2 specifikacije Unix (SUS) i C99 standard se razlikuju po tome što vraća snprintf (). nekiVerzije snprintf-a ne jamče da će se niz završiti u NIL-u, a ako je string predug, on uopće neće sadržavati NIL. Glib knjižnica ima g_snprintf () s sekvencijalnom semantikom povratka, uvijek završava s NIL-om i, što je najvažnije, uvijek uzima u obzir dužinu međuspremnika.

    Preljev međuspremnika komunikacijskih portova

    Ponekad serijski port prijavljuje međuspremnik preljeva. Taj problem može biti uzrokovan s nekoliko čimbenika. To uključuje brzinu računala, brzinu prijenosa podataka, veličinu FIFO serijskog porta i FIFO veličinu uređaja koji prenosi podatke u serijski port. Upravljanje protokom će čekati dok se određeni broj bajtova ne pojavi u međuspremniku prije nego procesor pošalje poruku ili signal drugom uređaju da zaustavi prijenos. Kod viših brzina prijenosa, serijski priključak će primiti nekoliko bajtova od trenutka kada je razina kontrole tlaka međuspremnika dosegnuta i uređaj zaustavljen. Ti dodatni bajti bit će veći ako proces visokog prioriteta upravlja procesorom cilja u stvarnom vremenu. Budući da preljev međuspremnika komunikacijskog porta ima veći prioritet od prekida VISA-e, procesor neće poduzimati nikakve radnje dok se ne dovrši u stvarnom vremenu. Zadane postavke VISA i Windows za 16-bajtni FIFO su 14 bajtova, ostavljajući 2 bajta u FIFO-u kada uređaj pokušava poslati poruku iz izvora. Na višim brzinama na sporim računalima moguće je dobiti više od 4 bajta u vrijeme kadaserijski port pita procesor, šalje signal o prekidu prijenosa. Da biste riješili problem kada se otkrije prelijevanje međuspremnika u sustavu Windows 10, morate otvoriti Upravitelj uređaja. Zatim pronađite COM port za koji se mijenjaju postavke i otvorite svojstva. Zatim kliknite na karticu "Napredno", pojavit će se klizač koji mijenja veličinu preljeva međuspremnika tako da UART brže uključi upravljanje streamom. Zadana vrijednost u većini slučajeva je dovoljna. Međutim, ako postoji pogreška preljeva međuspremnika, vrijednost se smanjuje. To će uzrokovati slanje više prekida u UART procesor pokušaja.

    Metode za siguran razvoj

    Tehnike sigurnog razvoja uključuju rutinsko testiranje za otkrivanje i uklanjanje prelijevanja. Najpouzdaniji način da se izbjegne ili spriječi korištenje automatske jezične zaštite. Drugo rješenje je provjera granica tijekom izvršavanja koja sprječava prelijevanje tako što automatski provjerava jesu li podaci zabilježeni u međuspremniku unutar dopuštenih granica. Veracode otkriva ranjivosti koda, kao što su bufferi prelijevanja, tako da ih razvojni inženjeri eliminiraju prije korištenja. Veracodeova patentirana tehnologija za binarno statičko testiranje sigurnosne sigurnosti (SAST) je jedinstvena u industriji, analizirajući je, uključujući komponente otvorenog koda i komponente treće strane, bez potrebe za pristupom. SAST dopunjuje simulaciju prijetnji i kodne preglede od strane programera brže i uz manje troškova.otkrivanje pogrešaka i propusta u kodu zbog automatizacije. U pravilu, radi se u ranim fazama životnog ciklusa razvoja softvera, jer je lakše i jeftinije riješiti probleme prije nastavka proizvodnje. SAST otkriva kritične ranjivosti kao što su SQL implementacija, cross-site scripting (XSS), greška u preljevu međuspremnika, status neobrađene pogreške i potencijalni kutovi. Osim toga, SAST binarna tehnologija pruža korisne informacije koje definiraju prioritete ovisno o težini i pruža detaljan priručnik za korekciju. Ranjivost preljeva tampona postoji gotovo tri desetljeća, ali je još uvijek opterećujuća. Hakeri iz cijelog svijeta i dalje ga smatraju svojom taktikom prema zadanim postavkama zbog velikog broja web aplikacija. Razvojni programeri i programeri ulažu velike napore u borbu protiv ove pošasti IT-tehnologija, izmišljajući nove i nove načine. Glavna ideja posljednjeg pristupa je implementacija alata za zakrpu koji čini višestruke kopije povratnih adresa u stog, a zatim nasumično određuje mjesto svih kopija uz broj. Svi se duplikati ažuriraju i provjeravaju paralelno, tako da svako odstupanje između njih ukazuje na pokušaj napada i uzrokuje iznimku.

    Povezane publikacije