Přetečení zásobníku - Buffer overflow

V oblasti informační bezpečnosti a programování , je přetečení vyrovnávací paměti , nebo přetečení vyrovnávací paměti , je anomálie , kde programu , při zápisu dat do vyrovnávací paměti , přetečení vyrovnávací paměti je hranice a přepíše sousední paměťových míst.

Vyrovnávací paměti jsou oblasti paměti vyhrazené pro ukládání dat, často při jejich přesunu z jedné části programu do druhé nebo mezi programy. Přetečení vyrovnávací paměti může být často spuštěno chybně zadanými vstupy; pokud jeden předpokládá, že všechny vstupy budou menší než určitá velikost a vyrovnávací paměť je vytvořena na tuto velikost, pak by anomální transakce, která produkuje více dat, mohla způsobit zápis za konec vyrovnávací paměti. Pokud to přepíše sousední data nebo spustitelný kód, může to mít za následek nevyrovnané chování programu, včetně chyb přístupu k paměti, nesprávných výsledků a selhání .

Využití chování přetečení vyrovnávací paměti je známým zneužitím zabezpečení . V mnoha systémech je rozložení paměti programu nebo systému jako celku dobře definováno. Odesláním dat navržených tak, aby způsobily přetečení vyrovnávací paměti, je možné zapisovat do oblastí, o nichž je známo, že obsahují spustitelný kód a nahradit jej škodlivým kódem , nebo selektivně přepsat data týkající se stavu programu, což způsobí chování, které nebylo zamýšleno původní programátor. V kódu operačního systému (OS) jsou rozšířené vyrovnávací paměti , takže je možné provádět útoky, které provádějí eskalaci oprávnění a získat neomezený přístup ke zdrojům počítače. Slavný červ Morris v roce 1988 to použil jako jednu ze svých útočných technik.

Mezi programovací jazyky běžně spojené s přetečením vyrovnávací paměti patří C a C ++ , které neposkytují žádnou vestavěnou ochranu před přístupem nebo přepisováním dat v žádné části paměti a automaticky nekontrolují, zda jsou data zapsaná do pole (typ vestavěné vyrovnávací paměti) uvnitř hranice tohoto pole. Kontrola hranic může zabránit přetečení vyrovnávací paměti, ale vyžaduje další kód a čas zpracování. Moderní operační systémy používají pro boj se škodlivým přetečením vyrovnávací paměti celou řadu technik, zejména randomizací rozložení paměti nebo záměrným ponecháním mezery mezi vyrovnávacími paměťmi a hledáním akcí, které zapisují do těchto oblastí („kanáři“).

Technický popis

K přetečení vyrovnávací paměti dochází, když data zapsaná do vyrovnávací paměti také poškozují hodnoty dat v adresách paměti sousedících s cílovou vyrovnávací pamětí kvůli nedostatečné kontrole mezí . K tomu může dojít při kopírování dat z jedné vyrovnávací paměti do druhé bez předchozí kontroly, zda se data vejdou do cílové vyrovnávací paměti.

Příklad

V následujícím příkladu vyjádřeném v C má program dvě proměnné, které sousedí v paměti: 8bajtový řetězec vyrovnávací paměti, A a dvoubajtové velké endianové celé číslo, B.

char           A[8] = "";
unsigned short B    = 1979;

Zpočátku A obsahuje pouze nulové bajty a B obsahuje číslo 1979.

název proměnné A B
hodnota [ prázdný řetězec ] 1979
hexadecimální hodnota 00 00 00 00 00 00 00 00 07 BB

Nyní se program pokusí uložit řetězec zakončený nulou "excessive" s kódováním ASCII do vyrovnávací paměti A.

strcpy(A, "excessive");

"excessive"je 9 znaků dlouhý a kóduje 10 bytů včetně nulového terminátoru, ale A může trvat jen 8 bytů. Tím, že nezkontrolujete délku řetězce, přepíše také hodnotu B:

název proměnné A B
hodnota 'e' 'x' 'c' 'e' 's' 's' 'i' 'v' 25856
hex 65 78 63 65 73 73 69 76 65 00

