Přeskočit na obsah

NX bit

Z Wikipedie, otevřené encyklopedie
(přesměrováno z NX Bit)

NX bit (anglicky Non eXecute bit) je technologie pro CPU sloužící k oddělení paměti pro instrukce procesoru (strojového kódu) a paměti pro data. Podobná vlastnost se nachází u Harvardské architektury procesoru (tam je ale řešena fyzickým oddělení paměti programu a dat). Avšak NX bit se stále více používá v tradiční Von Neumannově architektuře procesorů z bezpečnostních důvodů. Operační systém s podporou NX bitu může označit určité oblasti paměti jako nespustitelné. Procesor poté odmítne spouštět jakýkoli kód umístěný v těchto částí paměti. Všeobecné techniky, známé jako executable space protection, jsou používány k zabránění určitým typům škodlivého softwaru k převzetí vlády nad počítačem vložením jejich kódu do úložiště dat jiného programu a spuštěním jejich vlastního kódu v této oblasti. Toto je známo jako přetečení na zásobníku nebo přetečení bufferu. Intel označil tuto funkci jako XD bit (anglicky eXecute Disable). AMD používá název Enhanced Virus Protection (vylepšená ochrana proti virům). Pro ARM architekturu se používá funkce XN (anglicky eXecute Never). Tato funkce byla představena v ARM v6.[1]

Procesory řady x86 od 80286 mají podobnou vlastnost implementovanou na úrovni segmentace paměti. Avšak současné operační systémy, které mají implementovaný Flat memory model, nemohou tuto vlastnost používat. V 80386 a novějších procesorech x86 nebyl žádný příznak spuštění v záznamu tabulky stránek (stránkový popisovač) dokud. AMD nepřidalo „not executable” neboli NX bit do záznamů stránkovací tabulky v procesorech s architekturou AMD64, zprostředkovávající mechanismus, který řídí spouštění po stránkách než po celých segmentech, aby tato schopnost byla k dispozici pro operační systémy, které používají flat memory model. Page-level mechanismus je po celá používán v ostatních architekturách procesorů, jako jsou DEC (nyní HP) Alpha, SPARC, and IBM System/370-XA, System/390, z/ArchitecturePowerPC. Intel implementoval podobnou vlastnost do svého procesoru Itanium (Merced) s architekturou IA-64 v roce 2001, ale nezakomponoval vlastnost do oblíbenějších řad procesorů (Pentium, Celeron, Xeon, etc.). V architekturách x86 byl NX bit implementován firmou AMD pro použití v řadách AMD64 jako jsou Athlon64Opteron. Pojem NX bit se ujal a je obecně používán u podobných technologií v procesorech. poté co se AMD rozhodla začlenit tuto funkci do AMD64 instrukční sady, Intel implementoval podobnou funkci do x86 procesorů počínaje Pentiem 4, které využívaly jádra Prescott. NX bit odkazuje na bit číslo 63 (tj. nejvýznamnější bit) 64bitového záznamu ve stránkovací tabulce. Pokud je tento bit nastaven na 0, tak může být kód spuštěn z této stránky; pokud nastaven na 1, kód nemůže být spuštěn a je považován za data. Nutno poznamenat, že se používá pouze s Physical Address Extension (PAE) formátem stránkovací tabulky, protože x86 s původním 32bitovým formátem stránkovací tabulky nemá žádný bit 63 a tím pádem zde není bit k zakázání/povolení spuštění.

Softwarová emulace NX bitu

[editovat | editovat zdroj]

Před nástupem této funkce v hardwaru, různé operační systémy se pokoušely imitovat tuto funkci softwarově jako například W^X nebo Exec Shield. Budou popsány v článku později. Operační systém se schopností emulovat a / nebo využít NX bit může zabránit oblastem v zásobníku nebo haldě ve spuštění a může zabránit spustitelné části paměti v zapisování. To pomáhá chránit před exploity způsobujícími přetečení na zásobníku, zejména před takovými, které vnášejí a spouštějí vlastní kód, jako jsou červi SasserBlaster. Tyto útoky se spoléhají na některé části paměti, obvykle na zásobník, aby byly zapisovatelné a spustitelné, pokud tomu tak není, útok se nezdaří.

