Preliv medpomnilnika: vzroki, učinkovite metode reševanja problema in potrebna zaščita

Vsi programerji se zavedajo potencialne nevarnosti prelivanja medpomnilnika v svojih programih. Z njo je veliko groženj, tako v novem kot v starem, ne glede na število opravljenih popravkov. Hekerji lahko uporabijo to napako z uporabo kode, ki je posebej zasnovana tako, da povzroči prelivanje začetnega dela podatkovnega niza, nato pa zapiše preostanek na naslov pomnilnika, ki meji na prelivanje. Podatki lahko vsebujejo izvršljivo kodo, ki omogoča napadalcem, da izvajajo večje in bolj zapletene programe ali jim omogočijo dostop do sistema. Napake je zelo težko najti in popraviti, ker koda za kodo vsebuje milijone vrstic. Popravek teh napak je precej zapleten in hkrati nagnjen k napakam, kar otežuje postopek izločanja.


Opredelitev prekoračitve blažilnika

Pred iskanjem prelivanja morate vedeti, kaj predstavlja. Kot že ime pove, se te ranljivosti nanašajo na pufre ali pomnilnik v jezikih, ki zagotavljajo neposreden dostop do branja in pisanja na nižji ravni. Če uporabljate jezike C in Assembler, branje ali pisanje takšnih distribucij ne pomeni samodejne mejne kontrole. V povezavi s tem, če je v tej aplikaciji zaznan prekoračitev medpomnilnika, ni preverjanja možnosti, da bi se število bajtov v upoštevanem medpomnilniku. V takih primerih lahko program "preplavi" svojo zmogljivost. To vodi do dejstva, da podatkiposneto po polnjenju, ponovno napišite vsebino naslednjih naslovov skladov in preberite dodatno. Prelivanje se lahko zgodi nenamerno zaradi uporabniških napak.


To se zgodi zaradi dejstva, da zlonamerna organizacija v program pošlje skrbno ustvarjeno zlonamerno programsko opremo, ki jo nato poskuša obdržati v neustreznem medpomnilniku. Če bo to zaznalo prekoračitev medpomnilnika v tej aplikaciji, se presežni podatki shranijo v sosednjem mestu in nadomestijo vse razpoložljive podatke. Običajno vsebujejo povratno točko za izkoriščeno funkcijo, naslov, pod katerim naj bi proces potekal dlje. Napadalec lahko nastavi nove vrednosti, ki kažejo na izbrani naslov. Napadalec ponavadi nastavi nove vrednosti, da pokaže, kje je tovor. To spremeni način delovanja procesa in takoj prenese upravljanje zlonamerne kode. Uporaba prekoračitve medpomnilnika omogoča napadalcu, da nadzoruje ali zapre proces ali spremeni svoje notranje spremenljivke. Ta kršitev poteka v 25 najbolj nevarnih programskih napak na svetu (2009 CWE /SANS Top 25 najbolj nevarnih programskih napak) in je definirana kot CWE-120 v slovarju prevodov šibkih sistemskih lokacij. Kljub dejstvu, da so dobro preučeni, še naprej poškodujejo priljubljene programe.

Enostavni varovalni vektor

Pri delu z izvorno kodo morate posebno pozornost nameniti uporabi pufrov in njihovemu spreminjanju. Posebej je treba omeniti funkcije, ki se nanašajo na zaključek, ki ga zagotovi uporabnik alidrugega zunanjega vira, ker zagotavljajo preprost vektor za uporabo, ko se zazna preliv skladišča medpomnilnika. Na primer, ko uporabnik vpraša "da" ali "ne", je priporočljivo shraniti podatke niza uporabnika v majhnem medpomnilniku za vrstico "da", kot je prikazano v naslednjem primeru.
Če pogledamo kodo, je jasno, da mejna kontrola ni izvedena. Če uporabnik vnese "možno", program zruši delo in mu ne zastavi odgovora, ki je zapisan v medpomnilnik, ne glede na njegovo dolžino. V tem primeru, ker je uporabniški odgovor edina deklarirana spremenljivka, bo vrednost v skladu vrednost povratnega naslova ali pomnilniške lokacije, kjer se bo program vrnil po vprašanju funkcije vprašaj. To pomeni, da če uporabnik vnese štiri podatkovne bajtove, ki zadostujejo za prelivanje odjemalčevega odjemalskega vmesnega pomnilnika, bo veljaven povratni naslov, ki bo spremenjen. To bo program prisililo, da zapusti funkcijo na drugi točki v kodi, kot je bilo sprva predvideno, in lahko pripelje do tega, kar se bo obnašalo nevarno in nenamerno. Če je prvi korak pri odkrivanju prelivanja medpomnilnika v izvorni kodi razumevanje, kako delujejo, je drugi korak preučitev zunanjega vnosa in manipulacije z medpomnilnikom, nato pa je treba ugotoviti, katere značilnosti so nagnjene k temu problemu in ki lahko delujejo kot "rdeče zastave » Funkcija get je odlična za snemanje izven pufra, ki mu je na voljo. Pravzaprav se ta kakovost razširja na celotno družino povezanih funkcij, vključno s strcpy, strcmp in printf /sprintf, kjer koliena od teh funkcij je ranljivost prelivanja.

