User Account Control (UAC) ve Windows 7 - technický popis
Na mnohých přednáškách o Windows 7, které jsem za poslední dobu absolvoval, se většina zúčastněných hlásila k tomu, že na Windows Vista (pokud s Vistou pracovali), vypínali UAC. Na mnohých webech o “tunění Windows” se také velmi často dočítám - “UAC, zbytečné, vypnout”. Windows 7 přinesly i v této oblasti značné zlepšení oproti situaci na Windows Vista. Pojďme se podívat co to UAC je, co má za cíl, jak funguje a sami pak posuďte, zdali UAC vypínat, či nikoliv.
Milovaný a nenáviděný User Account Control
V roce 2006 Microsoft přišel s technologií, která byla součástí Windows Vista - User Account Control. Tato technologie zajišťuje to, že i v případě, kdy je uživatel členem skupiny lokálních administrátorů (a je jedno jak se do ní dostal, zdali z DomainAdmins či lokálně přidaný), běží desktop a aplikace uživatele jako standardnímu uživateli - tedy ne pod administrátorským oprávněním. Pokud však aplikace vyžaduje administrátorské oprávnění, je uživateli zobrazeno dialogové okno, kde je nutný souhlas uživatele s povýšením oprávnění.
Nápad skvělý, nutné podotknout, že se v praxi setkávám se situacemi, kdy lokálně přihlášený uživatel je zároveň doménovým administrátorem… V době Windows XP, kde nebylo žádné UAC mne tato situace vcelku děsila, kde uživatel byl administrátorem počítače, ale zároveň všemocným pánem nad vším. Pokud by v takové chvíli spustil program, o kterém neví co program dělá - řekněme škodlivý kód (malware) - v tu chvíli se může naprosto bezostyšně šířit v místním počítači, ale také na veškeré systémy, kde je uživatel administrátorem (v případě DomainAdmins všude).
Z principu fungování UAC je zajištěna větší úroveň zabezpečení informací na koncových počítačích a serverech, a to zejména v podnikových prostředích a na počítačích, kde pracuje více uživatelů. Uživatel bez přímých administrátorských oprávnění nemůže nechtěně, či záměrně modifikovat součásti operačního systému a při vniknutí škodlivého software na počítač nejsou napáchány tak rozsáhlé škody - škodlivý kód běží pod standardním uživatelem.
Samozřejmě že v dnešní době je řada aplikací, které vyžadují administrátorský přístup k počítači, jde o to, zdali tento přístup je oprávněný či nikoliv. V době Windows XP nebyli vývojáři “nuceni” vyvíjet software pro Standard User Mód, aplikace tedy velice často zapisovaly svá nastavení do složek Windows, Program Files či do registry do větvě HKLM, což je ale z pohledu obyčejného uživatele špatně a tyto informace mají být součástí profilu uživatele či HKCU.
Standardní uživatel a aplikace
Jak jsem zmínil výše, při zapnutém UAC jsou všichni uživatelé “standardními uživateli”, tedy ne administrátory. Aplikace, které však vyžadují přístup do oblastí Windows, Program Files, HKEY_Local_Machine se dotáží, pokud uživatel administrátor souhlasí, oprávnění jsou povýšena a aplikace může zapisovat. Co však v případě běžného uživatele ?
V takovém případě přichází na řadu “virtualizace” souborového systému a registry. Při požadavku na zápis do složek, kam běžný uživatel nemá oprávnění zapisovat, jsou zápisy a čtení automaticky přesměrovány do %LocalAppData%VirtualStore, resp. do HKEY_ CURRENT_USERSoftwareClassesVirtualStore. Řekněme, že aplikace ukládá svoje nastavení do adresáře Windowsapp.ini, přesměrování proběhne do souboru C:Users\%username%AppDataLocalVirtualStoreWindowsApp.ini. Některé typy souborů jsou vyjmuty z procesu virtualizace: .exe, .bat, .scr, .vbs a další, což znamená, že pokud se aplikace pokouší aktualizovat sebe sama,… tak není vytvořena nová instance aplikace, ale je vyvolán dotaz na povýšení oprávnění. Virtualizaci zajišťuje filter driver SystemRoot%System32DriversLuafv.sys. V případě registry je situace obdobná, některé registry však nejsou virtualizovány, jak ukazuje následující obrázek
Tato virtualizace funguje pouze pro tzv. legacy aplikace, tedy aplikace, které neobsahují manifest s informací, že jsou určeny pro Windows Vista nebo Windows 7. Pokud aplikace manifest obsahují, předpokládá se, že aplikace umí s UAC zacházet, stejně tak, jako běžet pod standardním uživatelem. Pokud tedy aplikace obsahuje manifest, systém vrátí přístup odepřen a virtualizace nebude použita.
Některé aplikace zobrazují dotaz UAC na povýšení oprávnění, nicméně se může jednat například o kontroly uživatele, je-li členem skupiny administrátorů a podobné. Pro “obelhání” aplikace je možné použít shims z Application Compatibility Toolkit (ACT). V takových případech se nejčastěji používají:
Shim | Purpose |
ElevateCreateProcess | Mění CreateProcess na ošetření chyb ERROR_ELEVATION_REQUIRED voláním Application Information Service, která se dotazuje na povýšení oprávnění. |
ForceAdminAccess | Vrací aplikaci potvrzení, že uživatel je členem administrátorské skupiny. |
VirtualizeDeleteFile | Vrací aplikaci úspěšné mazání globálních souborů a adresářů. |
LocalMappedObject | Umožňuje přístup ke globálním objektům z uživatelského namespace. |
VirtualizeHKCRLite, VirtualizeRegisterTypeLib | Přesměrování globální registrace COM objektů do uživatelského umístění. |
Izolace procesů
Procesy, které jsou spouštěny s administrátorským oprávněním jsou izolovány od ostatních procesů, které jsou spuštěny pod standardním uživatelem, což znemožňuje škodlivému kódu zneužití emulace myši či klávesnice pro zvýšení oprávnění - procesy se nemohou ovlivňovat. Mechanizmus, který se používá ve Windows Vista a Windows 7 pro znemožnění posílán zpráv mezi okny s různými oprávněními, se nazývá User Interface Privilege Isolation (UIPI). Tento mechanizmus je založený na nové funkci Windows Integrity Mechanism. Jednotlivé Integrity Levels (IL) jsou reprezentovány pomocí Security Identifier (SID), stejně jako uživatelé, skupiny, kde úroveň přístupu je zapsána v Relative Identifier (RID) daného SID - viz následující tabulka.
Name | SID | RID |
Low Mandatory Level | S-1-16-4096 | 0x1000 |
Medium Mandatory Level | S-1-16-8192 | 0x2000 |
High Mandatory Level | S-1-16-12288 | 0x3000 |
System Mandatory Level | S-1-16-16384 | 0x4000 |
Jednotlivé Integrity Levels mají další pravidla, která definují jakým způsobem mohou mezi sebou jednotlivé úrovně komunikovat.
Pravidlo | Výsledek |
No-Write-Up | Proces s nižším IL nemůže modifikovat proces s vyšším IL |
No-Read-Up | Proces s nižším IL nemůže číst z procesu s vyšším IL |
No-Execute-Up | Proces s nižším IL nemůže spouštět objekty procesu s vyšším IL |
V následující tabulce je ukázka několika procesů a jejich přiřazení do různých Intergrity Levels.
Integrity Level | Ukázkový proces |
Low Mandatory Level | Protected Mode Internet Explorer a procesy spuštěné v Protected Mode Internet Explorer |
Medium Mandatory Level | Standard user a non-elevated AAM procesy |
High Mandatory Level | Proces běžící s administrátorským pověřením |
System Mandatory Level | Procesy Local System, Local Service, a Network Service |
Zobrazit informace o přístupech jednotlivých IL je možné pomocí ICACLS (lze následně i modifikovat) případně AccessChs
V případě, kdy se proces snaží otevřít objekt, je kontrolován integrity level ještě před tím, nežli je provedena standardní kontrola DACL pomocí funkce SeAccessCheck. Podle pravidel v tabulce výše může proces otevřít objekt pro zápis pouze v případě, kdy je integrity level identický či nižší.
V tuto chvíli je nutné poznamenat, že Internet Explorer 7,8 a vyšší běží pod Low Mandatory Integrity Level, kde aplikace může zapisovat pouze do dočasných souborů a cookies. Jakákoliv aplikace spuštěná pod existujícím Integrity Level automaticky dědí tento Integrity Level, jinými slovy, aplikace spuštěná v Internet Exploreru bude fungovat s ještě nižšími oprávněními, nežli je standard user.
UAC a Windows 7
Pokud jste dříve používali Windows Vista, tak jste možná zaznamenali, že se vás Windows 7 tak často neptají na povýšení pověření. Na žádost uživatelů byl změněn přístup UAC ke kontrole spouštěných aplikací a přiřazování oprávnění takovým aplikacím. Pokud spustíte nastavení UAC ve Windows 7, uvidíte, že výchozí nastavení je “medium”:
Jednotlivá nastavení lze popsat:
-
Vždy upozornit - toto je výchozí nastavení Windows Vista, uživatel bude dotazován na povýšení oprávnění u všech aplikací. Pokud aplikace vyžaduje zvýšení oprávnění, desktop je ztmaven a uživatel musí zvolit zdali souhlasí či nikoliv. Toto je nejbezpečnější nastavení, nicméně pokud vás stále nebaví klikat a potvrzovat - vracet se do časů Windows Vista, nevolte toto nastavení.
-
Upozornit, pokud program chce změnit nastavení operačního systému - toto je výchozí nastavení Windows 7. Operační systém se nedotazuje na povýšení u aplikací, které jsou přímo součástí operačního systému a jsou podepsány Windows certifikátem - např správa počítače,… V případě, že se nejedná o výše zmíněný program, desktop je ztmaven a uživatel dotázán na povýšení oprávnění. Toto je méně bezpečné nastavení, stále není možné simulovat klávesnici a myš pro automatizované povýšení oprávnění. Stále se jedná o velmi vysokou úroveň zabezpečení.
-
Upozornit, pokud program chce změnit nastavení operačního systému (nestmívat plochu) je identické s předchozím nastavením, ale při dotazu na povýšení není ztmavena plocha uživatele. Toto nastavení sebou nese riziko možného potenciálního zneužití aplikacemi, které simulují klávesnici či myš.
- UAC vypnuté - stejný stav jako Windows XP, tedy administrátor je administrátorem, nedochází k žádné virtualizaci souborů a registry, stejně tak se nepoužívají Integrity Levels - např. Internet Explorer běží pod kontextem administrátora.
Z výše uvedeného popisu UAC pod Windows 7 došlo k zásadnímu úbytku dotazů na povýšení oprávnění o cca 2/3.
Závěrem
Je na každém, zdali po přečtení, zvolí vypnutí UAC či nikoliv. Mé osobní doporučení: UAC nevypínejte až na případy, kdy je to nevyhnutelné, například z důvodů kompatibility aplikací apod. Rozhodně se nejedná o zbytečnou technologii, tak jak některé weby píší.
Pokud byste měli připomínky nápady,… k UAC nebo tu něco chybí, podělte se do diskuze pod článkem.
Další informace k UAC jsou například na stránkách TechNet.