Implementace v OS

[editovat | editovat zdroj]

Mnoho operačních systémů implementuje nebo má politiku ochrany spustitelné oblasti. Zde je seznam takových to systémů v abecedním pořádku, každá technologie je seřazena od nejnovější po nejstarší. Pro některé technologie je tu přehled hlavních vlastností, které tyto technologie podporují. Přehled je uspořádaný takto:

  • Podporované procesory: (Čárkou oddělený seznam CPU architektur)
  • Emulace: (Ne) nebo (Nezávislé na architektuře) nebo (Čárkou oddělený seznam CPU architektur)
  • Ostatní podporované: (Žádné) nebo (Čárkou oddělený seznam CPU architektur)
  • Standardní distribuce: (Ne) nebo (Ano) nebo (Čárkou oddělený seznam distribucí nebo verzí, které podporují danou technologii)
  • Datum vydání: (Datum kdy byla poprvé vydána)

Na všech procesorech, které nejsou hardwarově podporovány, bude fungovat technologie, která dodává emulaci nezávislou na architektuře. „Ostatní podporované” jsou procesory, u kterých se využívá šedého místa k vytvoření explicitního NX bitu pomocí nějaké emulace.

Počáteční podpora pro NX bit na procesorech x86-64x86, které NX bit podporují. Poprvé se objevil v FreeBSD – CURRENT 8 června 2004. Je součástí FreeBSD od verze 5.3.

Jádro Linuxu v současnosti podporuje NX bit na procesorech x86-64 a x86 kde je implementován, tak i současné 64bitové procesory AMD, Intel, Transmeta a VIA. Podpora této funkce v 64bitovém módu u x86-64 procesorů byla přidána v roce 2004 Andim Kleenem, a později téhož roku Ingo Molnár přidal podporu pro 32bitový mód na 64bitových procesorech. Tyto funkce jsou ve stabilním vydání jádra Linuxu 2.6.8 od srpna 2004. Dostupnost v 32bitovém x86 jádře, které může běžet jak na 32bitovém x86 procesoru, tak i na 64bitových x86 kompatibilních procesorech, je významná, protože 32bitové x86 jádro by normálně neočekávalo NX bit, který poskytuje AMD64 nebo IA-64. Záplata NX enabler zajišťuje, že se jádra pokusí použít NX bit pokud je přítomen. Některé desktopové Linuxové distribuce jako je Fedora Core 6, UbuntuopenSUSE nemají ve výchozím nastavení zapnutou volbu HIGHMEM64, která je potřebná k přístupu k NX bitu v 32bitovém režimu, v jejich výchozí verzi jádra. Důvodem je, že režim PAE, který je potřeba pro NX bit, způsobuje u procesorů před Pentium Pro (včetně Pentium MMX), Celeron MPentium M bez podpory NX selhání při bootování. Další procesory, které nepodporují PAE, jsou AMD K6 a starší, Transmeta Crusoe, VIA C3 a starší a Geode GX a LX. VMware Workstation verze starší jak 4.0, Parallels Workstation verze starší jak 4.0, Microsoft Virtual PCVirtual Server nepodporují PAE na hostovaných operačních systémech. Fedora Core 6 a Ubuntu 9.10 a novější poskytují kernel-PAE balíček, který podporuje PAE a NX. Podpora ochrany paměti (NX) byla vždy dostupná v Ubuntu pro jakýkoli systém, který hardwarově podporuje 64bitové jádro nebo 32bitové serverové jádro. 32bitové desktopové PAE jádro (linux-image-generic-pae) v Ubuntu 9.10 a novější, také poskytuje PAE režim potřebný pro hardware s NX CPU funkcí. Pro systémy, které postrádají NX hardware, 32bitová jádra poskytují přiblížení k NX CPU funkci skrze softwarovou emulaci, která pomáhá blokovat spoustu exploitů, které může útočník spustit ze zásobníku nebo haldy. NX funkce byla také představena pro ostatní ne-x86 procesory, které podporují tuto funkci, v mnoha vydání.