Hodnota B byla nyní nechtěně nahrazena číslem vytvořeným z části řetězce znaků. V tomto případě by „e“ následované nulovým bajtem bylo 25856.

Zápis dat za konec přidělené paměti může být někdy operačním systémem detekován za účelem vygenerování chyby chyby segmentace, která proces ukončí.

Aby se v tomto případě zabránilo přetečení vyrovnávací paměti, bylo strcpyby možné nahradit volání strlcpy, které bere maximální kapacitu A (včetně znaku s nulovým zakončením) jako další parametr a zajišťuje, že nebude zapsáno více než toto množství dat do A:

strlcpy(A, "excessive", sizeof(A));

Je-li k dispozici, strlcpyje upřednostňována funkce knihovny, nad strncpykterou není null ukončena cílová vyrovnávací paměť, pokud je délka zdrojového řetězce větší nebo rovna velikosti vyrovnávací paměti (třetí argument předaný funkci), proto Anemusí být null- ukončeno a nelze s nimi zacházet jako s platným řetězcem ve stylu C.

Vykořisťování

Techniky využití zranitelnosti přetečení vyrovnávací paměti se liší podle architektury , operačního systému a oblasti paměti. Například využití na haldě (používá se pro dynamicky přidělenou paměť) se výrazně liší od exploatace v zásobníku volání .

Využití založené na zásobníku

Technicky nakloněný uživatel může využít přetečení vyrovnávací paměti založené na zásobníku k manipulaci s programem ve svůj prospěch jedním z několika způsobů:

  • Přepsáním lokální proměnné, která se nachází v blízkosti zranitelné vyrovnávací paměti v zásobníku, za účelem změny chování programu
  • Přepsáním zpáteční adresy v rámečku zásobníku, aby odkazoval na kód vybraný útočníkem, obvykle nazývaný shellcode . Jakmile se funkce vrátí, provádění se obnoví na shellcode útočníka.
  • Přepsáním ukazatele funkce nebo obsluhy výjimek tak, aby odkazoval na kód shellu, který je následně spuštěn
  • Přepsáním lokální proměnné (nebo ukazatele) jiného rámce zásobníku, kterou funkce, která daný rámec vlastní, použije později.

Útočník navrhne data, která způsobí jeden z těchto zneužití, a poté je umístí do vyrovnávací paměti poskytnuté uživatelům zranitelným kódem. Pokud je adresa uživatelem dodaných dat, která mají vliv na přetečení vyrovnávací paměti zásobníku, nepředvídatelná, využití přetečení vyrovnávací paměti zásobníku, které způsobí vzdálené spuštění kódu, bude mnohem obtížnější. Jedna technika, kterou lze využít k využití takového přetečení vyrovnávací paměti, se nazývá „ trampolining “. V této technice útočník najde ukazatel na zranitelný zásobník vyrovnávací paměti a vypočítá umístění jeho kódu shellu vzhledem k tomuto ukazateli. Potom použijí přepsání ke skoku na instrukci již v paměti, která provede druhý skok, tentokrát vzhledem k ukazateli; tento druhý skok rozvětví spuštění do kódu shellu. Vhodné pokyny jsou často přítomny ve velkém kódu. Projekt Metasploit například spravuje databázi vhodných operačních kódů, přestože uvádí pouze ty, které se nacházejí v operačním systému Windows .

Vytěžování na základě haldy

Přetečení vyrovnávací paměti, ke kterému dochází v datové oblasti haldy, se označuje jako přetečení haldy a lze ji zneužít jiným způsobem, než je tomu u přetečení založených na zásobníku. Paměť na haldě je dynamicky přidělována aplikací za běhu a obvykle obsahuje programová data. Zneužívání se provádí poškozováním těchto dat konkrétními způsoby, které způsobí, že aplikace přepíše vnitřní struktury, jako jsou odkazy na propojené seznamy. Technika přetečení kanonické haldy přepíše propojení dynamické alokace paměti (například metadata malloc ) a použije výslednou výměnu ukazatele k přepsání ukazatele funkce programu.

