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

Všetci programátori sú si vedomí potenciálnej hrozby pretečenia vyrovnávacej pamäte vo svojich programoch. S tým je spojených veľa hrozieb, a to v novom aj starom softvéri, bez ohľadu na počet vykonaných opráv. Útočníci môžu využiť takúto chybu implementáciou kódu špeciálne navrhnutého tak, aby spôsobil pretečenie počiatočnej časti súboru údajov, a potom zvyšné zapíšu na adresu pamäte susediacu s pretečenou.

Údaje môžu obsahovať spustiteľný kód, ktorý útočníkom umožní spúšťať väčšie a zložitejšie programy alebo im udeliť prístup do systému. Chybu je veľmi ťažké nájsť a opraviť, pretože softvérový kód pozostáva z miliónov riadkov. Oprava týchto chýb je pomerne komplikovaná a na druhej strane aj náchylná na chyby, čo komplikuje proces eliminácie.

Detekcia pretečenia vyrovnávacej pamäte

Detekcia pretečenia vyrovnávacej pamäte

Pred hľadaním pretečenia, , čo potrebujete vedieť, čo to je. Ako už názov napovedá, tieto chyby zabezpečenia súvisia s vyrovnávacími pamäťami alebo alokáciou pamäte v jazykoch, ktoré poskytujú priamy prístup na čítanie a zápis na nízkej úrovni.

Pri používaní jazykov C a Assembler čítanie alebo zápis takýchto distribúcií nezahŕňa automatickú kontrolu hraníc. Preto, ak sa v tejto aplikácii zistí pretečenie medzipamäte zásobníka, neexistuje žiadna kontrola možnosti umiestnenia počtu bajtov do príslušnej medzipamäte. V takýchto prípadoch môže program "pretekať" svoju kapacitu. To vedie k tomu, že údaje napísané po vyplnení prepíšu obsah nasledujúcich adries v zásobníku a prečítajú ďalšie. K pretečeniu môže dôjsť neúmyselne v dôsledku chýb používateľa.

Stáva sa, že je to spôsobené tým, že škodlivý subjekt pošle starostlivo vytvorený škodlivý vstup do programu, ktorý sa ho potom pokúsi uložiť do nedostatočnej vyrovnávacej pamäte. Ak sa v tejto aplikácii zistí pretečenie medzipamäte zásobníka, prebytočné údaje sa zapíšu do susedného, kde sa prepíšu všetky existujúce údaje.

Zvyčajne obsahujú ukazovateľ na návrat prevádzkovanej funkcie - adresu, na ktorej by mal proces pokračovať. Útočník môže nastaviť nové hodnoty tak, aby ukazovali na adresu podľa vlastného výberu. Útočník zvyčajne nastaví nové hodnoty na označenie miesta, kde sa nachádza užitočné zaťaženie. Týmto sa zmení cesta vykonávania procesu a okamžite sa prenesie kontrola na škodlivý kód.

Použitie pretečenia vyrovnávacej pamäte umožňuje útočníkovi riadiť alebo ukončiť proces alebo zmeniť jeho interné premenné. Toto porušenie sa radí medzi 25 najnebezpečnejších programovacích chýb na svete (2009 CWE / SANS Top 25 najnebezpečnejších programovacích chýb) a je definované ako CWE - 120 v slovníku Enumerácií slabých systémových miest. Napriek tomu, že sú dobre študované, naďalej poškodzujú populárne programy.

Jednoduchý vektor použitia vyrovnávacej pamäte

Pri práci so zdrojovým kódom musíte venovať osobitnú pozornosť tomu, kde sa používajú a upravujú vyrovnávacie pamäte. Za zmienku stoja najmä funkcie súvisiace so vstupom poskytovaným používateľom alebo iným externým zdrojom, pretože poskytujú jednoduchý vektor, ktorý sa dá použiť, keď sa zistí pretečenie medzipamäte zásobníka. Napríklad, keď používateľ položí otázku " áno "alebo " nie", je vhodné uložiť údaje reťazca používateľa do malej vyrovnávacej pamäte pre reťazec "áno", ako je to znázornené v nasledujúcom príklade.

