Přetečení vyrovnávací paměti: příčiny, efektivní metody řešení problému a požadovaná ochrana

Všichni programátoři si jsou vědomi potenciální hrozby přetečení bufferu ve svých programech. S ním je spojeno mnoho hrozeb, a to jak v novém, tak ve starém, bez ohledu na počet provedených oprav. Hackeři mohou tuto chybu použít implementací kódu, který je speciálně navržen tak, aby způsobil přetečení počáteční části datové sady, a pak zbytek zkopírujte na adresu paměti přiléhající k přetečení. Data mohou obsahovat spustitelný kód, který umožňuje útočníkům provozovat větší nebo složitější programy nebo jim dát přístup do systému. Chyby jsou velmi obtížné najít a opravit, protože kód pro kód se skládá z milionů řádků. Oprava těchto chyb je poměrně komplikovaná a na druhé straně také náchylná k chybám, což komplikuje eliminační proces.


Definice přetečení zásobníku

Než budete hledat přetečení, musíte vědět, co to představuje. Jak naznačuje název, tyto chyby se týkají vyrovnávacích pamětí nebo přidělení paměti v jazycích, které poskytují přímý přístup k čtení a psaní na nízké úrovni. Pokud používáte jazyky C a Assembler, čtení nebo zápis takových distribucí nevyžaduje automatické hraniční kontroly. V souvislosti s tím, pokud je v této aplikaci zjištěn přetečení vyrovnávací paměti, není kontrola možnosti umístit počet bajtů v uvažované vyrovnávací paměti. V takových případech program může "překročit" svou kapacitu. To vede k tomu, že datazaznamenané po naplnění, přepsat obsah následujících adresářů zásobníku a přečíst je navíc. Přetečení může dojít neúmyslně kvůli chybám uživatele.


V některých případech je to proto, že hrubý vysílá pečlivě vytvořil nebezpečný vstup do programu, který se potom snaží uložit jako nedostatečná velikost vyrovnávací paměti. Pokud se v této aplikaci zjistí přetečení zásobníku vyrovnávací paměti, přebytečné údaje se uloží do sousedních a nahrazují všechna dostupná data. Obvykle obsahují bod návratu pro využívanou funkci, adresu, pod kterou by měl proces pokračovat. Útočník může nastavit nové hodnoty, aby ukázal na zvolenou adresu. Útočník obvykle nastavuje nové hodnoty, které udávají, kde je užitečné zatížení. Tím se mění způsob, jakým proces běží a okamžitě přenáší správu škodlivého kódu. Použití přetečení vyrovnávací paměti umožňuje útočníkovi sledovat nebo ukončit proces nebo upravit jeho interní proměnné. Toto narušení se odehrává v top 25 nejnebezpečnějších chybách softwaru na světě (2009 CWE /SANS Top 25 nejnebezpečnějších chyb při programování) a je definováno jako CWE-120 v překladovém slovníku slabých umístění systému. Navzdory tomu, že jsou dobře studováni, i nadále poškozují populární programy.

Jednoduchý vektor vyrovnávací paměti

Při práci se zdrojovým kódem je třeba věnovat zvláštní pozornost tomu, kde se používají vyrovnávací paměti, a modifikovat je. Zvláště pozoruhodné jsou funkce týkající se závěru poskytnutého uživatelem nebojiný externí zdroj, neboť poskytují jednoduchý vektor pro použití, když je detekován přetečení vyrovnávací paměti. Pokud se například uživatel zeptá "ano" nebo "ne", je vhodné uložit uživatelské řetězcové údaje do malého vyrovnávací paměti pro řádek "ano", jak je ukázáno v následujícím příkladu.
Při pohledu na kód je zřejmé, že kontrola hranic není provedena. Pokud uživatel zadá "možný", program dojde k selhání úlohy a nepožádá jej o odpověď, která je zapsána v vyrovnávací paměti bez ohledu na její délku. V tomto příkladu, protože uživatelská odpověď je jedinou deklarovanou proměnnou, hodnota v zásobníku bude hodnota reverzní adresy nebo paměti, kde se program vrátí po zadání funkce dotazu na funkci. To znamená, že v případě, že uživatel bude představí čtyři bajtů dat, což je dost na příkaz přetečení vyrovnávací paměti klienta je platné zpáteční adresa být změněn. To způsobí, že program ukončí funkci v jiném bodě kódu, než se původně předpokládalo, a může vést k tomu, co se bude chovat nebezpečně a neúmyslně. V případě, že prvním krokem k detekci přetečení zásobníku ve zdrojovém kódu mít pochopení toho, jak fungují, druhým krokem je přezkoumat externí vstup a manipulaci vyrovnávací paměti, třetím krokem je potřeba vidět, jaké funkce jsou náchylné k tomuto problému a která může působit jako „červené vlajky »Informace o výrobku Funkce get je skvělá pro nahrávání za poskytnutou vyrovnávací paměť. Ve skutečnosti je tato vlastnost se vztahuje na všechny rodinné souvisejících funkcí, včetně strcpy, strcmp a printf /sprintf, kdekolijednou z těchto funkcí je zranitelnost přetečení.