Microsoft je GDI + zranitelnost při manipulaci JPEG je příkladem nebezpečí přetečení haldy může představovat.

Překážky vykořisťování

Manipulace s vyrovnávací pamětí, ke které dojde před jejím čtením nebo spuštěním, může vést k selhání pokusu o zneužití. Tyto manipulace mohou zmírnit hrozbu vykořisťování, ale nemusí to znemožnit. Manipulace mohou zahrnovat převod na velká nebo malá písmena, odstranění metaznaků a odfiltrování nealfanumerických řetězců. Existují však techniky, jak tyto filtry a manipulace obejít; alfanumerický kód , polymorfní kód , samoopravný kód a útoky návrat k libc . Stejné metody lze použít k zamezení detekce systémy detekce narušení . V některých případech, včetně případů, kdy je kód převeden na Unicode , byla hrozba zranitelnosti poskytovatelem informací zkreslena jako pouze Denial of Service, i když ve skutečnosti je možné vzdálené spuštění libovolného kódu.

Praktické využití

Ve skutečných exploitech existuje řada výzev, které je třeba překonat, aby exploity fungovaly spolehlivě. Mezi tyto faktory patří nulové bajty v adresách, variabilita v umístění kódu shellu, rozdíly mezi prostředími a různá protiopatření v provozu.

Technika NOP saní

Ilustrace užitečného zatížení sáněk NOP na zásobníku.

NOP-sled je nejstarší a nejznámější technikou pro využití přetečení zásobníku. Řeší problém nalezení přesné adresy vyrovnávací paměti účinným zvětšením velikosti cílové oblasti. K tomu jsou mnohem větší části zásobníku poškozeny instrukcí stroje bez operace . Na konci dat dodaných útočníkem, po instrukcích bez operace, útočník umístí instrukci k provedení relativního skoku do horní části vyrovnávací paměti, kde je umístěn kód shellu . Tato kolekce neoperací je označována jako „NOP-sled“, protože pokud je návratová adresa přepsána jakoukoli adresou v oblasti no-op vyrovnávací paměti, provádění „sklouzne“ dolů po no-ops, dokud nebude přesměrován na skutečný škodlivý kód skokem na konci. Tato technika vyžaduje, aby útočník uhodl, kde na hromádce je NOP-sled místo poměrně malého shell kódu.

Vzhledem k popularitě této techniky bude mnoho prodejců systémů prevence narušení hledat tento vzorec instrukcí neoperačního stroje ve snaze detekovat používaný shell kód. Je důležité si uvědomit, že NOP-sled nemusí nutně obsahovat pouze tradiční instrukce ne-op stroje; místo hardwarově asistovaného no-op lze použít jakoukoli instrukci, která nepoškodí stav stroje do bodu, kdy se shell kód nespustí. V důsledku toho se stalo běžnou praxí autorů exploitů skládat neoperační sled s náhodně zvolenými instrukcemi, které nebudou mít skutečný vliv na provádění shellcode.

Tato metoda sice výrazně zvyšuje šance na úspěch útoku, ale není bez problémů. Exploity využívající tuto techniku ​​se musí stále spoléhat na určitou dávku štěstí, že uhodnou offsety na stacku, které jsou v oblasti NOP-sled. Nesprávný odhad obvykle způsobí zhroucení cílového programu a může upozornit správce systému na činnosti útočníka. Dalším problémem je, že NOP-sled vyžaduje mnohem větší množství paměti, ve které by bylo možné držet NOP-saně dostatečně velké, aby byly k něčemu užitečné. To může být problém, když je přidělená velikost zasažené vyrovnávací paměti příliš malá a aktuální hloubka zásobníku je malá (tj. Od konce aktuálního rámce zásobníku do začátku zásobníku není mnoho místa). Navzdory svým problémům je NOP-sled často jedinou metodou, která bude fungovat pro danou platformu, prostředí nebo situaci, a jako taková je stále důležitou technikou.

Skok na adresu uloženou v registrační technice