Jednoduchý vektor použitia vyrovnávacej pamäte

Pri pohľade na kód je zrejmé, že hraničná kontrola sa nevykonáva. Ak používateľ zadá "možno", program sa zrúti a nepožiada ho o odpoveď, ktorá sa zapíše do vyrovnávacej pamäte bez ohľadu na jej dĺžku. V tomto príklade, pretože odpoveď používateľa je jedinou deklarovanou premennou, nasledujúce hodnoty v zásobníku budú hodnotou spiatočnej adresy alebo miestom v pamäti, kam sa program vráti po vykonaní funkcie ask Question.

To znamená, že ak používateľ zadá štyri bajty údajov, čo stačí na pretečenie vyrovnávacej pamäte príkazov klienta, bude nasledovať platná spiatočná adresa, ktorá sa zmení. To spôsobí, že program ukončí funkciu v inom bode kódu, ako sa pôvodne plánovalo, a môže to spôsobiť, že sa softvér bude správať nebezpečným a neúmyselným spôsobom.

Ak je prvým krokom na zistenie pretečenia vyrovnávacej pamäte v zdrojovom kóde pochopenie toho, ako fungujú, druhým krokom je štúdium manipulácie s externým vstupom a vyrovnávacou pamäťou, potom Tretím krokom bude potreba zistiť, ktoré funkcie sú náchylné na túto zraniteľnosť a ktoré môžu pôsobiť ako "červené vlajky". Funkcia gets je skvelá na písanie mimo vyrovnávacej pamäte, ktorá je k nej poskytnutá. V skutočnosti sa táto kvalita rozširuje na celú rodinu súvisiacich funkcií vrátane strcpy, strcmp a printf / sprintf, kdekoľvek sa používa jedna z týchto funkcií zraniteľnosti pretečenia.

Odstránenie z kódovej základne

Ak sa v zdrojovom kóde zistí pretečenie medzipamäte zásobníka, bude potrebné ich dôsledné odstránenie z databázy. Aby ste to dosiahli, musíte byť oboznámení s bezpečnými pracovnými metódami. Najjednoduchší spôsob, ako zabrániť týmto zraniteľnostiam, je použiť jazyk, ktorý im neumožňuje. Jazyk C má tieto chyby zabezpečenia v dôsledku priameho prístupu do pamäte a nedostatku prísneho písania objektov. Jazyky, ktoré tieto aspekty nezdieľajú, sú zvyčajne nezraniteľné. Sú to Java, Python a .NET, spolu s ďalšími jazykmi a platformami, ktoré nevyžadujú špeciálne kontroly alebo zmeny.

Samozrejme, nie je vždy možné úplne zmeniť vývojový jazyk. V tomto prípade sa používajú bezpečné metódy pracovať s pretečením vyrovnávacej pamäte príkazov. V prípade funkcií spracovania reťazcov sa veľa diskutovalo o tom, ktoré metódy sú k dispozícii, ktoré sú bezpečné na použitie a ktorým by sa malo vyhnúť. Funkcie strcpy a strcat skopírujú reťazec do vyrovnávacej pamäte a pridajú obsah jedného k druhému. Tieto dve metódy vykazujú nebezpečné správanie, pretože nekontrolujú hranice cieľovej vyrovnávacej pamäte a zapisujú von, ak je na to dostatok bajtov.

Alternatívna ochrana

Jednou z často navrhovaných alternatív sú prepojené verzie, ktoré zapisujú maximálnu veľkosť cieľovej vyrovnávacej pamäte. Na prvý pohľad to vyzerá ako ideálne riešenie. Bohužiaľ, tieto funkcie majú malú nuanciu, ktorá spôsobuje problémy. Po dosiahnutí limitu, ak sa ukončovací znak nezmestí do posledného bajtu, vážne poruchy sa vyskytujú, keď čítanie vyrovnávacej pamäte.

Alternatívna ochrana