EXEC Shield

[editovat | editovat zdroj]

Vývojář Red Hatu Ingo Molnár vydal opravu linuxového jádra nazvanou Exec Shield, která se přibližuje a uplatňuje NX funkci na 32bitových x86 procesorech. Oprava Exec Shield byla vydána a zařazena do seznamu oprav jádra (Linux kernel mailing list) druhého května 2003. Byla odmítnuta, protože zahrnovala rušivé změny kódu jádra, aby jádro zvládlo složité části emulace.

  • Podporované procesory: Všechny, na kterých Linux podporuje NX
  • Emulace: NX aproximace používající limitovaný segment kódu na IA-32 (x86) a kompatibilní
  • Ostatní podporované: Žádné
  • Standardní distribuce: Fedora CoreRed Hat Enterprise Linux
  • Datum vydání: 2. květen 2003

PaX NX technologie může emulovat NX bit NX funkci, nebo použít hardwarový NX bit. PaX pracuje na x86 procesorech, které nemají NX bit, jako je 32bitový x86. Ačkoli Pax poskytuje úplnější implementaci NX funkce než jeho blízký konkurent Exec Shield, vyžaduje mnohem více změn v jádru Linuxu a může být náchylný k znemožnění běhu zastaralých aplikací. Project PaX byl založen 1. října 2000. Později přidáno do verze 2.6 a stále se vyvíjí. Linuxové jádro stále není distribuováno s PaX (k lednu 2012). Oprava musí být aplikována samostatně.

macOS pro procesory Intel podporuje NX bit na všech procesorech podporovanými společností Apple (od verze 10.4.4 – první vydání pro procesory Intel – do dnes). macOS 10.4 podporoval pouze NX ochranu zásobníku. v macOS 10.5 vše 64bitové má ochranu NX zásobníku a haldy – W^X protection, včetně i386 (Core 2 nebo novější) a PowerPC (pouze G5).

Microsoft Windows

[editovat | editovat zdroj]

Poprvé na platformě x86 se funkce NX objevila ve Windows XP Service Pack 2 a Windows Server 2003 Service Pack 1. Microsoft Windows používá výlučně NX ochranu pro kritické služby Windows. ve Windows XP nebo Server 2003 je tato funkce nazývána Data Execution Prevention (zkráceně DEP) a může být aktivována na záložce „Upřesnit” ve vlastnostech systému. Když procesor x86 podporuje tuto funkci hardwarově, tak NX funkce jsou ve Windows XP/Server 2003 zapnuty automaticky. Pokud NX funkce nejsou podporovány procesory x86, tak není ochrana poskytnuta. „Software DEP” nesouvisí s NX bitem, podle Microsoftu se jedná o bezpečné strukturované zacházení s výjimkami (Safe Structured Exception Handling – SafeSEH). Software DEP/SafeSEH kontroluje, když dojde k výjimce, zda je tato výjimka registrovaná ve funkční tabulce pro danou aplikaci a vyžaduje, aby byla zabudována do programu. První implementace DEP neposkytovaly Address space layout randomization (ASLR), což umožňovalo útoky typu return-to-libc, které by mohly vést k vypnutí DEB Archivováno 9. 2. 2012 na Wayback Machine. během útoku. Dokumentace k PaX uvádí proč je ASLR nezbytný. Proof-of-concept detailně popisuje jakým způsobem by mohla být DEP vypnuta při nepřítomnosti ASLR. Je možné objevit způsob, jak provést úspěšný útok, pokud jsou útočníkům známy adresy připravených dat, jako jsou poškozené obrázky nebo MP3 soubory. Microsoft přidal ASLR funkci ve Windows Vista and Windows Server 2008, aby se vypořádali s tímto způsobem útoků. Mimo procesory x86 také existuje verze NX bitu pro Intel IA-64, která je implementovaná ve Windows na této architektuře.

