Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento článek vysvětluje, jak Řízení aplikací pro firmy zabezpečuje PowerShell a jaká omezení platí. Zabezpečené chování PowerShellu se liší v závislosti na verzi Windows a PowerShellu, které používáte.
Zjištění zásad uzamčení systému v PowerShellu
PowerShell detekuje zásady pro zásady pro celý systém AppLockeru i App Control pro firmy . AppLocker je zastaralý. Řízení aplikací je upřednostňovaným systémem řízení aplikací pro Windows.
Detekce vynucování zásad řízení starší verze aplikace
PowerShell používá starší verzi rozhraní API pro řízení WldpGetLockdownPolicy aplikací ke zjištění dvou věcí:
- Vynucování zásad v rámci celého systému:
None,AuditEnforce - Jednotlivé zásady souborů:
None,Audit(povolené zásadami),Enforce(nepovolené zásadami)
Všechny verze PowerShellu (v5.1 – v7.x) podporují tuto detekci zásad řízení aplikací.
Nejnovější detekce vynucování zásad řízení aplikací
App Control zavedla nová rozhraní API v posledních verzích Windows. Počínaje verzí 7.3 používá PowerShell nové WldpCanExecuteFile rozhraní API k určení způsobu zpracování souboru. Windows PowerShell 5.1 nepodporuje toto nové rozhraní API. Nové rozhraní API má přednost před starší verzí rozhraní API pro jednotlivé soubory. PowerShell ale nadále používá starší verzi rozhraní API k získání konfigurace zásad pro celou systém. Pokud nové rozhraní API není dostupné, PowerShell se vrátí ke starému chování rozhraní API.
Nové rozhraní API poskytuje pro každý soubor následující informace:
WLDP_CAN_EXECUTE_ALLOWEDWLDP_CAN_EXECUTE_BLOCKEDWLDP_CAN_EXECUTE_REQUIRE_SANDBOX
Chování PowerShellu v zásadách uzamčení
PowerShell se může spouštět v interaktivních i neinteraktivních režimech.
- V interaktivním režimu je PowerShell aplikace příkazového řádku, která přebírá vstup příkazového řádku uživatelů jako příkazy nebo skripty ke spuštění. Výsledky se zobrazí zpět uživateli.
- V neinteraktivním režimu PowerShell načte moduly a spouští soubory skriptů bez vstupu uživatele. Datové proudy výsledků se buď ignorují, nebo přesměrují do souboru.
Interaktivní režim spuštěný v rámci vynucení zásad
PowerShell spouští příkazy v ConstrainedLanguage režimu. Tento režim brání interaktivním uživatelům ve spouštění určitých příkazů nebo spouštění libovolného kódu. Další informace oomezeních
Neinteraktivní režim spuštěný v rámci vynucení zásad
Když PowerShell spustí skript nebo načte modul, použije rozhraní API pro řízení aplikací k získání vynucení zásad pro soubor.
PowerShell verze 7.3 nebo vyšší používá WldpCanExecuteFile rozhraní API, pokud je k dispozici. Toto rozhraní API vrátí jeden z následujících výsledků:
-
WLDP_CAN_EXECUTE_ALLOWED: Zásada umožňuje, aby se soubor používal vFullLanguagerežimu s několika omezeními. -
WLDP_CAN_EXECUTE_BLOCKED: Zásady nepovolují soubor. PowerShell vyvolá chybu při spuštění nebo načtení souboru. -
WLDP_CAN_EXECUTE_REQUIRE_SANDBOX: Zásada soubor neschválí, ale dá se spustit nebo načíst vConstrainedLanguagerežimu.
Ve Windows PowerShellu 5.1 nebo v případě, že WldpCanExecuteFile rozhraní API není k dispozici, je chování PowerShellu pro jednotlivé soubory:
-
None: Soubor se spustí vFullLanguagerežimu s několika omezeními. -
Audit: Soubor se spustí nebo načte vFullLanguagerežimu bez omezení. V PowerShellu 7.4 nebo vyšších protokolech zásad protokoluje informace o omezeních do protokolů událostí Windows. -
Enforce: Soubor se spustí nebo načte vConstrainedLanguagerežimu.
Omezení PowerShellu v rámci zásad uzamčení
Když PowerShell zjistí, že systém je pod politikou uzamčení řízenou aplikací, použije omezení, dokonce i když je skript důvěryhodný a běží v režimu FullLanguage. Tato omezení brání známému chování PowerShellu, které by mohlo vést ke spuštění libovolného kódu v uzamčeném systému. Zásady uzamčení vynucují následující omezení:
Modul dot-sourcing s omezením exportu funkce se zástupnými cardy
Výsledkem každého modulu, který používá funkci dot-sourcing skriptu a exportu pomocí názvů zástupných znaků, je chyba. Blokování exportů se zástupnými znamény brání injektáži skriptu od škodlivého uživatele, který může vytvořit nedůvěryhodný skript, který získá tečkované zdroje do důvěryhodného modulu. Škodlivý skript pak může získat přístup k privátním funkcím důvěryhodného modulu.
Doporučení k zabezpečení: V modulu nepoužívejte funkci dot-sourcing skriptu a vždy exportujte funkce modulů s explicitními názvy (bez zástupných znaků).
Vnořený modul s omezením exportu funkce se zástupným znakem
Pokud nadřazený modul exportuje funkce pomocí zástupných znaků názvu funkce, PowerShell odebere ze seznamu exportu funkcí libovolný název funkce v vnořeném modulu. Blokování exportů zástupných znaků z vnořených modulů zabraňuje náhodnému exportu nebezpečných vnořených funkcí prostřednictvím porovnávání názvů se zástupnými cardy.
Doporučení k zabezpečení: Funkce modulu vždy exportujte s explicitními názvy (bez zástupných znaků).
Převod typu parametru interaktivního prostředí
Když je systém uzamčený, interaktivní relace PowerShellu se spouštějí v
ConstrainedLanguagerežimu, aby se zabránilo libovolnému spuštění kódu. Důvěryhodné moduly načtené do relace se spouštějí vFullLanguagerežimu. Pokud rutina důvěryhodného modulu používá pro své parametry komplexní typy, převod typů během vazby parametrů může selhat, pokud převod není povolený přes hranice důvěryhodnosti. K chybě dochází, když se PowerShell pokusí převést hodnotu spuštěním konstruktoru typu. Konstruktory typů nesmí běžet vConstrainedLanguagerežimu.V tomto příkladu je převod typu vazby parametru normálně povolený, ale při spuštění v
ConstrainedLanguagerežimu selže. KonstruktorConnectionPorttypu není povolený:PS> Create-ConnectionOnPort -Connection 22 Create-ConnectionOnPort: Cannot bind parameter 'Connection'. Cannot convert the "22" value of type "System.Int32" to type "ConnectionPort".Enter-PSHostProcessNepovolené rutinyRutina
Enter-PSHostProcessje zakázaná a v případě použití vyvolá chybu. Tento příkaz se používá pro relace připojení a ladění. Umožňuje připojení k jakékoli jiné relaci PowerShellu na místním počítači. Rutina je zakázaná, aby se zabránilo zpřístupnění informací a spuštění libovolného kódu.
Omezení PowerShellu v režimu omezeného jazyka
Skript nebo funkce, které zásady řízení aplikací neschválily, nejsou nedůvěryhodné. Když spustíte nedůvěryhodný příkaz, PowerShell buď zablokuje spuštění příkazu (nové chování), nebo spustí příkaz v ConstrainedLanguage režimu. Režim platí ConstrainedLanguage pro následující omezení:
Add-TypeNepovolené rutinyBlokování
Add-Typebrání spuštění libovolného kódu .NET.Import-LocalizedDataRutina s omezeným přístupemBlokování parametru SupportedCommand brání spuštění libovolného
Import-LocalizedDatakódu.Invoke-ExpressionRutina s omezeným přístupemVšechny bloky skriptu předané rutině
Invoke-Expressionse spouští vConstrainedLanguagerežimu, aby se zabránilo libovolnému spuštění kódu.New-ObjectRutina s omezeným přístupemRutina je omezena
New-Objectna použití pouze povolených typů .NET a COM, aby se zabránilo přístupu k nedůvěryhodným typům.ForEach-ObjectOmezení rutinVyvolání metody typu pro proměnné předané do objektu
ForeEach-Objectje zakázáno pro jakýkoli typ .NET, který není v seznamu schválených. Obecně platí, žeConstrainedLanguagerežim zakáže vyvolání jakékoli metody objektu s výjimkou schválených typů .NET, aby se zabránilo přístupu k nedůvěryhodným typům .NET.Export-ModuleMemberOmezení rutinPoužití
Export-ModuleMemberrutiny k exportu funkcí v souboru skriptu vnořeného modulu, kde podřízený modul není důvěryhodný a nadřazený modul je důvěryhodný, způsobí chybu. Blokování tohoto scénáře brání škodlivému nedůvěryhodnému modulu v exportu nebezpečných funkcí z důvěryhodného modulu.New-ModuleOmezení rutinPři spuštění
New-Modulev důvěryhodném skriptu je každý blok skriptu poskytnutý parametremScriptBlockoznačen ke spuštění vConstrainedLanguagerežimu, aby se zabránilo injektáži libovolného kódu do důvěryhodného kontextu spuštění.ConfigurationKlíčové slovo není povolenoKlíčové
Configurationslovo jazyka není povolené vConstrainedLanguagerežimu, aby se zabránilo útokům prostřednictvím injektáže kódu.classKlíčové slovo není povolenoKlíčové
classslovo jazyka není v režimu povolenéConstrainedLanguage, aby se zabránilo injektáži libovolného kódu.Omezení rozsahu zpracování bloků skriptů
Bloky podřízených skriptů se nesmí spouštět v oborech bloku nadřazeného skriptu, pokud bloky skriptu mají různé úrovně důvěryhodnosti. Například vytvoříte podřízenou relaci, když dot-source jeden skript do druhého. Blokování tohoto scénáře brání nedůvěryhodnému skriptu v získání přístupu k nebezpečným funkcím v oboru důvěryhodného skriptu.
Zabránění zjišťování nedůvěryhodných funkcí skriptu pomocí příkazu
Zjišťování příkazů PowerShellu nevrací funkce z nedůvěryhodného zdroje, jako je nedůvěryhodný skript nebo modul, do důvěryhodné funkce. Blokování zjišťování nedůvěryhodných příkazů brání injektáži kódu prostřednictvím vysazování příkazů.
Konverze z rozptylovací tabulky na objekt není povolena
ConstrainedLanguagerežim blokuje hashtable na převody objektů vDataoddílech datových souborů PowerShellu,.psd1aby se zabránilo potenciálním útokům prostřednictvím injektáže kódu.Automatický převod typů omezený
ConstrainedLanguagerežim blokuje automatický převod typů s výjimkou malé sady schválených bezpečných typů, aby se zabránilo potenciálním útokům prostřednictvím injektáže kódu.Omezení exportu funkce implicitního modulu
Pokud modul explicitně neexportuje funkce, PowerShell implicitně exportuje všechny funkce definovaného modulu automaticky jako funkci pohodlí. V
ConstrainedLanguagerežimu se implicitní exporty už neprojeví, když se modul načte přes hranice důvěryhodnosti. Blokování implicitních exportů brání nezamýšlené expozici nebezpečných funkcí modulu, které nejsou určené pro veřejné použití.Soubory skriptu se nedají importovat jako moduly.
PowerShell umožňuje importovat soubory skriptů (
.ps1) jako modul. Všechny definované funkce budou veřejně přístupné.ConstrainedLanguagerežim blokuje dovoz souboru skriptu, aby se zabránilo nezamýšlené expozici nebezpečných skriptových funkcí.Nastavení omezení proměnných
AllScopeConstrainedLanguagerežim zakáže možnost nastavitAllScopeproměnné. Omezením rozsahu proměnných zabráníte, aby proměnné zasahovaly do stavu relace důvěryhodných příkazů.Vyvolání metody typu není povoleno.
ConstrainedLanguagerežim nepovoluje vyvolání metody u neschválené typy. Blokování metod u neschválené typy zabraňuje vyvolání metod typu .NET, které můžou být nebezpečné nebo umožňují injektáž kódu.Nepovolují settery vlastností typu
ConstrainedLanguagerežim omezuje vyvolání setter vlastností u neschválené typy. Blokování setter vlastností u neschválené typy zabraňuje útokům prostřednictvím injektáže kódu.Vytvoření typu není povoleno.
ConstrainedLanguagerežim blokuje vytváření typů u neschválené typy, aby blokovaly nedůvěryhodné konstruktory, které by mohly povolit injektáž kódu.Operátor oboru modulu není povolený.
ConstrainedLanguagerežim neumožňuje použití operátoru oboru modulu. Například:& (Get-Module MyModule) MyFunction. Blokování operátoru oboru modulu brání přístupu k privátním funkcím a proměnným modulu.
Další texty
- Další informace o režimech jazyka PowerShellu najdete v tématu about_Language_Modes.
- Informace o tom, jak nakonfigurovat a používat Řízení aplikací, najdete v tématu Použití řízení aplikací pro PowerShell.