Ochranný kroužek - Protection ring

Kruhy oprávnění pro x86 jsou k dispozici v chráněném režimu

Ve výpočetní technice jsou domény hierarchické ochrany , často nazývané ochranné prsteny , mechanismy k ochraně dat a funkcí před poruchami (zlepšením odolnosti vůči chybám ) a škodlivým chováním (poskytováním počítačové bezpečnosti ). Tento přístup je diametrálně odlišný od zabezpečení založeného na schopnostech .

Počítačové operační systémy poskytují různé úrovně přístupu ke zdrojům. Ochranný kroužek je jedním ze dvou nebo více hierarchických úrovní či vrstev z privilegií v rámci architektury v počítačovém systému . To je obecně hardwarem vynucované některých CPU architekturách , které poskytují různé druhy procesorů na hardware nebo mikrokódu úrovni . Kroužky jsou uspořádány v hierarchii od nejvíce privilegovaných (nejdůvěryhodnější, obvykle číslovaná nula) po nejméně privilegované (nejméně důvěryhodné, obvykle s nejvyšším číslem vyzvánění). Ve většině operačních systémů je Ring 0 úrovní s nejvíce oprávněními a nejpříměji interaguje s fyzickým hardwarem, jako je CPU a paměť.

Mezi vyzváněcími kruhy jsou k dispozici speciální brány pro volání, které umožňují vnějšímu kruhu přístup k prostředkům vnitřního kruhu předdefinovaným způsobem, na rozdíl od umožnění libovolného použití. Správné bránění přístupu mezi prsteny může zlepšit zabezpečení tím, že zabrání programům z jednoho kruhu nebo úrovně oprávnění zneužívat prostředky určené pro programy v jiném. Například spywaru spuštěnému jako uživatelský program v Ring 3 by mělo být zabráněno v zapnutí webové kamery bez informování uživatele, protože hardwarový přístup by měl být funkcí Ring 1 vyhrazenou pro ovladače zařízení . Programy, jako jsou webové prohlížeče běžící na prstencích s vyššími čísly, musí požadovat přístup k síti, zdroj omezený na prsten s nižším číslem.

Implementace

Několik prstenů ochrany patřilo k nejrevolučnějším konceptům, které představil operační systém Multics , vysoce zabezpečený předchůdce dnešní řady operačních systémů Unix . Počítač sálových počítačů GE 645 měl nějaké řízení přístupu k hardwaru, ale to nestačilo k zajištění plné podpory prstenů v hardwaru, takže je Multics podporoval chycením přechodových kroužků v softwaru; jeho nástupce, Honeywell 6180 , je implementoval v hardwaru s podporou osmi prstenů. Většina systémů pro všeobecné použití však používá pouze dva prstence, i když hardware, na kterém běží, poskytuje více režimů CPU . Například Windows 7 a Windows Server 2008 (a jejich předchůdci) používají pouze dva prsteny, přičemž prsten 0 odpovídá režimu jádra a prsten 3 uživatelskému režimu , protože dřívější verze systému Windows běžely na procesorech, které podporovaly pouze dvě úrovně ochrany.

Mnoho moderních architektur CPU (včetně populární architektury Intel x86 ) obsahuje určitou formu kruhové ochrany, přestože operační systém Windows NT , podobně jako Unix, tuto funkci plně nevyužívá. OS/2 do určité míry používá tři prsteny: ring 0 pro kód jádra a ovladače zařízení, ring 2 pro privilegovaný kód (uživatelské programy s přístupovými oprávněními I/O) a ring 3 pro neprivilegovaný kód (téměř všechny uživatelské programy). V systému DOS jádro, ovladače a aplikace obvykle běží na ringu 3 (toto je však exkluzivní pro případ, kdy jsou použity ovladače v chráněném režimu a/nebo prodlužovače DOS; jako operační systém v reálném režimu systém běží bez účinné ochrany ), zatímco 386 správců paměti, jako je EMM386, běží na kruhu 0. Kromě toho může DR-DOS EMM386 3.xx místo toho volitelně spouštět některé moduly (například DPMS ) na kruhu 1. OpenVMS používá čtyři režimy nazývané (v pořadí podle snižujících se oprávnění) jádro, výkonný, supervizor a uživatel.

Obnovený zájem o tuto strukturu designu přišel s rozšířením softwaru Xen VMM , pokračující diskusí o monolitických vs. mikrojádrech (zejména v diskusních skupinách Usenet a webových fórech ), strukturou designu Microsoft Ring-1 jako součásti jejich iniciativy NGSCB a hypervisory založené na virtualizaci x86, jako je Intel VT-x (dříve Vanderpool).