Vymazání z kódové databáze

Pokud je ve zdrojovém kódu nalezen přetečení vyrovnávací paměti, bude vyžadováno důsledné odstranění z databáze. Chcete-li to provést, musíte se seznámit s bezpečnými způsoby práce. Nejsnadnějším způsobem, jak zabránit těmto zranitelnostem, je používat jazyk, který jim neumožňuje. Jazyk C má tyto chyby způsobené přímým přístupem k paměti a nedostatkem přísného psaní objektů. Jazyky, které tyto aspekty nesdílejí, obvykle nejsou k dispozici. Jde o jazyky Java, Python a .NET spolu s dalšími jazyky a platformami, které nevyžadují zvláštní kontroly nebo změny. Samozřejmě nemůžete úplně změnit vývojový jazyk. V tomto případě se používají bezpečné metody pro práci s přetečením vyrovnávací paměti příkazů. V případě funkcí zpracování linky bylo mnoho diskusí o tom, jaké metody jsou k dispozici, které jsou bezpečné a které je třeba se vyhnout. Funkce strcpy a strcat zkopírují řetězec do vyrovnávací paměti a navzájem přidávají obsah. Tyto dvě metody ukazují nebezpečné chování, protože nekontrolují hranice cílové vyrovnávací paměti a nevykonávají záznam venku, pokud je k tomu dostatek bajtů.

Alternativní ochrana

Jednou z často navrhovaných alternativ jsou související verze, které jsou zapsány v maximální velikosti cílové vyrovnávací paměti. Na první pohled to vypadá jako ideální řešení. Bohužel tyto funkce mají malou nuance, která způsobuje problémy. Po dosažení limitu, pokud není poslední znak umístěn v posledním bajtu, při čtení vyrovnávací paměti dochází k vážným poruchám.

V tomtoZjednodušený příklad ukazuje nebezpečí strun, nekončí se nulou. Když je foo umístěn do normálního vyrovnávací paměti, končí nula, protože má další prostor. To je nejlepší možnost pro vývoj událostí. V případě, že byty v přetečení vyrovnávací paměti na zásobníku bude mít jiný znak vyrovnávací paměť nebo jiný tištěný linka, funkce tisk pokračovat ve čtení až do konečného znaku v řádku. Nevýhodou je, že jazyk C neposkytuje standardní a bezpečnou alternativu k těmto vlastnostem. Přesto je pozitivní - dostupnost několika implementací pro konkrétní platformu. OpenBSD poskytuje strlcpy a strlcat, pracující strn podobné funkce, kromě toho, že usekayut String jeden znak předtím, dělat cestu pro nulovou terminátoru. Podobně, Microsoft poskytuje vlastní bezpečné provádění často používaných funkcí linky: strcpy_s, strcat_s a sprintf_s. Používání výše uvedených bezpečných alternativ je nejlepší. Pokud to není možné, při zpracovávání vyrovnávacích pamětí řetězců proveďte ruční kontrolu hranic a nulovou dokončení.

Zranitelnosti při kompilaci