Brisanje iz zbirke podatkov kode

Če je v izvorni kodi na voljo prekoračitev medpomnilnika, bo potrebna dosledna odstranitev iz baze podatkov. Da bi to naredili, morate poznati varne metode dela. Najlažji način, da preprečite te ranljivosti, je uporaba jezika, ki jim tega ne omogoča. Jezik C ima te ranljivosti zaradi neposrednega dostopa do pomnilnika in pomanjkanja stroge tipizacije objektov. Jeziki, ki ne delijo teh vidikov, ponavadi niso na voljo. To so Java, Python in .NET, skupaj z drugimi jeziki in platformami, ki ne zahtevajo posebnih preverjanj ali sprememb. Seveda razvojnega jezika ne morete vedno popolnoma spremeniti. V tem primeru se varne metode uporabljajo za delo s prelivanjem vmesnega pomnilnika ukazov. V primeru funkcij za linijsko obdelavo je bilo veliko razprav o tem, katere metode so na voljo, ki so varne za uporabo in se jih je treba izogibati. Funkcije strcpy in strcat kopirajo niz v medpomnilnik in dodajo vsebino drug drugemu. Ti dve metodi prikazujeta nevarno vedenje, ker ne preverjata meja ciljnega vmesnega pomnilnika in izvajajo zapis zunaj, če je za to dovolj bajtov.

Nadomestna zaščita

Ena izmed pogosto predlaganih alternativ je sorodne različice, ki so zapisane v največji velikosti ciljnega pufra. Na prvi pogled to izgleda kot idealna rešitev. Na žalost imajo te lastnosti majhen odtenek, ki povzroča težave. Ko je meja dosežena, če končni znak ni nameščen v zadnjem bajtu, se pri branju medpomnilnika pojavijo resne napake.

V temPoenostavljeni primer prikazuje nevarnost nizov, ne konča z ničlo. Ko je foo postavljen v normalni vmesni pomnilnik, se konča z ničlo, ker ima dodaten prostor. To je najboljša možnost za razvoj dogodkov. Če bajti v prelivnem medpomnilniku na kupu bodo v drugem medpomnilniku znakov ali drugem nizu tiskanja, bo funkcija tiskanja nadaljevala branje, dokler ne bo dosežen končni znak te vrstice. Pomanjkljivost je, da jezik C ne zagotavlja standardne in varne alternative tem funkcijam. Kljub temu je pozitivno - razpoložljivost več izvedb za določeno platformo. OpenBSD zagotavlja strlcpy in strlcat, ki delata podobno kot strn, razen da prej skrajšata niz za en znak, da sprostita prostor za ničelni terminator. Podobno Microsoft ponuja lastno varno izvajanje pogosto uporabljenih funkcij za obdelavo nizov: strcpy_s, strcat_s in sprintf_s. Uporaba zgoraj navedenih varnih alternativ je najboljša. Če to ni mogoče, izvedite ročno preverjanje meje in ničelni zaključek pri obdelavi pufrov nizov.

Ranljivosti zbiranja podatkov

