Pretečenie vyrovnávacej pamäte: príčiny, efektívne metódy riešenia problému a potrebná ochrana

Všetci programátori si uvedomujú potenciálnu hrozbu pretečenia vyrovnávacej pamäte vo svojich programoch. Existuje mnoho hrozieb, ktoré sú s ňou spojené, a to ako v novom aj starom, bez ohľadu na počet vykonaných opráv. Hackeri môžu túto chybu použiť tým, že implementujú kód, ktorý je špeciálne navrhnutý tak, aby spôsobil pretečenie pôvodnej časti dátovej sady, a potom napíšte zvyšok na pamäťovú adresu priľahlej k pretečeniu. Údaje môžu obsahovať spustiteľný kód, ktorý umožňuje útočníkom spustiť väčšie a zložitejšie programy alebo im poskytnúť prístup do systému. Chyby sú veľmi ťažké nájsť a opraviť, pretože kód pre kód pozostáva z miliónov riadkov. Oprava týchto chýb je pomerne komplikovaná a na druhej strane aj náchylná k chybám, čo komplikuje proces eliminácie.


Definícia pretečenia zásobníka

Pred hľadaním pretečenia potrebujete vedieť, čo to predstavuje. Ako naznačuje názov, tieto zraniteľné miesta sa týkajú vyrovnávacích pamätí alebo alokácie pamäte v jazykoch, ktoré poskytujú priamy prístup na čítanie a písanie na nižšej úrovni. Keď používate jazyky C a Assembler, čítanie alebo písanie takýchto distribúcií neznamená automatické hraničné kontroly. V súvislosti s tým, ak je v tejto aplikácii zistené pretečenie vyrovnávacej pamäte, nie je žiadna kontrola možnosti umiestnenia počtu bajtov v uvažovanej vyrovnávacej pamäti. V takýchto prípadoch program môže "prekročiť" svoju kapacitu. To vedie k tomu, že údajezaznamenané po naplnení, prepísať obsah nasledujúcich adresy stohu a čítať navyše. Pretečenie sa môže vyskytnúť neúmyselne kvôli chybám používateľov.


Stáva sa to, že je spôsobené tým, že škodlivá entita odošle starostlivo vytvorený škodlivý softvér programu, ktorý sa potom pokúsi udržať ho v neprimeranej vyrovnávacej pamäti. Ak v tejto aplikácii dôjde k prekonaniu pretečenia vyrovnávacej pamäte, nadbytočné údaje sa ukladajú do susediacich a nahradia všetky dostupné údaje. Zvyčajne obsahujú bod návratu pre využívanú funkciu, adresu, pod ktorou má proces pokračovať. Útočník môže nastaviť nové hodnoty na označenie zvolenej adresy. Útočník zvyčajne nastaví nové hodnoty, aby uviedol, kde je užitočné zaťaženie. Tým sa zmení spôsob spustenia procesu a okamžité prenesenie správy škodlivého kódu. Použitie pretečenia vyrovnávacej pamäte umožňuje útočníkovi monitorovať alebo ukončiť proces alebo upraviť jeho interné premenné. Toto porušenie sa odohráva v 25 najzávažnejších softvérových chybách na svete (2009 CWE /SANS Top 25 najnebezpečnejších programovacích chýb) a je definované ako CWE-120 v prekladovom slovníku slabých systémových umiestnení. Napriek tomu, že sú dobre študované, aj naďalej poškodzujú populárne programy.

Jednoduchý vektor vyrovnávacej pamäte