Architektury, které podporují NetBSD 2.0 a novější (9. prosinec 2004), mají nespustitelný zásobník a haldu. Procesory co mohou rozlišit ochranu pro každou stránku jsou: alpha, amd64, hppa, i386 (s PAE), powerpc (ibm4xx), sh5, sparc (sun4m, sun4d), sparc64. Procesory co mohou podporovat pouze s těmito regiony rozlišení: i386 (bez PAE), PowerPC (např. macppc). Ostatní architektury nevyužívají nespustitelný zásobník a haldu. NetBSD ve výchozím stavu nepoužívá softwarovou emulaci, aby nabídl tyto funkce na těchto architekturách.

Hlavní článek: W ^ X Technologie v operačním systému OpenBSD, známá jako W ^ X, označuje zapisovatelné stránky ve výchozím stavu jako nespustitelné u procesorů, které toto podporují. Na 32bitových procesorech x86, je kódový segment nastaven, aby zahrnoval pouze část adresového prostoru a zajistil určitou úroveň ochrany spustitelných prostoru. W ^ X využívá NX bit na procesorech Alpha, AMD64, HPPA a SPARC. Procesory Intel 64 mohou nebo nemusí být podporovány, v závislosti na hardwaru. Intel přidal NX podporu (Intelem nazývanou XD bit) do novějších čipů. OpenBSD 3.3 vydaný 1.5. 2003 byl prvním operačním systémem, který obsahoval W ^ X.

  • Podporované procesory: Alpha, AMD64, HPPA, SPARC
  • Emulace: IA-32 (x86)
  • Ostatní podporované: Žádné
  • Standardní distribuce: Ano
  • Datum vydání: 1. květen 2003

Solaris podporoval globálně zákaz spuštění ze zásobníku na procesorech SPARC od verze Solaris 2.6 (1997). Ve verzi Solaris 9 (2002) byla přidána podpora zákazu spuštění ze zásobníku pro jednotlivé principy spouštění. Solaris 10 (2005) používá NX bit automaticky povolený na procesorech x86, které tuto funkci podporují. U 32bitového ABI legacy režimu byly vytvořeny výjimky pro programový zásobníkový segment. Velká skupina programů funguje beze změn. Avšak když program spadne, ochrana může být vypnuta skrze volbu enforce-prot-exec v EEPROM. Sun doporučuje hlásit tyto případy jako chyby v programu.

U Androidu 2.3 a v novějších, architektury, které mají podporu nespustitelných stránek, mají také podporu nespustitelného zásobníku a haldy.[2][3]

Funkční porovnání technologií

[editovat | editovat zdroj]

V této části textu jsou porovnávány vlastnosti NX technologií. Obecně NX bitové emulace jsou dostupné pouze na x86 procesorech. Jednotlivá oddělení se zabývají emulací a jsou zaměřena pouze na procesory x86, pokud není předem uvedeno jinak. Ačkoli bylo dokázáno, že některé NX bit emulace mají dosti nízkou režii, bylo také zjištěno, že tyto metody nemusí fungovat správně. Na druhou stranu mohou mít jiné metody vysokou režii a být velice spolehlivé. Zatím nebyla objevena metoda, která by nabídla výrazný kompromis mezi rychlostí zpracování, spolehlivosti nebo využití místa virtuální paměti.

Režie udává velikost výpočetní schopnosti procesoru, která je potřeba k tomu, aby daná technologie fungovala. Je to důležité, protože technologie, které nějakým způsobem emulují nebo nahrazují NX bit, budou většinou potřebovat nezanedbatelnou režii, zatímco využití hardwarového NX bitu nevyžaduje výraznou režii. Všechny emulované technologie vytvářejí režii z důvodu nadbytečného programování logiky, která musí být vytvořena pro řízení NX bitu v různých oblastech paměti, avšak vyhodnocení většinou provádí procesor, pokud je přítomen hardwarový NX bit a v tomto případě není potřeba žádné režie. Na procesorech s hardwarovým NX bitem nemá žádná z popisovaných technik vysokou režii, režie je stěží měřitelná, pokud není výslovně uvedeno jinak.