V primeru, da nevarna funkcija pušča odprto možnost prelivanja pufra C, potem se ne izgubi vse. Ko zaženete program, prevajalci pogosto ustvarijo naključne vrednosti, znane kot kanarčki, in jih postavijo v sklad, tako da predstavljajo nevarnost. Preverjanje vrednosti kanala glede na prvotno vrednost lahko ugotovi, ali je bilo v sistemu prelivanje medpomnilnika. Če je bila vrednost spremenjena, bo program zaprt ali bo šel v stanje napake, vendar ne potencialnospremenjen povratni naslov.
Nekateri sodobni operacijski sistemi zagotavljajo dodatno zaščito pred prelivanjem pufrov v obliki nedosegljivih skladov in naključnega dodeljevanja naslovnega prostora (ASLR). Neizvršljivo zlaganje - Preprečevanje podatkov (DEP) - označuje sklade, v nekaterih primerih pa tudi druge strukture kot področja, kjer se koda ne bo izvajala. To pomeni, da napadalec ne more izvesti kode za izkoriščanje v skladu in počakati na njegovo uspešno izvedbo. Preden popravite prelivanje medpomnilnika, ga razpakirajte na računalnik ASLR. Zasnovan je bil za zaščito pred programiranimi vračanji kot obvozno pot do neunovljivih skladov, kjer se obstoječi odrezki kode združijo v verigo na podlagi pristranskosti njihovih naslovov. Deluje tako, da randomizira spominske površine struktur, tako da je njihovo premikanje težje opredeliti. Če je ta zaščita obstajala v poznih osemdesetih, bi se lahko preprečil črv Morris. To je posledica dejstva, da je delno deloval s polnjenjem medpomnilnika v UNIX kodo izkoriščanja prstov in jo nato prelival, da bi spremenil povratni naslov in pokazal na poln vmesni pomnilnik. ASLR in DEP otežita natančno definiranje naslova, ki ga je treba določiti, medtem ko je to območje pomnilnika povsem neprimerno. Občasno ranljivost zdrsne skozi razpoke, ki so odprte za prelivanje medpomnilnika, kljub prisotnosti kontrol na ravni razvoja, prevajalniku ali operacijskem sistemu.

Analiza statične pokritosti

V primeru prekoračitve blažilnika obstajata dve kritični nalogi. Najprej morate identificirati ranljivost inspremenite osnovo kode, da bi rešili težavo. Drugič, zagotovitev zamenjave vseh različic kode preobremenitve pufra. V idealnem primeru se bo to začelo s samodejnim posodabljanjem vseh sistemov, povezanih z internetom. Ne moremo domnevati, da bo takšna posodobitev zagotovila zadostno pokritost. Organizacije ali posamezniki lahko programsko opremo uporabljajo v sistemih z omejenim dostopom do interneta, ki zahtevajo ročne posodobitve. To pomeni, da morajo biti posodobitvene novice razdeljene med vse skrbnike, ki jih lahko uporabljajo, in da mora biti popravek takoj na voljo za prenos. Ustvarjanje in distribucija popravkov se izvaja čim bližje odkrivanju ranljivosti, kar zmanjšuje čas ranljivosti. Zaradi uporabe varnih funkcij obdelave medpomnilnika in ustreznih varnostnih funkcij prevajalnika in operacijskega sistema lahko ustvarite zanesljivo zaščito pred prelivnim pomnilnikom. V luči teh korakov je dosledno odkrivanje pomanjkljivosti odločilen korak k preprečevanju izkoriščanja. Združevanje izvornih nizov v iskanju potencialnih groženj je lahko izčrpno. Poleg tega vedno obstaja možnost, da človeške oči zamudijo nekaj pomembnega. Za zagotavljanje kakovosti kode se uporabljajo orodja za statično analizo, ki so posebej zasnovana za odkrivanje ranljivosti med razvojem. Statična analiza pokritosti določa "rdeče oznake" za potencialne prelome med pufrom. Nato se obravnavajo in popravijo ločeno, da ne bi iskali v bazi podatkov. Ta orodja so vV povezavi z rednimi preverjanji in znanjem, kako odpraviti prelitje, lahko prepoznamo in odpravimo veliko večino pomanjkljivosti, preden se programska oprema zaključi.

Izvajanje korenskih napadov

Napake pri kodiranju so običajno vzrok za prelivanje medpomnilnika. Pogoste napake pri razvoju aplikacij, ki lahko privedejo do tega, so nezmožnost dodeljevanja dovolj velikih blažilnikov in pomanjkanje mehanizma za preverjanje teh težav. Takšne napake so še posebej problematične v jezikih C /C ++, ki nimajo vgrajene zaščite za prelivanje in so pogosto predmet napadov prelivanja medpomnilnika. V nekaterih primerih napadalec vnese zlonamerno kodo v pomnilnik, ki je bil poškodovan zaradi prekoračitve medpomnilnika. V drugih primerih preprosto uporabite prednosti poškodbe sosednjega spomina. Na primer, program, ki zahteva uporabniško geslo za dostop do sistema. Pravilno geslo v spodnji kodi zagotavlja korenske pravice. Če geslo ni pravilno, program ne daje uporabniških pravic.
V zgornjem primeru program uporabniku s skrbniškimi pravicami poda celo, če je vnesel napačno geslo. V tem primeru napadalec zagotovi vhod, katerega dolžina je večja, kot jo lahko doda vmesni pomnilnik, ustvarjanje prelivov, prepisovanje pomnilnika celega števila. Zato, kljub napačnemu geslu, vrednost pass ne postane nič, napadalec pa dobi korenske pravice.

