Randomizace rozložení adresního prostoru - Address space layout randomization

Address space layout randomization ( ASLR ) je počítačový bezpečnostní technika podílí na prevenci zneužívání a korupce paměti zranitelností . Aby útočník nemohl spolehlivě přeskočit například na konkrétní zneužitou funkci v paměti, ASLR náhodně uspořádá pozice adresního prostoru klíčových datových oblastí procesu , včetně základny spustitelného souboru a pozic zásobníku , haldy a knihovny .

Dějiny

Linux PaX projekt nejprve razil termín „ASLR“, a vydával první návrh a implementaci ASLR v červenci 2001 jako náplast na linuxovém jádře . Je považována za kompletní implementaci, která také poskytuje opravu pro randomizaci zásobníku jádra od října 2002.

Prvním hlavním operačním systémem, který ve výchozím nastavení podporoval ASLR, byla OpenBSD verze 3.4 v roce 2003, následovaný Linuxem v roce 2005.

Výhody

Randomizace adresního prostoru brání některým typům bezpečnostních útoků tím, že útočníkovi ztěžuje předvídání cílových adres. Například útočníci, kteří se pokoušejí provést útoky return-to-libc, musí najít kód, který má být spuštěn, zatímco ostatní útočníci pokoušející se spustit shellcode vložený do zásobníku musí nejprve najít zásobník. V obou případech systém zakrývá útočníkům související adresy paměti. Tyto hodnoty je třeba uhodnout a chybný odhad není obvykle možné obnovit kvůli selhání aplikace.

Účinnost

Randomizace rozložení adresního prostoru je založena na nízké šanci, že útočník uhádne umístění náhodně umístěných oblastí. Zabezpečení je zvýšeno zvětšením vyhledávacího prostoru. Randomizace adresního prostoru je tedy efektivnější, když je v náhodných offsetech přítomna větší entropie . Entropie se zvýší buď zvýšením množství prostoru v oblasti virtuální paměti, během kterého dochází k randomizaci, nebo zkrácením období, během kterého k randomizaci dochází. Období je obvykle implementováno co nejmenší, takže většina systémů musí zvýšit randomizaci prostoru VMA.

Aby útočníci porazili randomizaci, musí úspěšně uhodnout pozice všech oblastí, na které chtějí zaútočit. U datových oblastí, jako je zásobník a halda, kde lze načíst vlastní kód nebo užitečná data, lze napadnout více než jeden stav pomocí snímků NOP pro kód nebo opakovaných kopií dat. To umožňuje útoku uspět, pokud je oblast randomizována na jednu z mála hodnot. Naproti tomu oblasti kódu, jako je základna knihovny a hlavní spustitelný soubor, je třeba přesně objevit. Tyto oblasti jsou často smíšené, například rámečky zásobníku jsou vloženy do zásobníku a knihovna je vrácena do.

Lze deklarovat následující proměnné:

  • (entropické kousky horní části zásobníku)
  • (entropické bity mmap()základny)
  • (entropické bity hlavní spustitelné základny)
  • (entropické bity haldy)
  • (napadené bity za pokus o entropii zásobníku)
  • (napadené bity za pokus o mmap()základní entropii)
  • (napadené bity za pokus hlavní spustitelné entropie)
  • (napadené bity za pokus o hromádkovou entropii)
  • (provedeny pokusy)
  • (celkové množství entropie: )

Abychom mohli vypočítat pravděpodobnost úspěchu útočníka, musíme předpokládat počet pokusů α provedených bez přerušení IPS založeného na podpisu, vymáhání práva nebo jiným faktorem; v případě hrubého vynucení nelze démona restartovat. Musíme také zjistit, kolik bitů je relevantních a kolik útoků je při každém pokusu napadeno, přičemž však ponecháme mnoho bitů, které musí útočník porazit.

Následující vzorce představují pravděpodobnost úspěchu pro danou sadu α pokusů o N bitů entropie.

  • (izolované hádání; adresní prostor je znovu randomizován po každém pokusu)
  • (systematické hrubé vnucování kopií programu se stejným adresním prostorem)