Technika „jump to register“ umožňuje spolehlivé využití přetečení vyrovnávací paměti zásobníku bez potřeby dalšího prostoru pro sáňky NOP a bez nutnosti hádat posuny zásobníku. Strategií je přepsat návratový ukazatel něčím, co způsobí, že program přeskočí na známý ukazatel uložený v registru, který ukazuje na řízenou vyrovnávací paměť a tím i shell kód. Pokud například registr A obsahuje ukazatel na začátek vyrovnávací paměti, lze k získání kontroly nad tokem provádění použít jakýkoli skok nebo volání, které tento registr vezme jako operand.

Pokyn od ntdll.dll k volání DbgPrint()rutiny obsahuje operační kód počítače i386 pro jmp esp.

V praxi nemusí program záměrně obsahovat pokyny ke skoku do určitého registru. Tradičním řešením je najít neúmyslnou instanci vhodného operačního kódu na pevném místě někde v paměti programu. Na obrázku E vlevo je příklad takové neúmyslné instance jmp espinstrukce i386 . Operační kód pro tuto instrukci je FF E4. Tuto dvoubajtovou sekvenci najdete na jednobajtovém posunu od začátku instrukce call DbgPrintna adrese 0x7C941EED. Pokud útočník přepíše návratovou adresu programu touto adresou, program nejprve přeskočí 0x7C941EED, interpretuje operační kód FF E4jako jmp espinstrukci a poté přeskočí na začátek zásobníku a spustí kód útočníka.

Pokud je tato technika možná, závažnost zranitelnosti se výrazně zvyšuje. Důvodem je, že exploatace bude fungovat dostatečně spolehlivě na automatizaci útoku s virtuální zárukou úspěchu při jeho spuštění. Z tohoto důvodu se jedná o techniku ​​nejčastěji používanou u internetových červů, která využívá zranitelnosti přetečení vyrovnávací paměti zásobníku.

Tato metoda také umožňuje umístit kód Shell za přepsanou zpáteční adresu na platformě Windows. Vzhledem k tomu, že spustitelné soubory jsou většinou založeny na adrese 0x00400000a x86 je architektura Little Endian , musí být poslední bajt zpáteční adresy nulový, což ukončí kopírování vyrovnávací paměti a za tím se nepíše nic. To omezuje velikost kódu shellu na velikost vyrovnávací paměti, což může být příliš restriktivní. Knihovny DLL se nacházejí ve vysoké paměti (výše 0x01000000) a mají tedy adresy neobsahující žádné nulové bajty, takže tato metoda může z přepsané zpáteční adresy odebrat nulové bajty (nebo jiné nepovolené znaky). Tímto způsobem je metoda často označována jako „DLL trampolining“.

Ochranná protiopatření

K detekci nebo prevenci přetečení vyrovnávací paměti byly použity různé techniky s různými kompromisy. Nejspolehlivějším způsobem, jak se vyhnout nebo zabránit přetečení vyrovnávací paměti, je použít automatickou ochranu na jazykové úrovni. Tento druh ochrany však nelze použít na starší kód a technická, obchodní nebo kulturní omezení často vyžadují zranitelný jazyk. Následující části popisují dostupné možnosti a implementace.

Volba programovacího jazyka

Assembly a C/C ++ jsou populární programovací jazyky, které jsou náchylné k přetečení vyrovnávací paměti, částečně proto, že umožňují přímý přístup do paměti a nejsou silně zadávány . C neposkytuje žádnou vestavěnou ochranu proti přístupu nebo přepisování dat v jakékoli části paměti; konkrétněji, nekontroluje, zda jsou data zapsaná do vyrovnávací paměti v mezích této vyrovnávací paměti. Standardní knihovny C ++ poskytují mnoho způsobů bezpečného ukládání dat do vyrovnávací paměti a C ++ Standard Template Library (STL) poskytuje kontejnery, které mohou volitelně provádět kontrolu hranic, pokud programátor při přístupu k datům výslovně požaduje kontroly. Například vectorčlenská funkce a ' at()provede kontrolu hranic a vyvolá out_of_range výjimku, pokud kontrola hranic selže. C ++ se však chová stejně jako C, pokud kontrola hranic není explicitně volána. Pro C. existují také techniky, jak se vyhnout přetečení pufru.