Původní systém Multics měl osm prstenů, ale mnoho moderních systémů jich má méně. Hardware si je stále vědom aktuálního prstence vlákna provádějící instrukce , a to pomocí speciálního registru stroje. V některých systémech jsou oblastem virtuální paměti místo toho přiřazena čísla vyzvánění v hardwaru. Jedním z příkladů je Data General Eclipse MV/8000 , ve kterém první tři bity programového čítače (PC) sloužily jako kruhový registr. Například spuštění kódu s virtuálním počítačem nastaveným na 0xE200000 by například bylo automaticky v kruhu 7 a volání podprogramu v jiné sekci paměti by automaticky způsobilo přenos vyzvánění.

Hardware přísně omezuje způsoby, kterými lze řízení předávat z jednoho kruhu do druhého, a také vynucuje omezení typů přístupu do paměti, které lze provádět napříč kruhy. Na příkladu x86 existuje speciální struktura brány, na kterou odkazuje instrukce volání, která bezpečně přenáší řízení směrem k předdefinovaným vstupním bodům v nižších (důvěryhodnějších) prstencích; toto funguje jako volání supervizora v mnoha operačních systémech, které používají architekturu ring. Hardwarová omezení jsou navržena tak, aby omezila příležitosti pro náhodná nebo zlomyslná porušení zabezpečení. Navíc může privilegovanějšímu prstenu poskytnout speciální možnosti (například adresování skutečné paměti, které obchází hardware virtuální paměti).

Architektura ARM  v7 implementuje tři úrovně oprávnění: aplikace, operační systém a hypervisor. Neobvykle je úroveň 0 (PL0) nejméně privilegovaná úroveň, zatímco úroveň 2 (PL2) je nejvíce privilegovaná (hypervisor).

Kroužkovou ochranu lze v některých systémech kombinovat s režimy procesoru ( režim master/jádro/privilegovaný/ supervizor versus podřízený/neprivilegovaný/uživatelský režim). Operační systémy běžící na hardwaru podporujícím oba mohou používat obě formy ochrany nebo pouze jednu.

Efektivní využití kruhové architektury vyžaduje úzkou spolupráci mezi hardwarem a operačním systémem. Operační systémy navržené pro práci na více hardwarových platformách mohou prsteny využívat jen omezeně, pokud nejsou k dispozici na každé podporované platformě. Bezpečnostní model je často zjednodušen na „jádro“ a „uživatel“, i když hardware poskytuje jemnější zrnitost prostřednictvím prstenů.

Režimy

Režim supervizora

Z počítačového hlediska je režim supervizora hardwarově zprostředkovaný příznak, který lze změnit kódem spuštěným v softwaru na úrovni systému. Úkoly nebo vlákna na úrovni systému budou mít tento příznak nastavený, když budou spuštěny, zatímco aplikace v uživatelském prostoru nikoli. Tento příznak určuje, zda by bylo možné provádět operace strojového kódu, jako je úprava registrů pro různé tabulky deskriptorů, nebo provádění operací, jako je deaktivace přerušení. Myšlenka na provozování dvou různých režimů pochází z toho, že „s větší kontrolou přichází větší zodpovědnost“ - program v režimu supervizora je důvěryhodný, že nikdy nezklame, protože selhání může způsobit zhroucení celého počítačového systému.

Režim supervizora je „režim spouštění na některých procesorech, který umožňuje provádění všech instrukcí, včetně privilegovaných instrukcí. Může také poskytovat přístup k jinému adresnímu prostoru, hardwaru pro správu paměti a dalším periferním zařízením. Toto je režim, ve kterém operační systém obvykle běží. "

V monolitickém jádře běží operační systém v režimu supervizora a aplikace běží v uživatelském režimu. Jiné typy operačních systémů , jako jsou ty s exokernelem nebo mikrojádrem , toto chování nutně nesdílejí.

Několik příkladů ze světa PC:

  • Linux , macOS a Windows jsou tři operační systémy, které používají režim supervizor/uživatel. Chcete -li provádět specializované funkce, kód uživatelského režimu musí provést systémové volání do režimu správce nebo dokonce do prostoru jádra, kde důvěryhodný kód operačního systému provede potřebnou úlohu a vrátí provedení zpět do uživatelského prostoru. Další kód lze přidat do prostoru jádra pomocí modulů jádra, které lze načíst , ale pouze uživatelem s požadovanými oprávněními, protože tento kód nepodléhá řízení přístupu a bezpečnostním omezením uživatelského režimu.
  • DOS (pokud není načten žádný správce paměti 386, jako je EMM386 ), stejně jako další jednoduché operační systémy a mnoho integrovaných zařízení běží trvale v režimu správce, což znamená, že ovladače lze zapisovat přímo jako uživatelské programy.