Exec Shield

[editovat | editovat zdroj]

Starší procesory Exec Shield podporují aproximaci (approximates – podle Inga Molnára) NX emulace tak, že sledují hranici horního kódového segmentu. K tomu je potřeba jen pár cyklů režie během změn kontextu, což je prakticky zanedbatelné.

PaX používá dvě metody emulace nazývané SEGMEXEC a PAGEEXEC. SEGMEXEC má měřitelnou, ale nízkou režii, typicky méně než 1 %. Je to konstantní skalár, která je způsobená zrcadlení m virtuální paměti. SEGMEXEC je také ovlivněn půlením virtuálního adresového prostoru úlohy, což umožňuje úloze přistupovat k menšímu množství paměti než normálně. Toto není problém, dokud úloha nepotřebuje více než polovinu normálního adresového prostoru, což je vzácné. SEGMEXEC nezpůsobuje, že by programy potřebovaly více systémové paměti (např.: RAM), jen pouze omezuje, kolik paměti může být přístupno. Na 32bitových procesorech to je 1,5 GiB místo 3 GiB. PaX dodává metodu podobnou Exec Shield aproximaci v PAGEEXEC jako zrychlení, ale pokud je vyšší paměť označena jako spustitelná, postrádá ochranu. V těchto případech se PaX vrátí ke starší metodě s variabilní režií používané PAGEEXECem k ochraně stránek pod CS limitem, což může přinést vyšší režii v určitých modelech přístupu k paměti. Když je PAGEEXEC použit na procesoru s hardwarovým NX bitem, tak je použit hardwarový NX bit a nedochází k žádné emulaci a tudíž nevzniká nijak významná režie.

Spolehlivost

[editovat | editovat zdroj]

Některé technologie přibližně emulují (neboli aproximují) NX bit na procesoru, který ho hardwarově nepodporuje. Jiné výhradně emulují NX bit pro tyto procesory, ale výrazně snižují výkon nebo obsah virtuální paměti. Níže porovnáváme tyto metody z hlediska spolehlivosti. Všechny popsané metody jsou 100% spolehlivé v přítomnosti hardwarového NX bitu, pokud není napsáno jinak.

Exec Shield

[editovat | editovat zdroj]

Pro starší procesory bez NX bitu Exec Shield selhává v ochraně stránek paměti pod limitem kódového segmentu. Funkce mprotect() označí vyšší paměť jako spustitelnou např.: zásobník a stejně tak označí i paměť pod tímto limitem jako spustitelnou a proto v těchto případech Exec shield selhává. Toto je cena za nízkou režii viz výše.

SEGMEXEC nespoléhá tolik na volatilní systémy, tak jako Exec Shield, a tak nenastávají podmínky, ve kterých finegrained NX bit emulace nemůže být vynucena. To však sníží virtuální adresový prostor na polovinu, jak je zmíněno výše. PAGEEXEC použije původní PAGEEXEC metody, které se používaly dříve pro urychlení, když datové stránky existují pod horním limitem kódového segmentu. V obou případech PaX emulace zůstává 100% spolehlivá. Žádné stránky se nestanou spustitelné, dokud operační systém je tak explicitně nenastaví. Je také zajímavé poznamenat, že PaX dodává omezení pro mprotect(), aby ochránil programy od označení paměti způsoby, které vytvářejí paměť užitečnou pro potenciální exploity. Tato taktika způsobuje, že určité aplikace přestanou fungovat, ale je možné pro tyto aplikace tuto ochranu vypnout.

Kontrola skrze omezení

[editovat | editovat zdroj]

Některé techniky umožňují spustitelné programy označit, takže operační systém ví, u kterých programů může snížit omezení pomocí NX technologie. Různé systémy poskytují různé řízení, jednotlivé způsoby řízení jsou popsány níže.

Exec Shield

[editovat | editovat zdroj]