Jazyky se silným typem, které neumožňují přímý přístup do paměti, jako jsou COBOL, Java, Python a další, ve většině případů zabraňují přetečení vyrovnávací paměti. Mnoho programovacích jazyků jiných než C/C ++ poskytuje kontrolu za běhu a v některých případech dokonce kontrolu při kompilaci, která může odeslat varování nebo vyvolat výjimku, když C nebo C ++ přepíše data a bude pokračovat v provádění dalších pokynů, dokud nebudou získány chybné výsledky, které mohou nebo nemusí způsobit selhání programu. Příklady takových jazyků patří Ada , Eiffel , Lisp , Modula-2 , Smalltalk , OCaml a takové C-deriváty jako cyklon , Rust a D . Prostředí bytecode Java a .NET Framework také vyžadují kontrolu hranic na všech polích. Téměř každý interpretovaný jazyk bude chránit před přetečením vyrovnávací paměti, což signalizuje dobře definovaný chybový stav. Často tam, kde jazyk poskytuje dostatek informací o typu k provádění kontrol hranic, je k dispozici možnost povolit nebo zakázat. Statická analýza kódu může odstranit mnoho dynamických vazeb a kontrol typu, ale špatné implementace a nepříjemné případy mohou výrazně snížit výkon. Softwaroví inženýři musí při rozhodování, které nastavení jazyka a překladače použít, pečlivě zvážit kompromisy mezi náklady na bezpečnost a výkon.

Používání bezpečných knihoven

Problém přetečení vyrovnávací paměti je v jazycích C a C ++ běžný, protože vystavují nízkoúrovňové reprezentativní detaily vyrovnávacích pamětí jako kontejnery pro datové typy. Přetečení vyrovnávací paměti je tedy třeba se vyhnout udržováním vysokého stupně správnosti v kódu, který provádí správu vyrovnávací paměti. Bylo také dlouho bylo doporučeno, aby se zabránilo standardní knihovny funkcí, které nejsou kontrolovány meze, například gets, scanfa strcpy. Morris worm vykořisťoval getshovor fingerd .

Dobře napsané a testované knihovny abstraktních datových typů, které centralizují a automaticky provádějí správu vyrovnávací paměti, včetně kontroly hranic, mohou omezit výskyt a dopad přetečení vyrovnávací paměti. Dva hlavní datové typy stavebních bloků v těchto jazycích, ve kterých běžně dochází k přetečení vyrovnávací paměti, jsou řetězce a pole; tedy knihovny zabraňující přetečení vyrovnávací paměti v těchto datových typech mohou poskytnout drtivou většinu potřebného pokrytí. Přesto nesprávné používání těchto bezpečných knihoven může mít za následek přetečení vyrovnávací paměti a další chyby zabezpečení; a jakákoli chyba v samotné knihovně je potenciální zranitelností. Mezi implementace „bezpečné“ knihovny patří „The Better String Library“, Vstr a Erwin. V OpenBSD operačního systému knihovny C poskytuje strlcpy a strlcat funkce, ale tito jsou více omezeny než plné implementace bezpečných knihovny.

V září 2007 byla zveřejněna technická zpráva 24731, připravená výborem pro normy C; určuje sadu funkcí, které jsou založeny na řetězcových a I/O funkcích standardní knihovny C s dalšími parametry velikosti vyrovnávací paměti. Účinnost těchto funkcí za účelem snížení přetečení vyrovnávací paměti je však sporná; vyžaduje zásah programátora na základě volání funkce, které je ekvivalentní intervenci, která by mohla zajistit bezpečné přetečení vyrovnávací paměti analogických starších standardních funkcí knihovny.

Ochrana proti přetečení vyrovnávací paměti