Pri práci so zdrojovým kódom je potrebné venovať osobitnú pozornosť tomu, kde sa používajú vyrovnávacie pamäte a modifikovať ich. Zvlášť pozoruhodné sú funkcie súvisiace so záverom poskytnutým používateľom aleboiný externý zdroj, pretože poskytujú jednoduchý vektor na použitie, keď je zistené pretečenie vyrovnávacej pamäte. Napríklad, keď užívateľ bude klásť otázku "áno" alebo "nie", je vhodné, aby užívateľské dáta reťazec v malej vyrovnávacia pamäť pre reťazec "Áno", ako je uvedené v nasledujúcom príklade.
Pri pohľade na kód je jasné, že hraničná kontrola sa nevykonáva. Ak používateľ zadá "možný", potom program zlyhá úlohu a nepýta sa mu odpoveď, ktorá je napísaná v vyrovnávacej pamäti bez ohľadu na jej dĺžku. V tomto príklade, pretože používateľ odpoveď je, že iba deklarované hodnoty premennej v zásobníku bude hodnota spiatočnú adresu alebo umiestnenie v pamäti, kde sa program vráti po vykonaní pýtať otázka. To znamená, že v prípade, že užívateľ bude predstaví štyri bajtov dát, čo je dosť na príkaz pretečeniu vyrovnávacej pamäte klienta je platné spiatočná adresa byť zmenený. To spôsobí, že program ukončiť funkciu na inom mieste kódu, než sa pôvodne predpokladalo, a môže viesť k tomu, čo sa bude správať nebezpečná a nechcená. V prípade, že prvým krokom k detekcii pretečeniu zásobníka v zdrojovom kóde mať pochopenie toho, ako fungujú, druhým krokom je preskúmať externý vstup a manipuláciu vyrovnávacej pamäte, tretím krokom je potreba vidieť, aké funkcie sú náchylné k tomuto problému a ktorá môže pôsobiť ako "červené vlajky ". Funkcia get je skvelá na zaznamenávanie za poskytnutú vyrovnávaciu pamäť. Táto kvalita sa v skutočnosti rozširuje na celú rodinu súvisiacich funkcií vrátane strcpy, strcmp a printf /sprintf, kdekoľvekjednou z týchto funkcií je zraniteľnosť pretečenia.

Vymazanie z kódovej databázy

Ak sa vo zdrojovom kóde nachádza pretečenie vyrovnávacej pamäte, bude potrebné dôsledné odstránenie z databázy. Aby ste to dosiahli, musíte byť oboznámení s bezpečnými spôsobmi práce. Najjednoduchší spôsob, ako zabrániť týmto zraniteľným miestam, je používať jazyk, ktorý im neumožňuje. Jazyk C má tieto chyby spôsobené priamym prístupom k pamäti a nedostatkom prísneho písania objektov. Jazyky, ktoré nezdieľajú tieto aspekty, zvyčajne nie sú k dispozícii. Toto sú Java, Python a .NET spolu s ďalšími jazykmi a platformami, ktoré nevyžadujú špeciálne kontroly alebo zmeny. Samozrejme, nemôžete úplne zmeniť vývojový jazyk. V tomto prípade sa používajú bezpečné metódy na prácu s pretečením vyrovnávacej pamäte príkazov. V prípade funkcií spracovania liniek bolo veľa diskusií o tom, ktoré metódy sú k dispozícii, ktoré sú bezpečné na použitie a ktorým je potrebné sa vyhnúť. Funkcie strcpy a strcat skopírujú reťazec do vyrovnávacej pamäte a navzájom si pridávajú obsah. Tieto dve metódy ukazujú nebezpečné správanie, pretože nekontrolujú hranice cieľovej vyrovnávacej pamäte a nevykonávajú záznam vonku, ak je na to dostatok bajtov.

Alternatívna ochrana

Jednou z často navrhovaných alternatív sú súvisiace verzie, ktoré sú napísané v maximálnej veľkosti cieľového vyrovnávacej pamäte. Na prvý pohľad to vyzerá ako ideálne riešenie. Bohužiaľ, tieto funkcie majú malú nuansu, ktorá spôsobuje problémy. Po dosiahnutí limitu, ak nie je posledný znak umiestnený v poslednom byte, pri čítaní vyrovnávacej pamäte sú vážne chyby.