Exec Shield doplňuje označení spustitelnosti a kontroluje dvě ELF hlavičky označení, které říkají zásobníku, zda má být spustitelný. Jedná se o tzv. PT_GNU_STACK a PT_GNU_HEAP. Exec Shield umožňuje řízení nastavit jak pro spustitelné soubory, tak i pro knihovny. Když spustitelný soubor nahraje potřebnou knihovnu, je mu sníženo omezení. Spustitelný soubor zdědí toto označení a má také snížené omezení.

PaX dodává přesnou kontrolu nad ochranou. To umožňuje individuální řízení nad následujícími funkcemi technologií pro každý spustitelný binární soubor:

Více informací o těchto omezeních naleznete v článku o PaX. PaX úplně ignoruje obojí PT_GNU_STACK a PT_GNU_HEAP. V jisté době měl PaX konfigurační možnosti na počest těmto nastavením, ale byly nedávno úmyslně odstraněny z bezpečnostních důvodů. Také i proto, že nebyly považovány za užitečné. Stejného výsledku funkce PT_GNU_STACK lze běžně dosáhnout i vypnutím mprotect() omezení, mprotect nahraje normálně program do zásobníku. Toto nemusí být vždy pravda, pro situace, kde toto selže. Odstraněním omezení veškerého spustitelného prostoru se provede jednoduše vypnutím PAGEEXEC a SEGMEXEC a tím úloha dostane stejnou ochranu na spustitelné oblasti jako na systému bez PaX.

Když je NX podporován, tak je ve výchozím stavu zapnutý. Windows umožňují programům řízení, což stránkám znemožní jejich spuštění přes jejich API, tak přes sekci hlaviček v PE souboru. U API runtime přístup k NX bitu je vystaven skrze Win32. API volá VirtualAlloc[Ex] a VirtualProtect[Ex]. v těchto funkcích je ochrana stránky specifikovaná programátorem. Každá stránka může být individuálně označena jako spustitelná nebo nespustitelná. Navzdory nedostatku podpory předchozího x86 hardwaru nastavení stránky jako spustitelná nebo nespustitelná bylo poskytováno již od začátku. Na procesorech bez podpory NX bitu přítomnost „spustitelného” atributu neměla žádný efekt. To bylo zdokumentováno a jako výsledek většina programátorů to používala správně. V souboru PE formátu každá jeho část může specifikovat jeho spustitelnost. Označení spustitelnosti již od začátku PE formátu standardní odkazovače vždy používaly označení správně, dokonce dlouho před NX bitem. Díky těmto věcem byl Windows schopný posílit NX bitem i staré programy. Za předpokladu, že programátor zkompiloval aplikace podle „best practices”, měly by pracovat správně i po posílení NX bitem. Jenom v několika málo případech se vyskytly nějaké problémy. Běhové prostředí .NET Runtime od Microsoftu měl problémy s NX bitem a byly opraveny.

Ačkoli procesor Microsoft Xboxu nemá NX bit, novější verze XDK nastavuje limit kódového segmentu na začátku jádra v sekci .data (žádný kód by od tohoto bodu za normálních okolností neměl být). Toto byla pravděpodobně reakce na exploit umístěný v uložené pozici u hry 007: Agent Under Fire. Avšak tato změna neopravuje tento problém, protože paměť, ze které se spouští, se nachází v jádře pod sekcí .data. Od verze 51xx, byla tato změna implementována také do jader nových XBoxů. To odstranilo techniku starých exploitů pomocí TSR. Na trh byly rychle vypuštěny nové verze, podporující tuto novou verzi, protože základní exploit byl neúčinný.

V tomto článku byl použit překlad textu z článku NX bit na anglické Wikipedii.

  1. "APX a XN (execute never) bity byly přidány do VMSAv6 [Virtual Memory System Architecture]", Referenční manuál k ARM architektuře, citováno 1. 12 2009.
  2. "Zdrojový kód Androidu vynucující NX", Android Source Repository Change[nedostupný zdroj], citováno 14.07. 2011.
  3. "Požadavky hardwaru pro NX", Android Code Review Archivováno 26. 8. 2011 na Wayback Machine., citováno 14.07. 2011.

Externí odkazy

[editovat | editovat zdroj]