V tomto zjednodušenom príklade je viditeľné nebezpečenstvo reťazcov bez nulového konca. Keď sa foo umiestni do normálnej vyrovnávacej pamäte, končí nulou, pretože má viac miesta. Toto je najlepší scenár. Ak sú bajty v pretečení medzipamäte v zásobníku v inej medzipamäte znakov alebo v inom vytlačiteľnom reťazci, funkcia tlače pokračuje v čítaní, kým sa nedosiahne konečný znak tohto reťazca.

Nevýhodou je, že jazyk C neposkytuje štandardnú a bezpečnú alternatívu k týmto funkciám. Existuje však aj pozitívna-dostupnosť niekoľkých implementácií pre konkrétnu platformu. OpenBSD poskytuje strlcpy a strlcat, ktoré fungujú podobne ako funkcie strn, až na to, že skrátia reťazec o jeden znak skôr, aby vytvorili priestor pre nulový Terminátor.

Podobne spoločnosť Microsoft poskytuje svoje vlastné bezpečné implementácie bežne používaných funkcií spracovania reťazcov: strcpy_s, strcat_s a sprintf_s.

Uprednostňuje sa použitie bezpečných alternatív uvedených vyššie. Ak to nie je možné, pri spracovaní medzipamäte reťazcov vykonajte manuálnu kontrolu hraníc a ukončenie null.

Chyby kompilácie

Chyby kompilácie

Ak nebezpečná funkcia ponechá otvorenú možnosť pretečenia vyrovnávacej pamäte C, potom nie je všetko stratené. Pri spustení programu kompilátory často vytvárajú náhodné hodnoty, známe ako kanáriky, a umiestňujú ich do zásobníka, takže sú nebezpečné. Kontrola hodnoty kanárika vzhľadom na jeho pôvodnú hodnotu 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 chybového stavu, a nie na potenciálne zmenenú spiatočnú adresu.

Niektoré moderné operačné systémy poskytujú dodatočnú ochranu proti pretečeniu vyrovnávacej pamäte vo forme nespustiteľných zásobníkov a randomizácie pridelenia adresného priestoru (ASLR). Nespustiteľné zásobníky-prevencia spustenia údajov ( DEP) - označte zásobník a v niektorých prípadoch aj iné štruktúry ako oblasti, kde sa kód nevykoná. To znamená, že útočník nemôže vložiť exploitový kód do zásobníka a čakať na jeho úspešné vykonanie.

Pred opravou pretečenia vyrovnávacej pamäte rozbaľte ASLR na počítači. Bol navrhnutý tak, aby chránil pred programovaním zameraným na návrat ako riešenie nespustiteľných zásobníkov, kde sú existujúce fragmenty kódu reťazené na základe ich posunu adresy.

Funguje to tak, že randomizuje pamäťové oblasti štruktúr, takže ich kompenzácie je ťažšie určiť. Ak by táto ochrana existovala koncom 1980. rokov, mohlo by sa zabrániť červu Morris. Je to spôsobené tým, že fungoval čiastočne vyplnením vyrovnávacej pamäte v protokole UNIX finger pomocou exploitového kódu a následným pretečením, aby sa zmenila spiatočná adresa a ukázal na vyplnenú vyrovnávaciu pamäť.

ASLR a DEP komplikujú presné určenie adresy, ktorá sa má určiť, tým, že táto oblasť pamäte je úplne nefunkčná. Zraniteľnosť niekedy prekĺzne cez trhliny otvorené útokom pretečenia vyrovnávacej pamäte, a to aj napriek prítomnosti ovládacích prvkov na úrovni vývoja, kompilátora alebo operačného systému.

Statická analýza pokrytia

V situácii pretečenia vyrovnávacej pamäte existujú dve kľúčové úlohy. Najprv je potrebné identifikovať zraniteľnosť a zmeniť kódovú základňu na vyriešiť problém. Po druhé, poskytujú nahradenie všetkých verzií kódu zraniteľnosti pretečenia vyrovnávacej pamäte. V ideálnom prípade to začne automatickou aktualizáciou všetkých systémov pripojených k internetu.