V mnoha systémech může jít o tisíce nebo miliony; na moderních 64bitových systémech tato čísla obvykle dosahují alespoň milionů, Hector Marco-Gisbert a Ismael Ripoll v roce 2014 ukázali, jak za určitých okolností obejít ASLR v 64bitových systémech za méně než jednu sekundu. U 32bitových systémů s rychlostí počítačů 2004, které mají 16 bitů pro randomizaci adres, Shacham a spolupracovníci uvádějí „... 16 bitů randomizace adres lze porazit útokem hrubou silou během několika minut“. Prohlášení autorů závisí na schopnosti několikrát bez prodlení zaútočit na stejnou aplikaci. Správné implementace ASLR, jako je ta zahrnutá v Grsecurity, poskytují několik metod k tomu, aby takové útoky hrubou silou byly neproveditelné. Jedna metoda zahrnuje zabránění spuštění spustitelného souboru po nastavitelnou dobu, pokud se několikrát zhroutil.

Android, a případně i další systémy, zavést Library Load Order randomizací , forma ASLR, které náhodně pořadí, v jakém jsou načteny knihovny. To dodává velmi malou entropii. Níže je uveden přibližný počet dodaných bitů entropie na potřebnou knihovnu; to ještě nepočítá s různými velikostmi knihoven, takže skutečná získaná entropie je opravdu o něco vyšší. Pamatujte, že útočníci obvykle potřebují pouze jednu knihovnu; matematika je složitější s více knihovnami a je také ukázána níže. Všimněte si, že případ útočníka používajícího pouze jednu knihovnu je zjednodušením složitějšího vzorce pro .

  • l (počet načtených knihoven)
  • β (počet knihoven použitých útočníkem)

Tyto hodnoty bývají nízké i pro velké hodnoty l , což je nejdůležitější, protože útočníci obvykle mohou používat pouze standardní knihovnu C, a proto se to často dá předpokládat . Avšak i pro malý počet knihoven je zde získáno několik kousků entropie; je tedy potenciálně zajímavé kombinovat randomizaci pořadí načítání knihoven s randomizací adres VMA, abychom získali několik dalších bitů entropie. Všimněte si, že tyto extra bity entropie nebudou platit pro jiné segmenty mmap (), pouze pro knihovny.

Snížení entropie

Útočníci mohou využít několik metod ke snížení entropie přítomné v randomizovaném adresním prostoru, od jednoduchých úniků informací až po napadení více bitů entropie na útok (například hromadným postřikem ). S tím se dá dělat jen málo.

Je možné uniknout informace o rozložení paměti pomocí zranitelnosti formátovacího řetězce . Funkce formátování řetězců, jako je printf, používají ke své práci seznam proměnných argumentů ; specifikátory formátu popisují, jak vypadá seznam argumentů. Kvůli způsobu, jakým se obvykle předávají argumenty, se každý specifikátor formátu přesune blíže k horní části rámečku zásobníku. Nakonec lze zpětný ukazatel a ukazatel rámce zásobníku extrahovat, přičemž se odhalí adresa zranitelné knihovny a adresa známého rámce zásobníku; to může zcela eliminovat randomizaci knihoven a zásobníků jako překážku útočníkovi.

Lze také snížit entropii v hromádce nebo hromadě. Zásobník obvykle musí být zarovnán na 16 bajtů, a proto se jedná o nejmenší možný interval randomizace; zatímco halda musí být zarovnaná na stránku, obvykle 4096 bajtů. Při pokusu o útok je možné zarovnat duplicitní útoky s těmito intervaly; NOP šoupátko může být použit s injekcí shell kódu , a řetězec ‚ /bin/sh‘ může být nahrazen ‚ ////////bin/sh‘ pro libovolný počet lomítky při pokusu o návrat do systému . Počet odstraněných bitů je přesně pro n napadených intervalů.

Takové poklesy jsou omezené kvůli množství dat v zásobníku nebo hromadě. Například zásobník je obvykle omezen naMB a roste na mnohem méně; to umožňuje maximálně19 bitů , i když konzervativnější odhad by byl kolem 8–10 bitů odpovídá 4–16  kB hromadné náplně. Halda na druhé straně je omezena chováním alokátoru paměti; v případě glibc jsou alokace nad 128 KB vytvářeny pomocí mmap , omezující útočníky na 5 bitů redukce. To je také omezující faktor při hrubém vynucování; ačkoli počet útoků, které je třeba provést, lze snížit, velikost útoků se natolik zvětší, že by se chování za určitých okolností mohlo stát systémům detekce narušení zřejmé .