V případě, že nebezpečná funkce ponechá otevřenou možnost přetečení vyrovnávací paměti C, pak není vše ztraceno. Když spustíte program, kompilátory často vytvářejí náhodné hodnoty, známé jako kanary, a dají je do zásobníku, takže představují nebezpečí. Kontrola hodnoty kanálu vzhledem k jeho původní hodnotě může určit, zda došlo k přetečení vyrovnávací paměti Windows. Pokud byla hodnota změněna, program bude uzavřen nebo do stavu chyby, ale potenciálně nebudezměněna adresa návratu.
Některé moderní operační systémy poskytují dodatečnou ochranu proti přetečení vyrovnávacích pamětí ve formě nedosažitelných zásobníků a náhodného přidělování adresního prostoru (ASLR). Nevykonatelná sestavení - prevence dat (DEP) - označuje zásobníky a v některých případech další struktury jako oblasti, kde kód nebude proveden. To znamená, že útočník nemůže implementovat kód exploit v zásobníku a čekat na jeho úspěšné provedení. Než opravíte přetečení vyrovnávací paměti, rozbalte ji na počítač ASLR. Byla navržena tak, aby chránila před naprogramovanými vracami jako bypasová cesta k nerealizovatelným zásobníkům, kde jsou fragmenty stávajícího kódu shromážděny v řetězci na základě předpojatosti jejich adres. Funguje náhodným rozdělením paměťových oblastí struktur, takže jejich přesun je obtížnější definovat. Pokud by tato ochrana existovala koncem osmdesátých let, mohl by se předejít červu Morris. To je způsobeno skutečností, že částečně fungovala vyplněním vyrovnávací paměti v kódu zneužití prstu systému UNIX a následným přetopením pro změnu návratové adresy a směrem k úplné vyrovnávací paměti. ASLR a DEP komplikují přesné vymezení adresy, která se má specifikovat, zatímco tato oblast paměti je zcela mimo místo. Příležitostně se tato chyba snižuje přes trhliny, které jsou otevřené úniku vyrovnávacích pamětí, a to navzdory přítomnosti ovládacích prvků na úrovni vývoje, kompilátoru nebo operačního systému.

Analýza statického pokrytí

V situaci přetečení vyrovnávací paměti existují dvě kritické úlohy. Nejprve je třeba určit zranitelnost azměňte základnu kódu, abyste vyřešili problém. Za druhé, zajistěte náhradu všech verzí kódu chyby zabezpečení přetečení vyrovnávací paměti. V ideálním případě to bude zahájeno automatickou aktualizací všech systémů připojených k Internetu. Nelze předpokládat, že taková aktualizace poskytne dostatečné pokrytí. Organizace nebo jednotlivci mohou používat software v systémech s omezeným přístupem k internetu, což vyžaduje manuální aktualizace. To znamená, že aktualizace novinky musí být distribuovány mezi administrátory, kteří je mohou používat, a náplast by měla být k dispozici ke stažení. Tvorba a distribuce korekcí se provádí co nejblíže detekci zranitelnosti, což minimalizuje dobu zranitelnosti. Díky použití bezpečných funkcí zpracování vyrovnávacích pamětí a odpovídajících bezpečnostních prvků kompilátoru a operačního systému můžete vytvořit spolehlivou ochranu proti přepadové vyrovnávací paměti. Ve světle těchto kroků je důsledná identifikace nedostatků rozhodujícím krokem k zabránění vykořisťování. Kombinace zdrojových řetězců při hledání potenciálních hrozeb může být vyčerpávající. Kromě toho existuje vždy možnost, že lidské oči mohou ztratit něco důležitého. Prostředky statické analýzy se používají k zajištění kvality kódu, byly speciálně navrženy tak, aby detekovaly zranitelnost během vývoje. Statická analýza pokrytí nastavuje "červené štítky" pro případné přetečení vyrovnávací paměti. Poté jsou zpracovávány a upravovány odděleně, aby nebyly v databázi hledány. Tyto nástroje jsou vv kombinaci s pravidelnými kontrolami a znalostmi o tom, jak eliminovat přetečení, vám umožní zjistit a odstranit převážnou většinu nedostatků před dokončením softwaru.

Provádění útoků root

Chyby kódování jsou obvykle příčinou přetečení vyrovnávací paměti. Mezi běžné chyby při vývoji aplikací, které mohou vést k němu, patří neschopnost přidělit dostatečně velké vyrovnávací paměti a nedostatek mechanismu pro kontrolu těchto problémů. Takové chyby jsou obzvláště problematické v jazycích C /C ++, které nemají zabudovanou ochranu proti přetečení a často jsou vystaveny útokům přetečení vyrovnávací paměti. V některých případech útočník zavádí škodlivý kód do paměti, která byla poškozena přetečením zásobníku vyrovnávací paměti. V jiných případech prostě použijte výhody poškození v okolní paměti. Například program, který požádá o heslo uživatele, aby mu umožnil přístup do systému. V níže uvedeném kódu obsahuje správné heslo oprávnění root. Pokud je heslo nesprávné, program neopravňuje uživatele.
Ve výše uvedeném příkladu program poskytuje uživateli práva uživatele root, i když zadal nesprávné heslo. V takovém případě útočník poskytuje vstup, jehož délka je větší než vyrovnávací paměť, může vytvářet přetečení a přepsat paměť celočíselného průchodu. Proto, přes nesprávné heslo, hodnota průchodu se stává nenulovou a útočník získá práva kořenové.