Nedá sa predpokladať, že takáto aktualizácia poskytne dostatočné pokrytie. Organizácie alebo jednotlivci môžu používať softvér v systémoch s obmedzeným prístupom na Internet, ktoré vyžadujú manuálne aktualizácie. To znamená, že správy o aktualizácii by sa mali distribuovať všetkým správcom, ktorí môžu softvér používať, a oprava by mala byť ľahko prístupná na stiahnutie. Vytváranie a distribúcia opráv sa vykonáva čo najbližšie k detekcii zraniteľnosti, čo minimalizuje čas zraniteľnosti.

Vďaka použitiu funkcií bezpečného spracovania vyrovnávacej pamäte a zodpovedajúceho kompilátora a funkcie zabezpečenia operačného systému môžete vytvoriť spoľahlivú ochranu proti pretečeniu vyrovnávacej pamäte. S ohľadom na tieto kroky je dôsledná identifikácia nedostatkov rozhodujúcim krokom na zabránenie zneužitiu.

Kombinovanie riadkov zdrojového kódu pri hľadaní potenciálnych hrozieb môže byť únavné. Okrem toho vždy existuje šanca, že ľudským očiam môže chýbať niečo dôležité. Nástroje statickej analýzy sa používajú na zabezpečenie kvality kódu, boli vyvinuté špeciálne na detekciu bezpečnostných zraniteľností počas vývoja.

Sady analýzy statického pokrytia "červené štítky" pre potenciálne pretečenie vyrovnávacej pamäte. Potom sa spracujú a opravia osobitne, aby sa v databáze nevyhľadávali ručne. Tieto nástroje v kombinácii s pravidelnými kontrolami a znalosťami o tom, ako odstrániť pretečenie, umožňujú identifikovať a odstrániť veľkú väčšinu nedostatkov pred dokončením vývoja softvéru.

Vykonanie útoku cez root

Chyby kódovania sú zvyčajne príčinou pretečenia vyrovnávacej pamäte. Bežné chyby pri vývoji aplikácií, ktoré môžu viesť k tomu, zahŕňajú 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 sú často cieľmi útokov pretečenia vyrovnávacej pamäte.

V niektorých prípadoch útočník vloží škodlivý kód do pamäte, ktorá bola poškodená v dôsledku pretečenia medzipamäte zásobníka. V iných prípadoch jednoducho využívajú susedné poškodenie pamäte. Napríklad program, ktorý požaduje heslo používateľa, aby mu udelil prístup do systému. V nižšie uvedenom kóde poskytuje správne heslo oprávnenia root. Ak je heslo nesprávne, program neudeľuje oprávnenia používateľa.

Program neudeľuje používateľovi oprávnenia

Vo vyššie uvedenom príklade program udeľuje používateľovi oprávnenia root, aj keď zadal nesprávne heslo. V tomto prípade útočník poskytne vstup, ktorého dĺžka je dlhšia, ako dokáže medzipamäť udržať, čím sa vytvorí pretečenie, ktoré prepíše pamäť celočíselného priechodu. Preto sa napriek nesprávnemu heslu hodnota pass stane nenulovou a útočník získa práva root.

Útok Dočasného Úložného Priestoru

Vyrovnávacia pamäť je dočasná oblasť na ukladanie údajov. Keď program alebo systémový proces umiestni viac údajov, ako bolo pôvodne pridelené na ukladanie, ďalšie pretečú. To spôsobí, že niektoré z nich uniknú do iných vyrovnávacích pamätí, poškodia alebo prepíšu údaje.

Pri útoku na pretečenie obsahujú ďalšie údaje špeciálne pokyny pre akcie určené hackerom alebo škodlivým používateľom, napríklad spôsobujú odpoveď, ktorá poškodzuje súbory, upravuje údaje alebo zverejňuje osobné informácie.

Útočník použije zneužitie pretečenia na využitie programu čakajúceho na vstup používateľa. Existujú dva typy pretečenia vyrovnávacej pamäte: založené na zásobníku a halde. Haldy založené na halde sa ťažko vykonávajú a sú najmenej bežné, pričom útočia na aplikáciu vyplnením priestoru vyhradeného pre program.

