Bezpečnost paměti - Memory safety
Bezpečnost paměti je stav ochrany před různými softwarové chyby a chyby zabezpečení při jednání s Paměť přístup, jako je přetečení vyrovnávací paměti a visící ukazatele.[1] Například, Jáva se říká, že je bezpečný pro paměť, protože jeho detekce chyb za běhu kontroluje hranice pole a dereference ukazatele.[1] V porovnání, C a C ++ povolit libovolně aritmetika ukazatele s ukazateli implementovanými jako adresy přímé paměti bez ustanovení pro kontrola mezí,[2] a tedy jsou potenciálně paměť není bezpečná.[3]
Dějiny
Chyby paměti byly nejprve zvažovány v kontextu řízení zdrojů a sdílení času systémy ve snaze vyhnout se problémům, jako je vidlicové bomby.[4] Vývoj byl většinou teoretický až do Morrisův červ, který využil přetečení bufferu ve Windows fingerd.[5] Pole zabezpečení počítače poté se rychle vyvinuly a eskalovaly s množstvím nových útoky tak jako útok zpět na libc a obranné techniky, jako je nespustitelný zásobník[6] a randomizace rozvržení adresního prostoru. Randomizace brání nejvíce přetečení zásobníku útočí a vyžaduje použití útočníka haldy postřik nebo jiné metody závislé na aplikaci k získání adres, i když její přijetí bylo pomalé.[5] Nasazení technologie se však obvykle omezují na randomizaci knihoven a umístění zásobníku.
Přístupy
Těžce zemřít,[7] jeho redesign DieHarder,[8] a Allinea Distributed Debugging Tool jsou speciální alokátory haldy, které přidělují objekty na jejich vlastní stránce s náhodnou virtuální pamětí, což umožňuje zastavit a ladit neplatná čtení a zápisy podle přesné instrukce, která je způsobuje. Ochrana se spoléhá na ochranu hardwarové paměti, a proto režie obvykle není podstatná, i když může významně růst, pokud program intenzivně využívá alokaci.[9] Randomizace poskytuje pouze pravděpodobnostní ochranu proti chybám paměti, ale lze ji často snadno implementovat do existujícího softwaru opětovným propojením binárního souboru.
Nástroj memcheck pro Valgrind používá simulátor instrukční sady a spouští zkompilovaný program ve virtuálním stroji pro kontrolu paměti a zajišťuje zaručenou detekci podmnožiny chyb běhové paměti. Obvykle však zpomaluje program o faktor 40,[10] a dále musí být výslovně informováni o vlastních alokátorech paměti.[11][12]
S přístupem ke zdrojovému kódu existují knihovny, které shromažďují a sledují legitimní hodnoty ukazatelů („metadata“) a kontrolují platnost každého přístupu ukazatele proti metadatům, například Sběratel odpadků Boehm.[13] Obecně lze bezpečnost paměti bezpečně zajistit pomocí sledování sběru odpadu a vložení runtime kontrol při každém přístupu do paměti; tento přístup má režii, ale menší než přístup Valgrind. Tento přístup využívají všechny jazyky shromažďované odpadky.[1] Pro C a C ++ existuje mnoho nástrojů, které provádějí transformaci kódu v době kompilace za účelem kontroly bezpečnosti paměti za běhu, například CheckPointer[14] a AddressSanitizer což ukládá průměrný faktor zpomalení 2.[15]
Jiný přístup používá statická analýza programu a automatizované dokazování věty zajistit, aby program neobsahoval chyby paměti. Například Rust programovací jazyk implementuje kontrolu výpůjčky k zajištění bezpečnosti paměti.[16] Nástroje jako Krytí nabídnout analýzu statické paměti pro C.[17] C ++ inteligentní ukazatele jsou omezenou formou tohoto přístupu.
Typy chyb paměti
Může se vyskytnout mnoho různých typů chyb paměti:[18][19]
- Chyby přístupu: neplatné čtení / zápis ukazatele
- Přetečení zásobníku - zápisy mimo vazbu mohou poškodit obsah sousedních objektů nebo interních dat (například informace o účetnictví pro halda ) nebo vrátit se adresy.
- Přečtení vyrovnávací paměti - out-of-bound čtení může odhalit citlivá data nebo pomoci obejít útočníky randomizace rozvržení adresního prostoru.
- Stav závodu - souběžné čtení / zápis do sdílené paměti
- Chyba neplatné stránky - přístup k ukazateli mimo prostor virtuální paměti. Dereference nulového ukazatele ve většině prostředí často způsobí výjimku nebo ukončení programu, ale může způsobit poškození operačního systému jádra nebo systémy bez ochrana paměti, nebo když použití nulového ukazatele zahrnuje velký nebo záporný posun.
- Použijte zdarma - dereferenční a visící ukazatel uložení adresy objektu, který byl odstraněn.
- Neinicializované proměnné - použije se proměnná, která nemá přiřazenou hodnotu. Může obsahovat nežádoucí nebo v některých jazycích poškozenou hodnotu.
- Nulový ukazatel dereference - dereferencování neplatného ukazatele nebo ukazatele na paměť, která nebyla přidělena
- Divoké ukazatele vznikají při použití ukazatele před inicializací do nějakého známého stavu. Vykazují stejné nepravidelné chování jako houpající se ukazatele, i když je méně pravděpodobné, že zůstanou nezjištěné.
- Únik paměti - když není sledováno využití paměti nebo je sledováno nesprávně
- Vyčerpání zásobníku - nastane, když programu dojde nedostatek místa v zásobníku, obvykle kvůli příliš hlubokému rekurze. A strážní stránka obvykle zastaví program, čímž zabrání poškození paměti, ale funguje s velkým skládané rámečky může stránku obejít.
- Vyčerpání haldy - program se snaží přidělit více paměti než dostupné množství. V některých jazycích musí být tato podmínka zkontrolována ručně po každém přidělení.
- Dvoulůžkový zdarma - opakované hovory na volný, uvolnit může předčasně uvolnit nový objekt na stejné adrese. Pokud nebyla přesná adresa znovu použita, může dojít k dalšímu poškození, zejména u alokátorů, kteří používají seznamy zdarma.
- Neplatné zdarma - předání neplatné adresy volný, uvolnit může poškodit halda.
- Neshoduje se zdarma - když se používá více alokátorů, pokus o uvolnění paměti funkcí deallocation jiného alokátoru[20]
- Nežádoucí aliasing - když je stejné místo v paměti přiděleno a dvakrát upraveno pro nesouvisející účely.
Reference
- ^ A b C Dhurjati, Dinakar; Kowshik, Sumant; Adve, Vikram; Lattner, Chris (1. ledna 2003). „Bezpečnost paměti bez kontrol za běhu nebo sběru odpadků“ (PDF). Sborník konference ACM SIGPLAN z roku 2003 o jazyku, překladači a nástroji pro vestavěné systémy. ACM: 69–80. doi:10.1145/780732.780743. ISBN 1581136471. Citováno 13. března 2017.
- ^ Koenig, Andrew. „Jak C ztěžuje kontrolu hranic pole“. Dr. Dobb. Citováno 13. března 2017.
- ^ Akritidis, Periklis (červen 2011). „Praktická bezpečnost paměti pro C“ (PDF). Technická zpráva - University of Cambridge. Počítačová laboratoř. University of Cambridge, Computer Laboratory. ISSN 1476-2986. UCAM-CL-TR-798. Citováno 13. března 2017.
- ^ Anderson, James P. „Studie plánování zabezpečení počítače“ (PDF). 2. Centrum elektronických systémů. ESD-TR-73-51. Citovat deník vyžaduje
| deník =
(Pomoc) - ^ A b van der Veen, Victor; dutt-Sharma, Nitish; Cavallaro, Lorenzo; Bos, Herbert (2012). „Chyby paměti: minulost, přítomnost a budoucnost“ (PDF). Přednášky z informatiky. 7462 (RAID 2012): 86–106. doi:10.1007/978-3-642-33338-5_5. ISBN 978-3-642-33337-8. Citováno 13. března 2017.
- ^ Wojtczuk, Rafal. „Porážka nevykonatelné opravy zásobníku solárního designéra“. insecure.org. Citováno 13. března 2017.
- ^ Berger, Emery D .; Zorn, Benjamin G. (1. ledna 2006). „DieHard: Pravděpodobná bezpečnost paměti pro nebezpečné jazyky“ (PDF). Sborník 27. konference ACM SIGPLAN o návrhu a implementaci programovacího jazyka. ACM: 158–168. doi:10.1145/1133981.1134000. Citováno 14. března 2017.
- ^ Novark, gen; Berger, Emery D. (1. ledna 2010). „DieHarder: Zabezpečení hromady“ (PDF). Sborník příspěvků ze 17. konference ACM o počítačové a komunikační bezpečnosti. ACM: 573–584. doi:10.1145/1866307.1866371. Citováno 14. března 2017.
- ^ „Ladění paměti v Allinea DDT“. Archivovány od originál dne 2015-02-03.
- ^ Gyllenhaal, Johne. „Použití Valgrindova nástroje Memcheck k vyhledání chyb a úniků paměti“. computing.llnl.gov. Archivovány od originál dne 7. listopadu 2018. Citováno 13. března 2017.
- ^ "Memcheck: detektor chyb paměti". Uživatelská příručka Valgrind. valgrind.org. Citováno 13. března 2017.
- ^ Kreinin, Yossi. „Proč jsou vlastní alokátory / fondy těžké“. Správná fixace. Citováno 13. března 2017.
- ^ „Použití sběrače odpadků jako detektoru netěsností“. www.hboehm.info. Citováno 14. března 2017.
- ^ „Sémantické designy: CheckPointer ve srovnání s jinými nástroji pro kontrolu bezpečnosti“. www.semanticdesigns.com. Semantic Designs, Inc.
- ^ „AddressSanitizerPerformanceNumbers“.
- ^ "Reference". Rustonomicon. Rust.org. Citováno 13. března 2017.
- ^ Bessey, Al; Engler, Dawson; Block, Ken; Chelf, Ben; Chou, Andy; Fulton, Bryan; Hallem, Seth; Henri-Gros, Charles; Kamsky, Asya; McPeak, Scott (1. února 2010). „O několik miliard řádků kódu později“. Komunikace ACM. 53 (2): 66–75. doi:10.1145/1646353.1646374. Citováno 14. března 2017.
- ^ Gv, Naveen. „Jak se vyhnout, najít (a opravit) chyby paměti v kódu C / C ++“. Cprogramming.com. Citováno 13. března 2017.
- ^ „CWE-633: Slabé stránky, které ovlivňují paměť“. Výčet slabosti komunity. MITER. Citováno 13. března 2017.
- ^ "CWE-762: Neshodné rutiny správy paměti". Výčet slabosti komunity. MITER. Citováno 13. března 2017.