V tomtoZjednodušený príklad ukazuje nebezpečenstvo reťazcov, nekončí sa nulou. Keď je foo umiestnené do normálnej vyrovnávacej pamäte, končí nula, pretože má ďalší priestor. Toto je najlepšia možnosť pre vývoj udalostí. Ak sa bajty v pretečenom zásobníku na zásobníku nachádzajú v vyrovnávacej pamäti iných znakov alebo v inom tlačovom reťazci, funkcia tlače bude pokračovať v čítaní, kým sa nedosiahne koncový znak tohto riadku. Nevýhodou je, že jazyk C neposkytuje štandardnú a bezpečnú alternatívu k týmto funkciám. Napriek tomu je pozitívna - dostupnosť niekoľkých implementácií pre konkrétnu platformu. OpenBSD poskytuje strlcpy a strlcat, ktoré fungujú podobne ako strn, okrem toho, že skracujú reťazec o jeden znak skôr, aby uvoľnili priestor pre nulovú terminátor. Podobne spoločnosť Microsoft poskytuje vlastnú bezpečnú implementáciu často používaných funkcií spracovania reťazcov: strcpy_s, strcat_s a sprintf_s. Používanie uvedených bezpečných alternatív je najlepšie. Ak to nie je možné, pri spracovaní vyrovnávacích pamätí reťazcov vykonajte manuálnu kontrolu hraníc a nulové dokončenie.

Zraniteľnosť kompilácie

V prípade, že nebezpečná funkcia nechá otvorenú možnosť pretečenia vyrovnávacej pamäte C, nie je všetko stratené. Keď spustíte program, kompilátory často vytvárajú náhodné hodnoty, známe ako kanárske kanáliky, a umiestňujú ich do stohu, takže predstavujú nebezpečenstvo. Kontrola hodnoty kanálu vo vzťahu k jeho pôvodnej hodnote môže určiť, či došlo k pretečeniu vyrovnávacej pamäte systému Windows. Ak bola hodnota zmenená, program sa zatvorí alebo prejde do stavu chyby, ale nie potenciálnezmenená adresa návratu.
Niektoré moderné operačné systémy poskytujú dodatočnú ochranu proti pretečeniu vyrovnávacích pamätí vo forme nedosiahnuteľných stohov a náhodného priradenia adresného priestoru (ASLR). Nevykonateľné stohovanie - prevencia údajov (DEP) - označuje zásobníky a v niektorých prípadoch iné štruktúry ako oblasti, kde kód nebude vykonaný. To znamená, že útočník nemôže implementovať kód zneužitia v zásobníku a čakať na jeho úspešné vykonanie. Pred tým, ako opravíte pretečenie vyrovnávacej pamäte, rozbalte ho na počítač ASLR. Bol navrhnutý tak, aby chránil pred naprogramovanými vráteniami ako obtoková cesta k nerealizovateľným zásobníkom, kde sú existujúce útržky kódu spojené v reťazci na základe predpojatosti ich adries. Funguje na základe náhodného výberu pamäťových oblastí štruktúr, takže je ťažšie ich presun. Ak by táto ochrana existovala koncom osemdesiatych rokov, mohol by sa zabrániť tomu, aby bol červ Morris. Je to spôsobené tým, že čiastočne fungovala vyplnením vyrovnávacej pamäte v kóde zneužitia prstov UNIXom a následným pretečením, aby sa zmenila návratová adresa a smerovala na plnú vyrovnávaciu pamäť. ASLR a DEP komplikujú presnú definíciu adresy, ktorá sa má špecifikovať, pričom táto pamäťová oblasť je úplne mimo. Príležitostne zraniteľnosť prechádza cez trhliny, ktoré sú otvorené pre pretekanie vyrovnávacej pamäte napriek prítomnosti kontrol na úrovni vývoja, kompilátora alebo operačného systému.

Analýza statického pokrytia