Zásobník-použitý pamäťový priestor uložiť užívateľa vstup. Toto pretečenie je bežnejšie pre útočníkov používajúcich aplikácie.

Moderné kompilátory zvyčajne poskytujú možnosť skontrolovať pretečenie počas kompilácie / prepojenia, ale za behu je dosť ťažké skontrolovať tento problém bez ďalších ochranných mechanizmov spracovania výnimiek.

Vykonanie útoku cez root

Možnosti prevádzky programu:

  1. Vstup: 12345678 (8 bajtov), program funguje bez porúch.
  2. Vstup: 123456789 (9 bajtov), zobrazí sa správa "Chyba segmentácie", program sa ukončí.

Zraniteľnosť existuje v dôsledku pretečenia, ak vstup používateľa argv prekročí 8 bajtov. Pre 32-bitový systém (4 bajty) je pamäť naplnená dvojitým slovom (32 bitov). , veľkosť znaku je 1 bajt, takže ak požadujete vyrovnávaciu pamäť s 5 bajtmi, systém pridelí 2 dvojité slová (8 bajtov). To je dôvod, prečo keď zadáte viac ako 8 bajtov vyrovnávacej pamäte pretečie.

Podobné štandardné funkcie, ktoré sú technicky menej zraniteľné, existujú. Napríklad strncpy (), strncat () a memcpy (). Problém s týmito funkciami je, že zodpovednosť na určenie veľkosti vyrovnávacej pamäte leží programátor, nie kompilátor.

Každý programátor C / C++ by mal problém poznať pred začatím kódovania. Mnoho generovaných problémov môže byť vo väčšine prípadov chránených pred pretečením.

Nebezpečenstvo v C / C++

http://blogs.grammatech.com/eliminating-the-danger-of-uninitialized-variables

C používatelia by sa mali vyhnúť používaniu nebezpečných funkcií, ktoré nekontrolujú hranice, pokiaľ si nie sú istí, že hranice nebudú prekročené. Medzi funkcie, ktorým by ste sa vo väčšine prípadov mali vyhnúť, patria funkcie strcpy. Mali by byť nahradené funkciami, ako je strncpy. Použitie funkcie strlen by sa malo vyhnúť, ak je používateľ presvedčený, že sa nájde ukončujúci nulový znak. rodina scanf (): scanf(3), fscanf(3), sscanf(3), vscanf (3), vsscanf (3) a vfscanf (3) - nebezpečné použitie, nepoužíva sa na odosielanie údajov do reťazca bez kontroly maximálnej dĺžky, "formát %s" je obzvlášť časté zlyhanie.

Oficiálne snprintf () nie je štandardnou funkciou C v klasifikácii ISO 1990. Tieto systémy nechránia pred pretečením vyrovnávacej pamäte, iba priamo volajú sprintf. Je známe, že súčasná verzia Linuxu snprintf funguje správne, to znamená, že v skutočnosti rešpektuje stanovenú hranicu. Vrátená hodnota snprintf () sa tiež mení.

Verzia 2 ŠPECIFIKÁCIE Unix (Sus) a štandard C99 sa líšia v tom, že vracia snprintf(). Niektoré verzie snprintf nezaručujú, že reťazec skončí na nulu, a ak je reťazec príliš dlhý, nebude obsahovať vôbec nulu. Knižnica glib má g_snprintf() so sémantikou sekvenčného návratu, vždy končí nulou 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

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

Niekedy sériový port hlási pretečenie vyrovnávacej pamäte. Tento problém môže byť spôsobený niekoľkými faktormi. Patria sem rýchlosť počítača, použitá rýchlosť prenosu dát, veľkosť FIFO sériového portu a veľkosť FIFO zariadenia, ktoré prenáša údaje na sériový port.

Riadenie toku počká, kým sa vo vyrovnávacej pamäti neobjaví určitý počet bajtov, kým procesor odošle správu alebo signál inému zariadeniu, aby prestal vysielať. Pri vyšších prenosových rýchlostiach dostane sériový port niekoľko bajtov od okamihu, keď dosiahne úroveň riadenia toku vyrovnávacej pamäte a zastaví prenos zariadenia.