Omezení

Adresy chráněné ASLR mohou být prosakovány různými bočními kanály, čímž se odstraní nástroj pro zmírnění. Nedávné útoky používaly informace, které unikly z tabulek procházející stránky vyrovnávací paměti prediktorů cílové větve CPU (BTB) nebo jednotky správy paměti (MMU). Není jasné, zda lze tuto třídu útoku ASLR zmírnit. Pokud nemohou, je přínos ASLR snížen nebo odstraněn.

Implementace

Několik běžných operačních systémů pro obecné účely implementuje ASLR.

Android

Android 4.0 Ice Cream Sandwich poskytuje randomizaci rozložení adresního prostoru (ASLR), která pomáhá chránit aplikace a aplikace třetích stran před zneužitím kvůli problémům se správou paměti. V systému Android 4.1 byla přidána spustitelná podpora nezávislá na poloze. Android 5.0 zrušil podporu non-PIE a vyžaduje, aby všechny dynamicky propojené binární soubory byly nezávislé na poloze. Randomizace řazení zatížení knihovny byla přijata do open-source projektu Android 26. října 2015 a byla zahrnuta ve verzi Android 7.0.

DragonFly BSD

DragonFly BSD má implementaci ASLR na základě modelu OpenBSD, přidaného v roce 2010. Ve výchozím nastavení je vypnutý a lze jej povolit nastavením sysctl vm.randomize_mmap na 1.

FreeBSD

Podpora pro ASLR se objevila ve FreeBSD 13.0. Ve výchozím nastavení je zakázáno.

iOS (iPhone, iPod touch, iPad)

Apple představil ASLR v iOS 4.3 (vydáno v březnu 2011).

KASLR byl představen v systému iOS 6. Randomizovaná základna jádra je 0x01000000 + ((1 + 0xRR) * 0x00200000), kde 0xRR je náhodný bajt ze SHA1 (náhodná data) generovaná iBootem (2. zaváděcí zavaděč iOS).

Linux

Linux kernel umožnil slabou formu ASLR ve výchozím nastavení, protože kernel verze 2.6.12, které vyšlo v červnu 2005. PaX a Exec Shield patchsets na Linux kernel poskytnout úplnější implementace. Oprava Exec Shield pro Linux dodává 19 bitů entropie zásobníku v období 16 bytů a 8 bitů randomizace základny mmap na období 1 stránky 4096 bytů. Tím se základna zásobníku umístí do oblasti o šířce 8 MB obsahující 524 288 možných pozic a základna mmap do oblasti o šířce 1 MB obsahující 256 možných pozic.

Poziční nezávislý spustitelný soubor (PIE) implementuje náhodnou základní adresu pro hlavní spustitelný binární soubor a funguje od roku 2003. Poskytuje stejnou náhodnost adres pro hlavní spustitelný soubor, jaký se používá pro sdílené knihovny. Funkce PIE se používá pouze pro démony orientované na síť-funkci PIE nelze použít společně s funkcí prelink pro stejný spustitelný soubor. Nástroj prelink implementuje randomizaci v době prelink spíše než za běhu, protože záměrně se prelink snaží zvládnout přemístění knihoven dříve, než bude muset dynamický linker, což umožňuje, aby k přemístění došlo jednou pro mnoho běhů programu. Výsledkem je, že randomizace skutečného adresního prostoru by porazila účel předběžného propojení.

Randomizaci lze pro konkrétní proces deaktivovat změnou její prováděcí domény pomocí personality(2).

Randomizace rozložení prostoru adres jádra

Randomizace rozvržení adresního prostoru jádra (KASLR) umožňuje randomizaci adresního prostoru pro obraz jádra Linuxu randomizací, kde je při zavádění umístěn kód jádra. KASLR byl sloučen do hlavní linie jádra Linuxu ve verzi jádra 3.14, vydané 30. března 2014. Když je zkompilována, lze ji při spuštění deaktivovat zadáním nokaslr jako jednoho z bootovacích parametrů jádra.

V procesorech x86 existuje několik útoků postranních kanálů, které by mohly propustit adresy jádra. Na konci roku 2017 byla vyvinuta izolace tabulky stránek jádra (KPTI aka KAISER), která má tyto útoky porazit. Tato metoda však nemůže chránit před útoky postranních kanálů využívající kolize ve strukturách prediktorů větví .