V situácii pretečenia vyrovnávacej pamäte existujú dve dôležité úlohy. Najprv musíte zistiť zraniteľnosť azmeniť základňu kódu, aby ste vyriešili problém. Po druhé, zabezpečte výmenu všetkých verzií kódu napadnutia pretečenia vyrovnávacej pamäte. V ideálnom prípade sa to začne automatickou aktualizáciou všetkých systémov pripojených k internetu. Nemožno predpokladať, že takáto aktualizácia poskytne dostatočné pokrytie. Organizácie alebo jednotlivci môžu používať softvér na systémoch s obmedzeným prístupom na internet, čo si vyžaduje manuálne aktualizácie. Znamená to, že aktualizačné správy musia byť distribuované medzi všetkými administrátormi, ktorí ich môžu používať, a náplasť by mala byť k dispozícii na prevzatie. Vytváranie a distribúcia korekcií sa vykonáva čo najbližšie k detekcii zraniteľnosti, čo minimalizuje čas zraniteľnosti. Vďaka použitiu funkcií spracovania bezpečných vyrovnávacích pamätí a zodpovedajúcich bezpečnostných funkcií kompilátora a operačného systému môžete vytvoriť spoľahlivú ochranu proti prepadovému bufferu. Vo svetle týchto krokov je dôsledné zistenie nedostatkov rozhodujúcim krokom na zabránenie zneužívania. Kombinácia zdrojových reťazcov pri hľadaní potenciálnych hrozieb môže byť vyčerpávajúca. Okrem toho existuje vždy možnosť, že ľudské oči môžu stratiť niečo dôležité. Nástroje statickej analýzy sa používajú na zabezpečenie kvality kódu, boli špeciálne navrhnuté na zistenie zraniteľnosti počas vývoja. Analýza statického pokrytia nastavuje "červené štítky" pre prípadné pretečenie vyrovnávacej pamäte. Potom sa s nimi zaobchádza a upravuje samostatne, aby sa v databáze nehľadali. Tieto nástroje sú vv kombinácii s pravidelnými kontrolami a znalosťami o tom, ako odstrániť pretečenie, vám umožnia identifikovať a odstrániť väčšinu nedostatkov pred dokončením softvéru.

Vykonávanie koreňových útokov

Chyby kódovania sú zvyčajne príčinou pretečenia vyrovnávacej pamäte. Medzi bežné chyby pri vývoji aplikácií, ktoré môžu viesť k nemu, patrí neschopnosť prideliť dostatočne veľké nárazníky a nedostatok mechanizmu na kontrolu týchto problémov. Takéto chyby sú obzvlášť problematické v jazykoch C /C ++, ktoré nemajú zabudovanú ochranu proti pretečeniu a často sú vystavené útokom pretečenia vyrovnávacej pamäte. V niektorých prípadoch útočník zavádza škodlivý kód do pamäte, ktorá bola poškodená pretečením vyrovnávacej pamäte. V iných prípadoch jednoducho použite výhody poškodenia susednej pamäte. Napríklad program, ktorý požaduje heslo používateľa, aby mu umožnil prístup do systému. V nižšie uvedenom kóde správne heslo obsahuje oprávnenia root. Ak je heslo nesprávne, program neposkytuje používateľské privilégiá.
Vo vyššie uvedenom príklade program poskytuje používateľovi práva na root, aj keď zadal nesprávne heslo. V tomto prípade útočník poskytuje vstup, ktorého dĺžka je väčšia ako vyrovnávacia pamäť, môže vytvárať preteky a prepísať pamäť celočíselného prechodu. Preto napriek nesprávnemu zadaniu hesla sa hodnota prechodu stáva nenulovou a útočník získa koreňové práva.

Útok v časovom pásme