Většina procesorů má alespoň dva různé režimy. Na x86 -processors mají čtyři různé režimy rozděleny do čtyř různých kruhů. Programy spuštěné v Ring 0 mohou se systémem dělat cokoli a kód spuštěný v Ring 3 by měl být schopen kdykoli selhat bez dopadu na zbytek počítačového systému. Ring 1 a Ring 2 se používají jen zřídka, ale lze je konfigurovat s různými úrovněmi přístupu.

Ve většině stávajících systémů má přechod z uživatelského režimu do režimu jádra vysoké náklady na výkon. Na základním požadavku bylo naměřeno, že getpidna většině strojů stojí 1 000–1500 cyklů. Z nich jen přibližně 100 je pro skutečný přechod (70 z prostoru uživatele do prostoru jádra a 40 zpět), zbytek je „režie jádra“. V mikrojádru L3 minimalizace této režie snížila celkové náklady na přibližně 150 cyklů.

Maurice Wilkes napsal:

... nakonec vyšlo najevo, že hierarchická ochrana, kterou prsteny poskytovaly, neodpovídala požadavkům programátora systému a poskytovala jen malé nebo žádné zlepšení jednoduchého systému, který měl pouze dva režimy. Ochranné prstence se propůjčily k efektivní implementaci v hardwaru, ale nebylo k nim možné říci nic jiného. [...] Atraktivita jemnozrnné ochrany zůstala, i když bylo vidět, že ochranné prsteny neposkytly odpověď ... To se opět ukázalo jako slepá ulička ...

Aby se dosáhlo výkonu a determinismu, některé systémy umísťují funkce, které by pravděpodobně byly považovány za logiku aplikace, nikoli za ovladače zařízení, v režimu jádra; jako příklady jsou uvedeny bezpečnostní aplikace ( řízení přístupu , brány firewall atd.) a monitory operačního systému. Alespoň jeden vestavěný systém pro správu databází, e X treme DB Kernel Mode , byl vyvinut speciálně pro nasazení v režimu jádra, aby poskytoval lokální databázi pro aplikační funkce založené na jádru a eliminoval kontextové přepínače, které by se jinak vyskytovaly při interakci funkcí jádra s databázovým systémem běžícím v uživatelském režimu.

Funkce se také někdy přesouvají přes prstence opačným směrem. Například jádro Linuxu vkládá do procesů sekci vDSO, která obsahuje funkce, které by normálně vyžadovaly systémové volání, tj. Kruhový přechod. Ale místo toho, aby prováděli syscall, tyto funkce používají statická data poskytovaná jádrem, což brání potřebě přechodového kroužku, který je lehčí než syscall. Funkci gettimeofday lze poskytnout tímto způsobem.

Režim hypervisoru

Nedávné CPU od Intelu a AMD nabízejí pokyny pro virtualizaci x86 pro hypervisora k ovládání hardwarového přístupu Ring 0. Přestože jsou vzájemně nekompatibilní, Intel VT-x (kódové označení „Vanderpool“) i AMD-V (kódové označení „Pacifica“) vytvářejí nový „Ring -1“, takže hostující operační systém může spouštět operace Ring 0 nativně, aniž by to ovlivnilo ostatní hosté nebo hostitelský OS.

Aby napomohly virtualizaci, vložily VT-x a SVM pod Ring 0. novou úroveň oprávnění. Oba přidávají devět nových instrukcí strojového kódu, které fungují pouze na „Ring −1“, určené k použití hypervisorem.

Úroveň oprávnění

Úroveň oprávnění v x86 instrukční sada ovládacích prvků je přístup k programu v současné době běží na procesoru ke zdrojům, jako jsou paměťové oblastí I / O portů a speciální instrukce. K dispozici jsou 4 úrovně oprávnění od 0, která je nejvíce privilegovaná, do 3, která je nejméně privilegovaná. Většina moderních operačních systémů používá pro jádro/výkonnou úroveň 0 a pro aplikační programy úroveň 3. Jakýkoli zdroj dostupný na úrovni n je také k dispozici na úrovních 0 až n, takže úrovně oprávnění jsou prsteny. Když se méně privilegovaný proces pokusí o přístup k vyššímu privilegovanému procesu, je do operačního systému nahlášena výjimka obecné chyby ochrany .

Není nutné používat všechny čtyři úrovně oprávnění. Současné operační systémy s širokým tržním podílem, včetně Microsoft Windows , macOS , Linux , iOS a Android, většinou používají mechanismus stránkování pouze s jedním bitem k určení úrovně oprávnění buď jako supervizor, nebo jako uživatel (bit U/S). Windows NT používá dvouúrovňový systém. Programy v reálném režimu v 8086 jsou prováděny na úrovni 0 (nejvyšší úroveň oprávnění), zatímco virtuální režim v 8086 spouští všechny programy na úrovni 3.