Tieto ďalšie bajty budú väčšie, ak proces s vysokou prioritou monitoruje cieľový procesor v reálnom čase. Pretože proces pretečenia vyrovnávacej pamäte komunikačného portu má vyššiu prioritu ako prerušenie VISA, procesor nepodnikne žiadne kroky, kým sa takýto proces nedokončí v reálnom čase.

Predvolené nastavenia VISA a Windows pre 16-bajtové FIFO sú 14 bajtov, pričom v FIFO zostávajú 2 bajty, keď sa zariadenie pokúsi odoslať správu zo zdroja. Pri vyšších prenosových rýchlostiach na pomalších počítačoch je možné prijať viac ako 4 bajty v okamihu, keď sériový port požiada procesor, čím vyšle signál na zastavenie prenosu.

Ak chcete vyriešiť problém, keď sa v systéme Windows 10 zistí pretečenie medzipamäte zásobníka, musíte otvoriť Správcu zariadení. Potom nájdite port COM, pre ktorý sa menia Nastavenia, a otvorte vlastnosti. Ďalej kliknite na kartu" Spresnenie", zobrazí sa posúvač, ktorý zmení veľkosť pretečenia schránky tak, aby UART umožňoval rýchlejšie riadenie toku.

Predvolená hodnota je vo väčšine prípadov dostatočná. Ak však dôjde k chybe pretečenia vyrovnávacej pamäte, znížte hodnotu. To spôsobí, že sa do procesora odošle viac prerušení so spomalením bajtov v UART.

Metódy bezpečného vývoja

Metódy bezpečného vývoja

Metódy bezpečného vývoja zahŕňajú pravidelné testovanie na detekciu a odstránenie pretečenia. Najspoľahlivejšie spôsob, ako sa tomu vyhnúť alebo mu zabrániť, je použitie automatickej ochrany na jazykovej úrovni. Ďalšou opravou je kontrola hraníc za behu, ktorá zabraňuje pretečeniu automatickou kontrolou, či sú údaje zapísané do vyrovnávacej pamäte v prijateľných medziach.

Cloudová služba Veracode identifikuje zraniteľné miesta kódu, ako je pretečenie vyrovnávacej pamäte, takže ich vývojári pred použitím odstránia. Priemyselne jedinečná proprietárna technológia binárneho statického testovania bezpečnosti aplikácií (SAST) Veracode ju analyzuje vrátane open source komponentov a komponentov tretích strán bez potreby prístupu k nim.

SAST dopĺňa modelovanie hrozieb a kontroly kódu vykonávané vývojármi detekciou chýb a opomenutí v kóde rýchlejšie a za nižšie náklady prostredníctvom automatizácie. Spravidla sa spúšťa v počiatočných fázach životného cyklu vývoja softvéru, pretože je jednoduchšie a lacnejšie opraviť problémy pred začatím nasadenia výroby.

SAST identifikuje kritické zraniteľnosti, ako je SQL injection, Cross-Site scripting (XSS), chyba pretečenia vyrovnávacej pamäte, Nespracované chybové stavy a potenciálne zákutia. Binárna technológia SAST navyše poskytuje užitočné informácie, ktoré uprednostňujú v závislosti od závažnosti a poskytujú podrobné pokyny na opravu .

Zraniteľnosť pretečenia vyrovnávacej pamäte existuje už takmer 3 desaťročia, stále je však zaťažujúca. Hackeri na celom svete to naďalej považujú za svoju predvolenú taktiku kvôli obrovskému počtu náchylných webových aplikácií. Vývojári a programátori vynakladajú obrovské úsilie na boj proti tomuto zlu IT technológií a prichádzajú s novými a novými spôsobmi.

Hlavnou myšlienkou druhého prístupu je implementácia nástroja na opravu, ktorý vytvorí viac kópií návratových adries v zásobníku a potom náhodne rozdelí umiestnenie všetkých kópií okrem čísla. Všetky duplikáty sa aktualizujú a kontrolujú paralelne, takže akýkoľvek nesúlad medzi nimi naznačuje možný pokus o útok a spôsobuje výnimku.

Články na tému