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
  • 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

  1. ^ 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.
  2. ^ Koenig, Andrew. „Jak C ztěžuje kontrolu hranic pole“. Dr. Dobb. Citováno 13. března 2017.
  3. ^ 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.
  4. ^ 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)
  5. ^ 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.
  6. ^ Wojtczuk, Rafal. „Porážka nevykonatelné opravy zásobníku solárního designéra“. insecure.org. Citováno 13. března 2017.
  7. ^ 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.
  8. ^ 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.
  9. ^ „Ladění paměti v Allinea DDT“. Archivovány od originál dne 2015-02-03.
  10. ^ 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.
  11. ^ "Memcheck: detektor chyb paměti". Uživatelská příručka Valgrind. valgrind.org. Citováno 13. března 2017.
  12. ^ Kreinin, Yossi. „Proč jsou vlastní alokátory / fondy těžké“. Správná fixace. Citováno 13. března 2017.
  13. ^ „Použití sběrače odpadků jako detektoru netěsností“. www.hboehm.info. Citováno 14. března 2017.
  14. ^ „Sémantické designy: CheckPointer ve srovnání s jinými nástroji pro kontrolu bezpečnosti“. www.semanticdesigns.com. Semantic Designs, Inc.
  15. ^ „AddressSanitizerPerformanceNumbers“.
  16. ^ "Reference". Rustonomicon. Rust.org. Citováno 13. března 2017.
  17. ^ 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.
  18. ^ 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.
  19. ^ „CWE-633: Slabé stránky, které ovlivňují paměť“. Výčet slabosti komunity. MITER. Citováno 13. března 2017.
  20. ^ "CWE-762: Neshodné rutiny správy paměti". Výčet slabosti komunity. MITER. Citováno 13. března 2017.