Mezi potenciální budoucí využití více úrovní oprávnění podporovaných řadou x86 ISA patří kontejnerizace a virtuální počítače . Jádro hostitelského operačního systému by mohlo používat pokyny s plným přístupem oprávnění ( režim jádra ), zatímco aplikace běžící na hostovaném operačním systému ve virtuálním počítači nebo kontejneru by mohly používat nejnižší úroveň oprávnění v uživatelském režimu. Jádro virtuálního stroje a hostujícího OS by mohlo samo využívat mezilehlou úroveň instrukčních oprávnění k vyvolávání a virtualizaci operací v režimu jádra, jako jsou systémová volání z pohledu hostujícího operačního systému.

IOPL

IOPL ( I / O úroveň Privilege ) příznak je příznak nalezen na všech IA-32 je kompatibilní x86 CPU . Zabírá bity 12 a 13 v registru FLAGS . V chráněném režimu a dlouhém režimu zobrazuje úroveň oprávnění I/O aktuálního programu nebo úlohy. Aby mohla úloha nebo program přistupovat k I/O portům, musí být aktuální úroveň oprávnění (CPL) (CPL0, CPL1, CPL2, CPL3) úlohy nebo programu menší nebo rovna IOPL .

IOPL lze změnit pomocí POPF(D)a IRET(D)pouze tehdy, když je aktuální úroveň oprávnění Ring 0.

Kromě IOPL se oprávnění I/O portu v TSS také podílejí na určování schopnosti úkolu přistupovat k I/O portu.

Různé

V systémech x86 se hardwarová virtualizace x86 ( VT -x a SVM ) označuje jako „ring -1“, režim správy systému se označuje jako „ring -2“, Intel Management Engine a AMD Platform Security Processor se někdy označují jako „prsten -3“.

Použití hardwarových funkcí

Mnoho hardwarových architektur CPU poskytuje mnohem větší flexibilitu, než využívají operační systémy , které běžně provozují. Správné používání složitých režimů CPU vyžaduje velmi úzkou spolupráci mezi operačním systémem a CPU, a proto má tendenci svázat OS s architekturou CPU. Když jsou OS a CPU speciálně navrženy pro sebe, není to problém (i když některé hardwarové funkce mohou být stále nevyužité), ale když je OS navržen tak, aby byl kompatibilní s více různými architekturami CPU, velká část funkce režimu CPU může OS ignorovat. Například důvod, proč Windows používá pouze dvě úrovně (ring 0 a ring 3), je ten, že některé hardwarové architektury, které byly v minulosti podporovány (například PowerPC nebo MIPS ), implementovaly pouze dvě úrovně oprávnění.

Multics byl operační systém navržený speciálně pro speciální architekturu CPU (který byl zase navržen speciálně pro Multics) a plně využíval dostupné režimy CPU. Byla to však výjimka z pravidla. Dnes tento vysoký stupeň spolupráce mezi operačním systémem a hardwarem není často nákladově efektivní, navzdory potenciálním výhodám v oblasti bezpečnosti a stability.

Účelem odlišných provozních režimů pro CPU je nakonec poskytnout hardwarovou ochranu před náhodným nebo záměrným poškozením systémového prostředí (a odpovídajícím narušením zabezpečení systému) softwarem. Pouze „důvěryhodné“ části systémového softwaru se mohou spouštět v neomezeném prostředí režimu jádra a poté v paradigmatických návrzích pouze tehdy, je -li to nezbytně nutné. Veškerý další software se spouští v jednom nebo více uživatelských režimech. Pokud procesor generuje v uživatelském režimu poruchu nebo výjimku, ve většině případů není ovlivněna stabilita systému; pokud procesor generuje v režimu jádra poruchu nebo výjimku, většina operačních systémů zastaví systém s neodstranitelnou chybou. Pokud existuje hierarchie režimů (zabezpečení založené na prstenci), chyby a výjimky na jedné úrovni oprávnění mohou destabilizovat pouze úrovně oprávnění s vyšším číslem. Chyba v Ring 0 (režim jádra s nejvyšším oprávněním) tedy způsobí pád celého systému, ale chyba v Ring 2 postihne pouze Ring 3 a dále a Ring 2 samotný, maximálně.

Přechody mezi režimy jsou na uvážení prováděcího vlákna, když je přechod z úrovně vysokého oprávnění na úroveň s nízkým oprávněním (jako z jádra do uživatelských režimů), ale přechody z nižších na vyšší úrovně oprávnění mohou probíhat pouze prostřednictvím zabezpečeného hardwarově ovládané „brány“, které jsou procházeny prováděním speciálních pokynů nebo když jsou přijímána externí přerušení.

Operační systémy Microkernel se pokoušejí minimalizovat množství kódu spuštěného v privilegovaném režimu za účelem zabezpečení a elegance , ale nakonec obětují výkon.

Viz také

Reference

  • Reference programátora Intel 80386

Další čtení