Buffer je dočasný úložný priestor. Keď aplikácia alebo systémový proces ukladá viac údajov ako bolopridelené na ukladanie, ďalšie preteky. To spôsobí, že niektoré z nich môžu uniknúť do iných vyrovnávacích pamätí, poškodiť alebo nahradiť údaje. Pri útoku s pretekaním obsahuje ďalšie údaje špeciálne pokyny pre akcie, ktorých sa dopustil hacker alebo škodlivý používateľ, napríklad spôsobujú odpoveď, ktorá poškodzuje súbory, upravuje údaje alebo zverejňuje osobné informácie. Útočník využíva zneužitie pretečenia na použitie programu, ktorý očakáva vstup od používateľa. Existujú dva typy vyrovnávacej pamäte: zásobník a haldy. Naskladané balíky sa ťažko realizujú a najčastejšie, zatiaľ čo útočia na aplikáciu, plniaci priestor vyhradený pre program. Stack je pamäťový priestor, ktorý sa používa na ukladanie užívateľského vstupu. Takýto pretek je bežnejší v prípade útočníka, ktorý používa programy. Moderné kompilátory zvyčajne poskytujú schopnosť kontrolovať pretečenie počas kompilácie /kompilácie, ale počas vykonávania je pomerne ťažké tento problém skontrolovať bez akéhokoľvek ďalšieho ochranného mechanizmu na spracovanie výnimiek.
Varianty programu:
  • Zadajte: 12345678 (8 bajtov), ​​program funguje bez zlyhania.
  • Zadajte: 123456789 (9 bajtov), ​​zobrazí sa správa "Chyba segmentácie", program sa dokončí.
  • Zraniteľnosť existuje kvôli pretečeniu v prípade, že vstup pre užívateľa argv prekročí 8 bajtov. Pri 32-bitovom systéme (4 bajty) zapĺňajú pamäť dvojitým slovom (32 bitov). Veľkosť znakov je 1 bajt, takže ak požadujete vyrovnávaciu pamäť s 5 bajtami,systém pridelí 2 dvojité slová (8 bajtov). Preto keď zadáte viac ako 8 bajtov, vyrovnávacia pamäť bude plná. Podobné štandardné funkcie, ktoré sú technicky menej zraniteľné, existujú. Napríklad strncpy (), strnke () a memcpy (). Problém s týmito funkciami je, že zodpovednosť za určenie veľkosti vyrovnávacej pamäte je programátor a nie prekladač. Každý programátor C /C ++ by mal problém pred spustením kódovania poznať. Mnoho problémov generovaných vo väčšine prípadov môže byť chránené pred pretečením.

    Nebezpečenstvá v C /C ++

    C Užívatelia by sa mali vyhnúť sa používaniu nebezpečných funkcií, ktoré nekontrolujú hranice, ak nie ste istí, aké sú hranice nie sú prekročené. Funkcie, ktoré sa vo väčšine prípadov treba vyhnúť pri poskytovaní ochrany, zahŕňajú funkcie typu strcpy. Mali by byť nahradené funkciami ako strncpy. Vyhnite sa používaniu funkcie strlen, ak je používateľ istý, že bude nájdený konečný symbol NIL. Rodina scanf (): scanf
    , fscanf
    , sscanf
    , vscanf
    , vsscanf
    a vfscanf
    - nebezpečné pre použitie, to nie je používaný pre odosielanie dát v rade bez kontrolného maxima dĺžka, "formát% s" je obzvlášť časté zlyhanie. Oficiálne funkcie snprintf () nie je štandardná C klasifikácie ISO 1990. Tieto systémy neposkytujú ochranu proti pretečeniu vyrovnávacej pamäti, že stačí zavolať sprintf priamo. Je známe, že súčasná verzia Linux snprintf funguje správne, že je v skutočnosti pozorovaná limit. Vypočítaná hodnota snprintf () sa tiež líši. Verzia 2 špecifikácie Unix (SUS) a štandard C99 sú odlišné v tom, že vracia snprintf (). niektoríVerzie snprintf nezaručujú, že reťazec skončí v NIL a ak je reťazec príliš dlhý, nebude obsahovať NIL vôbec. Knižnica glib má g_snprintf () s postupnou sémantikou návratu, vždy končí NIL a čo je najdôležitejšie, vždy berie do úvahy dĺžku vyrovnávacej pamäte.

    Pretečenie vyrovnávacej pamäte komunikačného portu

    Niekedy sériový port hlási prepadový buffer. Tento problém môže byť spôsobený niekoľkými faktormi. Patria k nim rýchlosť počítača, rýchlosť prenosu dát, veľkosť sériového portu FIFO a veľkosť FIFO zariadenia, ktoré prenáša dáta na sériový port. Správa toku čaká, kým sa v vyrovnávacej pamäti nezobrazí určitý počet bajtov, kým procesor pošle správu alebo signál na iné zariadenie, aby zastavil prenos. Pri vyšších prenosových rýchlostiach bude sériový port prijímať niekoľko bajtov od okamihu dosiahnutia úrovne riadenia prietoku vyrovnávacej pamäte a zastavenia zariadenia. Tieto ďalšie bajty budú väčšie, ak proces s vysokou prioritou riadi objektový procesor v reálnom čase. Keďže pretečenie vyrovnávacej pamäte komunikačného portu má vyššiu prioritu než prerušenie VISA, procesor nebude robiť žiadne kroky, kým nebude dokončený v reálnom čase. Predvolené nastavenia VISA a Windows pre 16bajtové FIFO sú 14 bajtov a 2 FBO ponechávajú 2 bajty, keď sa zariadenie pokúša odoslať správu zo zdroja. Pri vyšších rýchlostiach na pomalých počítačoch je možné získať viac ako 4 bajty narazsériový port požiada procesor a vysiela signál o ukončení prenosu. Ak chcete vyriešiť problém, keď je v systéme Windows 10 zistené pretečenie zásobníka vyrovnávacej pamäte, musíte otvoriť Správcu zariadení. Potom nájdite port COM, pre ktorý sa zmenili nastavenia, a otvorte vlastnosti. Potom kliknite na záložku "Rozšírené" a objaví sa posuvník, ktorý zmení veľkosť preplnenia schránky, takže UART rýchlejšie zapne správu streamov. Predvolená hodnota vo väčšine prípadov je dosť. Ak sa však vyskytne chyba pretečenia vyrovnávacej pamäte, hodnota sa zníži. To spôsobí, že sa do procesora UART zopakujú ďalšie prerušenia.

    Metódy bezpečného vývoja

    Bezpečné vývojové techniky zahŕňajú rutinné testovanie na zistenie a odstránenie pretečenia. Najspoľahlivejší spôsob, ako tomu zabrániť alebo zabrániť tomu, aby používal automatickú ochranu jazyka. Ostatné úpravy - kontrola hraníc za behu, ktorý zabraňuje pretekania tým, že automaticky kontroluje, či údaje uložené vo vyrovnávacej pamäti, sú v prijateľných medziach. Veracode zisťuje zraniteľnosť kódu, napríklad pretečenú vyrovnávaciu pamäť, takže vývojári ich odstránia skôr, ako sa použijú. Unikátna patentovaná technológia v oblasti testovanie zabezpečenia statické binárnych aplikácií (SAST) Veracode ho analyzuje, vrátane zložiek z open source a treťou stranou, aby bolo nutné sa k nim dostať. Spoločnosť SAST dopĺňa simuláciu hrozieb a kódových recenzií vývojármi rýchlejšie as nižším nákladom.zisťovanie chýb a opomenutí v kóde v dôsledku automatizácie. Spravidla beží v počiatočnom štádiu životného cyklu vývoja softvéru, pretože je ľahšie a lacnejšie riešiť problémy pred tým, ako začne výrobné nasadenie. SAST zistí kritické zraniteľnosti, ako je implementácia SQL, skriptovanie medzi sieťami (XSS), chyba pretečenia vyrovnávacej pamäte, stav nespracovaných chýb a potenciálne rohy. Okrem toho binárna technológia SAST poskytuje užitočné informácie, ktoré určujú priority v závislosti od závažnosti a poskytujú podrobnú korekčnú príručku. Zraniteľnosť pretečenia vyrovnávacej pamäte existovala takmer 3 desaťročia, ale stále je zaťažujúca. Hackeri z celého sveta ho naďalej považujú za svoju taktiku z dôvodu obrovského počtu citlivých webových aplikácií. Vývojári a programátori vynakladajú obrovské úsilie na boj s touto metódou IT technológií, vynájdením nových a nových spôsobov. Hlavnou myšlienkou posledného prístupu je implementovať nástroj na opravu, ktorý vytvára viac kópií spätných adries v zásobníku a potom náhodne rozmiestňuje miesto všetkých kópií spolu s číslom. Všetky duplikáty sú aktualizované a kontrolované paralelne, takže akékoľvek nezrovnalosti medzi nimi naznačujú pokus o útok a spôsobujú výnimku.

    Súvisiace publikácie