Ochrana proti přetečení vyrovnávací paměti se používá k detekci nejběžnějších přetečení vyrovnávací paměti kontrolou, že při návratu funkce nebyl změněn zásobník . Pokud byl změněn, program skončí s poruchou segmentace . Tři takové systémy jsou Libsafe a záplaty StackGuard a ProPolice gcc .

Implementace režimu DEP ( Data Execution Prevention ) společnosti Microsoft výslovně chrání ukazatel na nástroj Structured Exception Handler (SEH) před přepsáním.

Silnější ochrana zásobníku je možná rozdělením zásobníku na dva: jeden pro data a jeden pro návratnost funkcí. Toto rozdělení je k dispozici v jazyce Forth , i když to nebylo rozhodnutí o návrhu založené na zabezpečení. Bez ohledu na to nejde o úplné řešení přetečení vyrovnávací paměti, protože citlivá data jiná než zpáteční adresa mohou být stále přepsána.

Ochrana ukazatele

Přetečení vyrovnávací paměti funguje manipulací s ukazateli , včetně uložených adres. PointGuard byl navržen jako rozšíření kompilátoru, aby zabránil útočníkům spolehlivě manipulovat s ukazateli a adresami. Tento přístup funguje tak, že kompilátor přidá kód k automatickému kódování ukazatelů XOR před a po jejich použití. Teoreticky, protože útočník neví, jaká hodnota bude použita ke kódování/dekódování ukazatele, nemůže předpovědět, na co bude ukazovat, pokud jej přepíše novou hodnotou. PointGuard nebyl nikdy vydán, ale Microsoft implementoval podobný přístup počínaje Windows XP SP2 a Windows Server 2003 SP1. Microsoft namísto implementace ochrany ukazatelů jako automatické funkce přidal rutinu API, kterou lze volat. To umožňuje lepší výkon (protože se nepoužívá po celou dobu), ale zatěžuje programátora, aby věděl, kdy je to nutné.

Protože XOR je lineární, útočník může být schopen manipulovat s kódovaným ukazatelem přepsáním pouze dolních bajtů adresy. To může umožnit útok uspět, pokud je útočník schopen pokusit se o zneužití vícekrát nebo je schopen dokončit útok tak, že ukazatel ukáže na jedno z několika míst (například na jakékoli místo v sledu NOP). Společnost Microsoft přidala do svého schématu kódování náhodné otáčení, aby tuto slabinu vyřešila částečná přepsání.

Spustitelná ochrana prostoru

Ochrana spustitelného prostoru je přístup k ochraně proti přetečení vyrovnávací paměti, která brání spuštění kódu v zásobníku nebo na haldě. Útočník může použít přetečení vyrovnávací paměti k vložení libovolného kódu do paměti programu, ale s ochranou spustitelného prostoru způsobí jakýkoli pokus o spuštění tohoto kódu výjimku.

Některé CPU podporují funkci nazvanou NX („No eXecute“) nebo XD („eXecute Disabled“) bit, kterou lze ve spojení se softwarem použít k označení stránek dat (jako jsou ty, které obsahují zásobník a hromadu) jako čitelné a zapisovatelné, ale ne spustitelné.

Některé operační systémy Unix (např. OpenBSD , macOS ) se dodávají s ochranou spustitelného prostoru (např. W^X ). Některé volitelné balíčky zahrnují:

Novější varianty systému Microsoft Windows také podporují ochranu spustitelného prostoru, nazývanou Prevence spouštění dat . Mezi proprietární doplňky patří:

  • BufferShield
  • StackDefender

Ochrana spustitelného prostoru obecně nechrání před útoky return-to-libc ani žádným jiným útokem, který nespoléhá na spuštění kódu útočníků. V 64bitových systémech využívajících ASLR , jak je popsáno níže, však ochrana proti spustitelnému prostoru značně ztěžuje provádění takových útoků.

Randomizace rozložení adresního prostoru

Randomizace rozložení adresního prostoru (ASLR) je funkce počítačové bezpečnosti, která zahrnuje uspořádání pozic klíčových datových oblastí, obvykle včetně základny spustitelného souboru a polohy knihoven, haldy a zásobníku, náhodně v adresním prostoru procesu.

