Sdílet prostřednictvím


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, 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_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 v FullLanguage 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 v ConstrainedLanguage 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í v FullLanguage režimu s několika omezeními.
  • Audit: Soubor se spustí nebo načte v FullLanguage 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 v ConstrainedLanguage 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í v FullLanguage 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 v ConstrainedLanguage 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. Konstruktor ConnectionPort 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é rutiny

    Rutina 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é rutiny

    Blokování Add-Type brání spuštění libovolného kódu .NET.

  • Import-LocalizedData Rutina s omezeným přístupem

    Blokování parametru SupportedCommand brání spuštění libovolného Import-LocalizedData kódu.

  • Invoke-Expression Rutina s omezeným přístupem

    Všechny bloky skriptu předané rutině Invoke-Expression se spouští v ConstrainedLanguage režimu, aby se zabránilo libovolnému spuštění kódu.

  • New-Object Rutina s omezeným přístupem

    Rutina 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í rutin

    Vyvolá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í, že ConstrainedLanguage 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í rutin

    Použ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í rutin

    Při spuštění New-Module v důvěryhodném skriptu je každý blok skriptu poskytnutý parametrem ScriptBlock označen ke spuštění v ConstrainedLanguage 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í povoleno

    Klíčové Configuration slovo jazyka není povolené v ConstrainedLanguage režimu, aby se zabránilo útokům prostřednictvím injektáže kódu.

  • class Klíčové slovo není povoleno

    Klíč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ů v Data 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 nastavit AllScope 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