Jak funguje řízení aplikací s PowerShellem
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
,Audit
Enforce
- 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_ALLOWED
WLDP_CAN_EXECUTE_BLOCKED
WLDP_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
: Soubor je schválen zásadami a používá se vFullLanguage
režimu s několika omezeními.WLDP_CAN_EXECUTE_BLOCKED
: Soubor není schválen zásadami. PowerShell vyvolá chybu při spuštění nebo načtení souboru.WLDP_CAN_EXECUTE_REQUIRE_SANDBOX
: Soubor není schválen zásadou, ale dá se spustit nebo načíst vConstrainedLanguage
rež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í vFullLanguage
režimu s několika omezeními.Audit
: Soubor se spustí nebo načte vFullLanguage
rež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 vConstrainedLanguage
režimu.
Omezení PowerShellu v rámci zásad uzamčení
Když PowerShell zjistí, že je systém v zásadách uzamčení řízení aplikací, použije omezení, i když je skript důvěryhodný a spuštěný v FullLanguage
režimu. 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
ConstrainedLanguage
režimu, aby se zabránilo libovolnému spuštění kódu. Důvěryhodné moduly načtené do relace se spouštějí vFullLanguage
rež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 vConstrainedLanguage
režimu.V tomto příkladu je převod typu vazby parametru normálně povolený, ale při spuštění v
ConstrainedLanguage
režimu selže. KonstruktorConnectionPort
typu 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-PSHostProcess
Nepovolené rutinyRutina
Enter-PSHostProcess
je 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é nejsou schváleny zásadami řízení aplikací, 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-Type
Nepovolené rutinyBlokování
Add-Type
brání spuštění libovolného kódu .NET.Import-LocalizedData
Rutina s omezeným přístupemBlokování parametru SupportedCommand brání spuštění libovolného
Import-LocalizedData
kódu.Invoke-Expression
Rutina s omezeným přístupemVšechny bloky skriptu předané rutině
Invoke-Expression
se spouští vConstrainedLanguage
režimu, aby se zabránilo libovolnému spuštění kódu.New-Object
Rutina s omezeným přístupemRutina je omezena
New-Object
na použití pouze povolených typů .NET a COM, aby se zabránilo přístupu k nedůvěryhodným typům.ForEach-Object
Omezení rutinVyvolání metody typu pro proměnné předané do objektu
ForeEach-Object
je zakázáno pro jakýkoli typ .NET, který není v seznamu schválených. Obecně platí, žeConstrainedLanguage
rež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-ModuleMember
Omezení rutinPoužití
Export-ModuleMember
rutiny 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-Module
Omezení rutinPři spuštění
New-Module
v důvěryhodném skriptu je každý blok skriptu poskytnutý parametremScriptBlock
označen ke spuštění vConstrainedLanguage
režimu, aby se zabránilo injektáži libovolného kódu do důvěryhodného kontextu spuštění.Configuration
Klíčové slovo není povolenoKlíčové
Configuration
slovo jazyka není povolené vConstrainedLanguage
režimu, aby se zabránilo útokům prostřednictvím injektáže kódu.class
Klíčové slovo není povolenoKlíčové
class
slovo 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ů.
Hashtable to object conversion not allowed
ConstrainedLanguage
režim blokuje hashtable na převody objektů vData
oddílech datových souborů PowerShellu,.psd1
aby se zabránilo potenciálním útokům prostřednictvím injektáže kódu.Automatický převod typů omezený
ConstrainedLanguage
rež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
ConstrainedLanguage
rež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é.ConstrainedLanguage
režim blokuje dovoz souboru skriptu, aby se zabránilo nezamýšlené expozici nebezpečných skriptových funkcí.Nastavení omezení proměnných
AllScope
ConstrainedLanguage
režim zakáže možnost nastavitAllScope
promě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.
ConstrainedLanguage
rež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
ConstrainedLanguage
rež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.
ConstrainedLanguage
rež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ý.
ConstrainedLanguage
rež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.