Napad s časovnim pasom

Odbojnik je začasno območje shranjevanja. Če aplikacija ali sistemski postopek postavi več podatkov, kot je bilododeljenih za shranjevanje, dodatnih prelivov. To povzroča, da nekateri od njih puščajo v druge pufre, poškodujejo ali zamenjajo podatke. Pri napadu s prelivanjem dodatni podatki vsebujejo posebna navodila za dejanja, ki jih je storil heker ali zlonamerni uporabnik, na primer povzročajo odgovor, ki poškoduje datoteke, spreminja podatke ali razkriva osebne podatke. Napadalec za izkoriščanje programa, ki pričakuje vnos uporabnika, uporablja prelivanje. Obstajata dve vrsti prelivnega medpomnilnika: stack in heap. Stacked paketi so težko izvesti in najmanj skupni, medtem ko napad na aplikacijo, polnjenje prostora rezerviranega za program. Stack je pomnilniški prostor, ki se uporablja za shranjevanje uporabniškega vnosa. Takšen preliv je pogostejši pri napadalcu, ki uporablja programe. Sodobni prevajalniki ponavadi omogočajo preverjanje prelivanja med prevajanjem /prevajanjem, vendar je med izvajanjem precej težko preveriti to težavo brez dodatnega mehanizma za zaščito pri obdelavi izjem.
Različice programa:
  • Vnesite: 12345678 (8 bajtov), ​​program deluje brez zrušitev.
  • Vnesite: 123456789 (9 bajtov), ​​prikaže se sporočilo "Napaka segmentacije", program je zaključen.
  • Ranljivost obstaja zaradi prekoračitve, če uporabniški vnos argv presega 8 bajtov. Za 32-bitni sistem (4 bajte) zapolnijo pomnilnik z dvojno besedo (32 bitov). Velikost znakov je 1 bajt, zato, če zahtevate vmesnik z 5 bajti,sistem bo dodelil 2 dvojni besedi (8 bajtov). Zato, ko vnesete več kot 8 bajtov, bo vmesnik poln. Podobne standardne značilnosti, ki so tehnično manj ranljive, obstajajo. Na primer strncpy (), strncat () in memcpy (). Težava pri teh značilnostih je v tem, da je odgovornost za določanje velikosti medpomnilnika le programer, ne pa prevajalnik. Vsak programer C /C ++ mora vedeti, da je problem pred začetkom kodiranja. Veliko ustvarjenih težav je v večini primerov mogoče zaščititi pred prelivanjem.

    Nevarnosti v C /C ++

    Uporabniki C se morajo izogibati uporabi nevarnih funkcij, ki ne preverjajo meje, če niso prepričane, da meje ne bodo presežene. Funkcije, ki se jim je treba v večini primerov izogniti, da zagotovijo zaščito, vključujejo funkcije strcpy. Zamenjati jih je treba s funkcijami, kot je strncpy. Izogibajte se uporabi funkcije strlen, če je uporabnik prepričan, da bo najden končni simbol NIL. Družina scanf (): scanf
    , fscanf
    , sscanf
    , vscanf
    , vsscanf
    in vfscanf
    niso varni za uporabo, se ne uporablja za pošiljanje podatkov nizu brez nadzora nad največjo vrednostjo. Dolžina "format% s" je še posebej pogosta napaka. Uradno je, da snprintf () ni standardna značilnost klasifikacije C ISO 1990. Ti sistemi ne ščitijo pred prenapetostjo pufra, ampak povzročajo neposredno delovanje sprinta. Znano je, da trenutna različica Linuxa snprintf deluje pravilno, se pravi, da ustreza nastavljeni omejitvi. Izračunana vrednost snprintf () se prav tako spreminja. Različica 2 specifikacije Unix (SUS) in standard C99 sta različna v tem, da vrne snprintf (). NekajVerzije snprintf ne zagotavljajo, da se bo niz končal v NIL, in če je niz predolg, ne bo vseboval NIL. Knjižnica glib ima g_snprintf () s zaporedno semantiko vračanja, vedno konča z NIL in, kar je najpomembneje, vedno upošteva dolžino medpomnilnika.

    Preliv odbojnika komunikacijskih vrat

    \ t
    Včasih serijska vrata poročajo o prelivnem medpomnilniku. To težavo lahko povzroči več dejavnikov. Ti vključujejo hitrost računalnika, hitrost prenosa podatkov, velikost serijskih vrat FIFO in velikost FIFO naprave, ki prenaša podatke v serijska vrata. Upravljanje pretoka bo počakalo, da se v pufru prikaže določeno število bajtov, preden procesor pošlje sporočilo ali signal drugi napravi, da ustavi prenos. Pri višjih hitrostih prenosa bodo zaporedna vrata prejela več bajtov od trenutka, ko je dosežen nadzor pretoka vmesnega pomnilnika in se naprava ustavi. Ti dodatni bajti bodo večji, če proces visoke prioritete nadzoruje ciljni procesor v realnem času. Ker ima prekoračitev medpomnilnika komunikacijskih vrat večjo prednost kot prekinitev VISA, procesor ne bo ukrepal, dokler se ne zaključi v realnem času. Privzeta nastavitev VISA in Windows za 16-bajtni FIFO sta 14 bajtov, v FIFO pa 2 bajta, ko naprava poskuša poslati sporočilo iz vira. Pri višjih hitrostih na počasnih računalnikih je mogoče dobiti več kot 4 bajte v času, koserijska vrata vprašajo procesor in pošljejo signal o prekinitvi prenosa. Če želite odpraviti težavo, ko je v sistemu Windows 10 zaznan prekoračitev medpomnilnika, morate odpreti upravitelja naprav. Nato poiščite COM vrata, za katera so nastavitve spremenjene in odprite lastnosti. Nato kliknite zavihek "Napredno", pojavil se bo drsnik, ki spremeni velikost preliva odložišča, tako da UART hitreje preklopi na upravljanje pretoka. Privzeta vrednost je v večini primerov dovolj. Če pa pride do napake pri prelivnem vmesnem pomnilniku, se vrednost zmanjša. To bo povzročilo, da bo v procesor ponovnega poskusa UART poslanih več prekinitev.

    Metode za varen razvoj

    Tehnike varnega razvoja vključujejo rutinsko testiranje za odkrivanje in odpravljanje prelivanja. Najbolj zanesljiv način, da se prepreči ali prepreči uporaba samodejne zaščite jezika. Druga rešitev je preverjanje mej med izvajanjem, ki preprečuje prelivanje, tako da samodejno preveri, ali so podatki, shranjeni v medpomnilniku, v dovoljenih mejah. Veracode zazna ranljivosti kode, kot so prelivni pufri, zato jih razvijalci odpravijo, preden se uporabijo. Patentirana tehnologija Veracode za binarno statično varnostno testiranje varnosti (SAST) je edinstvena v industriji, jo analizira, vključno z odprtokodnimi komponentami in komponentami drugih proizvajalcev, brez dostopa do njih. SAST dopolnjuje simulacijo groženj in preglede kode s strani razvijalcev hitreje in z manj stroškov.odkrivanje napak in opustitev kode zaradi avtomatizacije. Praviloma se izvaja v zgodnjih fazah življenjskega cikla razvoja programske opreme, saj je lažje in ceneje odpraviti težave, preden nadaljujejo s proizvodnjo. SAST zazna kritične ranljivosti, kot so implementacija SQL, navzkrižno skriptiranje (XSS), napaka pri prenašanju medpomnilnika, stanje nepredelane napake in potencialni vogali. Poleg tega SAST binarna tehnologija zagotavlja koristne informacije, ki določajo prioritete glede na resnost in zagotavlja podroben priročnik za popravke. Ranljivost prekoračitve blažilnikov obstaja že skoraj tri desetletja, vendar je še vedno obremenjujoča. Hekerji z vsega sveta ga še vedno obravnavajo kot svojo taktiko privzeto zaradi velikega števila odzivnih spletnih aplikacij. Razvijalci in programerji si močno prizadevajo za boj proti tej nadlogi IT-tehnologij, ki izumlja nove in nove načine. Glavna ideja zadnjega pristopa je implementacija orodja za popravke, ki omogoča izdelavo več kopij povratnih naslovov v skladu, nato pa poleg števila naključno izbere lokacijo vseh kopij. Vsi podvojeni podatki se posodabljajo in preverjajo vzporedno, tako da vsa odstopanja med njimi označujejo poskus napada in povzročajo izjemo.

    Sorodne publikacije