Randomizace adres virtuální paměti, na kterých lze nalézt funkce a proměnné, může ztěžování přetečení vyrovnávací paměti ztížit, ale ne znemožnit. Nutí také útočníka přizpůsobit pokus o vykořisťování individuálnímu systému, který maří pokusy internetových červů . Podobnou, ale méně efektivní metodou je rebase procesů a knihoven ve virtuálním adresním prostoru.

Hluboká kontrola paketů

Použití hloubkové inspekce paketů (DPI) dokáže na perimetru sítě detekovat velmi základní vzdálené pokusy o využití přetečení vyrovnávací paměti pomocí signatur útoku a heuristiky . Ty jsou schopny blokovat pakety, které mají podpis známého útoku, nebo pokud je detekována dlouhá řada pokynů bez operace (známé jako NOP-sled), byly tyto jednou použity, když je umístění užitečného zatížení exploitu mírně proměnlivé .

Skenování paketů není efektivní metoda, protože může zabránit pouze známým útokům a existuje mnoho způsobů, jak lze kódovat NOP-sled. Shellcode používaný útočníky může být alfanumerický , metamorfní nebo samočinně upravitelný, aby se vyhnul detekci heuristickými paketovými skenery a systémy detekce narušení .

Testování

Kontrola přetečení vyrovnávací paměti a oprava chyb, které je přirozeně způsobují, pomáhá předcházet přetečení vyrovnávací paměti. Jednou z běžných automatizovaných technik jejich objevování je fuzzování . Testování případů na hraně může také odhalit přetečení vyrovnávací paměti, stejně jako statická analýza. Jakmile je detekován potenciální přetečení vyrovnávací paměti, musí být opraveno; díky tomu je testovací přístup užitečný pro software, který je ve vývoji, ale méně užitečný pro starší software, který již není udržován ani podporován.

Dějiny

Přetečení vyrovnávací paměti bylo pochopeno a částečně veřejně dokumentováno již v roce 1972, kdy studie plánování počítačové technologie stanovila techniku: „Kód provádějící tuto funkci nekontroluje správně zdrojovou a cílovou adresu, což umožňuje překrytí částí monitoru To lze použít k vložení kódu do monitoru, což uživateli umožní převzít kontrolu nad zařízením. " Dnes by byl monitor označován jako jádro.

Nejstarší zdokumentované nepřátelské využití přetečení vyrovnávací paměti bylo v roce 1988. Byl to jeden z několika exploitů, které Morrisův červ využil k šíření přes internet. Využívaným programem byla služba na Unixu s názvem finger . Později, v roce 1995, Thomas Lopatic nezávisle znovu objevil přetečení vyrovnávací paměti a zveřejnil svá zjištění na seznamu adresátů zabezpečení Bugtraq . O rok později, v roce 1996, publikoval Elias Levy (také známý jako Aleph One) v časopise Phrack dokument „Smashing the Stack for Fun and Profit“, krok za krokem úvod do využívání zranitelností přetečení vyrovnávací paměti.

Od té doby nejméně dva hlavní internetoví červi využili přetečení vyrovnávací paměti ke kompromitaci velkého počtu systémů. V roce 2001 červ Code Red využil přetečení vyrovnávací paměti v Internetové informační službě (IIS) 5.0 společnosti Microsoft a v roce 2003 červ SQL Slammer napadl počítače se systémem Microsoft SQL Server 2000 .

V roce 2003 byly využity přetečení vyrovnávací paměti přítomné v licencovaných hrách pro Xbox , aby bylo možné na konzole spustit nelicencovaný software, včetně her homebrew , bez nutnosti hardwarových úprav, známých jako modchips . PS2 Nezávislost Exploit také použít přetečení vyrovnávací paměti, aby se dosáhlo stejné pro PlayStation 2 . Hack Twilight dokázal totéž s Wii pomocí přetečení vyrovnávací paměti v The Legend of Zelda: Twilight Princess .

Viz také

Reference

externí odkazy