Microsoft Windows

Microsoft Windows Vista (vydaný v lednu 2007) a novější mají ASLR povoleno pouze pro spustitelné soubory a knihovny dynamických odkazů, které jsou konkrétně propojeny tak, aby umožňovaly ASLR. Z důvodu kompatibility není ve výchozím nastavení povolen pro jiné aplikace. Obvykle je nekompatibilní pouze starší software a ASLR lze plně povolit úpravou položky registru HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\MoveImagesnebo instalací sady Microsoft Enhanced Mitigation Experience Toolkit .

Randomizována jsou také umístění haldy , zásobníku , bloku prostředí procesu a bloku prostředí vláken. Bezpečnostní dokument od společnosti Symantec poznamenal, že ASLR v 32bitových Windows Vista nemusí být tak robustní, jak se očekávalo, a Microsoft uznal slabinu v jeho implementaci.

Hostitelské systémy prevence narušení, jako jsou WehnTrust a Ozone, také nabízejí ASLR pro operační systémy Windows XP a Windows Server 2003 . WehnTrust je open-source. Úplné podrobnosti o implementaci Ozone nejsou k dispozici.

V únoru 2012 bylo zaznamenáno, že účinnost ASLR na 32bitových systémech Windows před Windows 8 může být snížena v situacích s nízkou pamětí. Podobného účinku bylo ve stejném výzkumu dosaženo i na Linuxu. Testovací kód způsobil v systému Mac OS X 10.7.3 paniku jádra , takže nebylo jasné, jaké bylo jeho chování ASLR v tomto scénáři.

NetBSD

Podpora pro ASLR v uživatelské zemi se objevila v NetBSD 5.0 (vydáno v dubnu 2009) a byla ve výchozím nastavení povolena v NetBSD-aktuální v dubnu 2016.

Podpora jádra ASLR na amd64 byla přidána do aktuálního NetBSD v říjnu 2017, čímž se NetBSD stal prvním systémem BSD podporujícím KASLR.

OpenBSD

V roce 2003 se OpenBSD stal prvním hlavním operačním systémem, který podporoval silnou formu ASLR a ve výchozím nastavení ji aktivoval. OpenBSD dokončil podporu ASLR v roce 2008, když přidal podporu pro binární soubory PIE . Malloc (3) OpenBSD 4.4 (3) byl navržen tak, aby zlepšil zabezpečení využitím výhod funkcí ASLR a gap page implementovaných jako součást mmap systémového volání OpenBSD a detekoval chyby po použití bez použití. OpenBSD 5.3, který byl vydán v roce 2013, byl prvním hlavním operačním systémem, který ve výchozím nastavení umožňoval spustitelné soubory nezávislé na poloze na více hardwarových platformách a OpenBSD 5.7 aktivoval ve výchozím nastavení statické binární soubory nezávislé na poloze (Static-PIE).

Operační Systém Mac

V systému Mac OS X Leopard 10.5 (vydaném v říjnu 2007) představil Apple randomizaci pro systémové knihovny.

V systému Mac OS X Lion 10.7 (vydaném v červenci 2011) společnost Apple rozšířila jejich implementaci tak, aby zahrnovala všechny aplikace, přičemž uvádí, že „pro všechny aplikace byla vylepšena randomizace rozložení adresního prostoru (ASLR). Nyní je k dispozici pro 32bitové aplikace (stejně jako hromada ochrana paměti), díky čemuž jsou 64bitové a 32bitové aplikace odolnější vůči útoku. “

Od OS X Mountain Lion 10.8 (vydaný v červenci 2012) a novějších verzích je během bootování systému náhodně přemístěn celý systém včetně jádra, stejně jako kexty a zóny.

Solaris

ASLR byl zaveden v systému Solaris počínaje Solarisem 11.1 (vydáno v říjnu 2012). ASLR v Solarisu 11.1 lze nastavit v celém systému, na zónu nebo na binární bázi.

Vykořisťování

Byl předveden útok postranním kanálem využívající cílovou vyrovnávací paměť větve k obejití ochrany ASLR. V roce 2017 byl prokázán útok s názvem „ASLR⊕Cache“, který by mohl porazit ASLR ve webovém prohlížeči pomocí JavaScriptu.

Viz také

Reference

externí odkazy