Útok v časovém pásmu

Buffer je dočasný úložný prostor. Když aplikace nebo systémový proces umístí více dat než bylopřidělené pro ukládání, další přetečení. To způsobí, že některé z nich mohou unikat do jiných vyrovnávacích pamětí, poškodit nebo nahradit data. Při útoku na přetečení obsahuje další údaje zvláštní pokyny pro akce spáchané hackerem nebo škodlivým uživatelem, například způsobují odpověď, která poškozuje soubory, upravuje data nebo zveřejňuje osobní informace. Útočník používá přetečení exploit k použití programu, který očekává vstup uživatele. Existují dva typy vyrovnávací paměti přetečení: zásobník a hromada. Skládané balíčky jsou obtížně proveditelné a nejméně běžné, zatímco útočí na aplikaci, plní místo vyhrazené pro program. Stack je paměťový prostor používaný k ukládání uživatelského vstupu. Takový přetečení je častější u útočníka, který používá programy. Moderní překladače obvykle poskytují schopnost kontrolovat přetečení během kompilace /kompilace, ale během provádění je obtížné tento problém zkontrolovat bez jakéhokoli dalšího ochranného mechanismu pro zacházení s výjimkami.
Varianty programu:
  • Zadejte: 12345678 (8 bajtů), program pracuje bez pádů.
  • Zadejte: 123456789 (9 bajtů), zobrazí se zpráva "Chyba segmentace", program je dokončen.
  • Zranitelnost existuje kvůli přetečení, pokud uživatelský vstup argv překročí 8 bajtů. U 32bitového systému (4 bajty) zaplňují paměť dvojitým slovem (32 bitů). Velikost znaku je 1 bajt, takže pokud požadujete vyrovnávací paměť s 5 bajty,systém přidělí 2 dvojité slovo (8 bajtů). Proto při zadání více než 8 bajtů bude vyrovnávací paměť plná. Podobné standardní funkce, které jsou technicky méně zranitelné, existují. Například strncpy (), strncat () a memcpy (). Problém s těmito funkcemi je, že odpovědnost za určení velikosti vyrovnávací paměti je programátor a ne překladač. Každý programátor C /C ++ by měl znát problém před spuštěním kódování. Mnoho problémů generovaných ve většině případů může být chráněno před přetečením.

    Nebezpečí v C /C ++

    C Uživatelé by se měli vyhnout se používání nebezpečných funkcí, které nekontrolují hranice, pokud nejste jisti, jaké jsou hranice nejsou překročeny. Funkce, které byste ve většině případů neměli chránit, zahrnují funkce strcpy. Měli by být nahrazeny funkcemi, jako je strncpy. Vyhněte se použití funkce strlen, pokud je uživatel přesvědčen, že bude nalezen konečný symbol NIL. Rodina scanf (): scanf
    , fscanf
    , sscanf
    , vscanf
    , vsscanf
    a vfscanf
    - nebezpečné pro použití, to není používán pro odesílání dat v řadě bez kontrolního maxima délka, "format% s" je obzvláště časté selhání. Oficiálně funkce snprintf () není standardní C klasifikace ISO 1990. Tyto systémy neposkytují ochranu proti přetečení vyrovnávací paměti, že stačí zavolat sprintf přímo. Je známo, že současná verze Linux snprintf funguje správně, že je ve skutečnosti pozorována limit. Počítaná hodnota snprintf () se také liší. Verze specifikace 2 Unix (SUS) a standardní C99 liší, že se vrátí snprintf (). NěkteříVerze snprintf nezaručují, že řetězec skončí v NIL a pokud je řetězec příliš dlouhý, neobsahuje vůbec NIL. Glib knihovna má g_snprintf () s postupnou sémantikou návratu, vždy končí NIL a, co je nejdůležitější, vždy bere v úvahu délku vyrovnávací paměti.

    Přetečení vyrovnávací paměti komunikačního portu

    Někdy sériový port hlásí vyrovnávací paměť přetečení. Tento problém může být způsoben několika faktory. Mezi ně patří rychlost počítače, rychlost přenosu dat, velikost sériového portu FIFO a velikost zařízení FIFO, která přenáší data do sériového portu. Řízení toku vyčká, dokud se v vyrovnávací paměti neobjeví určitý počet bajtů, než procesor odešle zprávu nebo signál do jiného zařízení, aby zastavil přenos. Při vyšších přenosových rychlostech bude sériový port přijímat několik bajtů od okamžiku, kdy je dosažena úroveň řízení průtoku vyrovnávací paměti a zařízení je zastaveno. Tyto další bajty budou větší, pokud proces s vysokou prioritou řídí cílový procesor v reálném čase. Vzhledem k tomu, že přetečení vyrovnávací paměti komunikačního portu má vyšší prioritu než přerušení VISA, procesor nebude provádět žádné kroky, dokud nebude dokončen v reálném čase. Výchozí nastavení VISA a Windows pro 16bajtové FIFO jsou 14 bajtů a ponechávají 2 bajty v souboru FIFO, když se zařízení pokusí odeslat zprávu ze zdroje. Při vyšších rychlostech na pomalých počítačích je možné získat více než 4 bajty v době kdySerial požadující procesor vyšle signál k zastavení přenosu. Chcete-li vyřešit tento problém, je-li zjištěna přetečení zásobníku vyrovnávací paměti v systému Windows 10 je nutné otevřít Správce zařízení. Poté najděte COM port, pro který se změní nastavení, a otevřete vlastnosti. Poté klikněte na záložku "Pokročilé" a objeví se posuvník, který změní velikost přetečení schránky tak, aby UART rychleji zapínal správu streamu. Výchozí hodnota ve většině případů je dostatečná. Pokud je však chyba přetečení vyrovnávací paměti, hodnota se snižuje. To bude mít za následek přerušení, která ještě budou zaslány do procesoru se zpomalením bytů v UART.

    Metody pro bezpečný vývoj

    Techniky bezpečného vývoje zahrnují rutinní testování k odhalení a odstranění přetečení. Nejspolehlivější způsob, jak se vyhnout nebo zabránit použití automatické ochrany jazyka. Dalším nástrojem je kontrola hranic během provádění, která zabraňuje přetečení automatickou kontrolou, že data zaznamenaná v vyrovnávací paměti jsou v povolených mezích. Veracode servisní kód identifikuje slabá místa, jako je přetečení zásobníku, jako vývojáři jejich odstranění před jejich použitím. Patentovaná technologie společnosti Veracode pro testování binárních statických bezpečnostních bezpečnostních technologií (SAST) je v tomto odvětví jedinečná a analyzuje je, včetně komponent s otevřeným zdrojovým kódem a komponenty třetích stran, bez nutnosti přístupu k nim. SAST doplňuje simulaci výzev a kódových hodnocení vývojáři rychleji a levněji.zjišťování chyb a opomenutí kódu v důsledku automatizace. Spravidla běží v počátečních fázích životního cyklu vývojového softwaru, protože je snadnější a levnější problém vyřešit předtím, než dojde k výrobnímu nasazení. SAST detekuje kritické chyby, jako je implementace SQL, skriptování mezi stránkami (XSS), chyba přetečení vyrovnávací paměti, stav nesprávných chyb a potenciální rohy. Kromě toho poskytuje binární technologie SAST užitečné informace, které definují priority v závislosti na závažnosti a poskytují podrobné příručky pro korekci. Zranitelnost přetečení vyrovnávací paměti existovala již téměř 3 desetiletí, ale je stále obtížná. Hackeři z celého světa ji nadále považují za svou taktiku ve výchozím nastavení kvůli obrovskému počtu reagujících webových aplikací. Vývojáři a programátoři vynakládají obrovské úsilí na potírání této pohromy IT technologií, vynalézá nové a nové způsoby. Hlavní myšlenkou posledního přístupu je implementovat nástroj pro opravu, který vytvoří více kopií adres návratů v zásobníku, a namísto čísla pak náhodně určí umístění všech kopií. Všechny duplikáty jsou aktualizovány a kontrolovány paralelně, takže jakýkoli nesoulad mezi nimi znamená pokus o útok a způsobuje výjimku.

    Související publikace