Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Den här artikeln beskriver hur App Control för företag skyddar PowerShell och de begränsningar som det medför. Det säkra beteendet för PowerShell varierar beroende på vilken version av Windows och PowerShell du använder.
Så identifierar PowerShell en princip för systemlåsning
PowerShell identifierar både AppLocker och App Control for Business system wide polices. AppLocker är inaktuellt. Appkontroll är det föredragna programkontrollsystemet för Windows.
Identifiering av tvingande principer för äldre appkontroll
PowerShell använder det äldre Api:et för appkontroll WldpGetLockdownPolicy för att identifiera två saker:
- Systemomfattande principframtvingande:
None,Audit,Enforce - Enskild filprincip:
None,Audit(tillåts av princip)Enforce(tillåts inte av principen)
Alla versioner av PowerShell (v5.1 – v7.x) stöder den här appkontrollprincipidentifieringen.
Senaste tvingande identifiering av appkontrollprincip
App Control introducerade nya API:er i de senaste versionerna av Windows. Från och med version 7.3 använder PowerShell det nya WldpCanExecuteFile API:et för att bestämma hur en fil ska hanteras. Windows PowerShell 5.1 stöder inte det här nya API:et. Det nya API:et har företräde framför det äldre API:et för enskilda filer.
PowerShell fortsätter dock att använda det äldre API:et för att hämta systemomfattande principkonfiguration. Om det nya API:et inte är tillgängligt återgår PowerShell till det gamla API-beteendet.
Det nya API:et innehåller följande information för varje fil:
WLDP_CAN_EXECUTE_ALLOWEDWLDP_CAN_EXECUTE_BLOCKEDWLDP_CAN_EXECUTE_REQUIRE_SANDBOX
PowerShell-beteende under låsningsprincip
PowerShell kan köras i både interaktiva och icke-interaktiva lägen.
- I interaktivt läge är PowerShell ett kommandoradsprogram som tar användarnas kommandoradsindata som kommandon eller skript att köra. Resultaten visas tillbaka till användaren.
- I icke-interaktivt läge läser PowerShell in moduler och kör skriptfiler utan användarindata. Resultatdataströmmar ignoreras eller omdirigeras till en fil.
Interaktivt läge som körs under principframtvingande
PowerShell kör kommandon i ConstrainedLanguage läge. Det här läget hindrar interaktiva användare från att köra vissa kommandon eller köra godtycklig kod. Mer information om begränsningarna i det här läget finns i avsnittet PowerShell-begränsningar under låsningsprincip i den här artikeln.
Icke-interaktivt läge som körs under principframtvingande
När PowerShell kör ett skript eller läser in en modul använder den App Control-API:et för att hämta principtillämpningen för filen.
PowerShell version 7.3 eller senare använder API:et om det WldpCanExecuteFile är tillgängligt. Det här API:et returnerar något av följande resultat:
-
WLDP_CAN_EXECUTE_ALLOWED: Filen är godkänd av en princip och används iFullLanguageläge med några begränsningar. -
WLDP_CAN_EXECUTE_BLOCKED: Filen är inte godkänd av principen. PowerShell genererar ett fel när filen körs eller läses in. -
WLDP_CAN_EXECUTE_REQUIRE_SANDBOX: Filen är inte godkänd av principen, men den kan fortfarande köras eller läsas in iConstrainedLanguageläge.
I Windows PowerShell 5.1 eller om WldpCanExecuteFile API:et inte är tillgängligt är PowerShells beteende per fil:
-
None: Filen körs iFullLanguageläget med några begränsningar. -
Audit: Filen körs eller läses in iFullLanguageläge utan begränsningar. I PowerShell 7.4 eller senare loggar principen begränsningsinformation till Windows-händelseloggarna. -
Enforce: Filen körs eller läses in iConstrainedLanguageläge.
PowerShell-begränsningar under låsningsprincip
När PowerShell identifierar att systemet är under en appkontrollslåsningsprincip tillämpas begränsningar även om skriptet är betrott och körs i FullLanguage läge. Dessa begränsningar förhindrar kända beteenden i PowerShell som kan leda till godtycklig kodkörning i ett låst system. Låsningsprincipen tillämpar följande begränsningar:
Modul dot-sourcing med begränsning av jokerteckenfunktionsexport
Alla moduler som använder funktioner för dot-sourcing och export av skript med jokertecken resulterar i ett fel. Blockering av jokerteckenexport förhindrar skriptinmatning från en obehörig användare som kan plantera ett obetrott skript som får punktkälla till en betrodd modul. Det skadliga skriptet kan sedan få åtkomst till den betrodda modulens privata funktioner.
Säkerhetsrekommendations: Använd aldrig skript dot-sourcing i en modul och exportera alltid modulfunktioner med explicita namn (inga jokertecken).
Kapslad modul med exportbegränsning för jokertecken
Om en överordnad modul exporterar funktioner med jokertecken för funktionsnamn tar PowerShell bort alla funktionsnamn i en kapslad modul från funktionsexportlistan. Om du blockerar jokerteckenexporter från kapslade moduler förhindras oavsiktlig export av farliga kapslade funktioner via matchning av jokerteckennamn.
Säkerhetsrekommendations: Exportera alltid modulfunktioner med explicita namn (inga jokertecken).
Konvertering av parametertyp för interaktivt gränssnitt
När systemet är låst körs interaktiva PowerShell-sessioner i
ConstrainedLanguageläge för att förhindra godtycklig kodkörning. Betrodda moduler som läses in i sessionen körs iFullLanguageläge. Om en cmdlet för betrodd modul använder komplexa typer för sina parametrar kan typkonverteringen under parameterbindningen misslyckas om konverteringen inte tillåts över förtroendegränser. Felet uppstår när PowerShell försöker konvertera ett värde genom att köra en typkonstruktor. Typkonstruktorer får inte köras iConstrainedLanguageläge.I det här exemplet tillåts konvertering av parameterbindningstyp normalt, men misslyckas när den körs i
ConstrainedLanguageläge. TypkonstruktornConnectionPorttillåts inte:PS> Create-ConnectionOnPort -Connection 22 Create-ConnectionOnPort: Cannot bind parameter 'Connection'. Cannot convert the "22" value of type "System.Int32" to type "ConnectionPort".Enter-PSHostProcesscmdlet tillåts inteCmdleten
Enter-PSHostProcessär inaktiverad och genererar ett fel om den används. Det här kommandot används för anslutnings- och felsökningssessioner. Det gör att du kan ansluta till andra PowerShell-sessioner på den lokala datorn. Cmdleten är inaktiverad för att förhindra avslöjande av information och godtycklig kodkörning.
PowerShell-begränsningar under begränsat språkläge
Skript eller funktioner som inte har godkänts av appkontrollprincipen är inte betrodda. När du kör ett ej betrott kommando blockerar PowerShell antingen kommandot från att köras (nytt beteende) eller kör kommandot i ConstrainedLanguage läge. Följande begränsningar gäller för ConstrainedLanguage läge:
Add-Typecmdlet tillåts inteBlockering
Add-Typeförhindrar körning av godtycklig .NET-kod.Import-LocalizedDatacmdlet begränsadOm parametern SupportedCommand blockeras
Import-LocalizedDataförhindras körning av godtycklig kod.Invoke-Expressioncmdlet begränsadAlla skriptblock som skickas till cmdleten
Invoke-Expressionkörs iConstrainedLanguageläge för att förhindra godtycklig kodkörning.New-Objectcmdlet begränsadCmdleten
New-Objectär begränsad till att endast använda tillåtna .NET- och COM-typer för att förhindra åtkomst till ej betrodda typer.ForEach-Objectcmdlet-begränsningTypmetodanrop för variabler som skickas till
ForeEach-Objecttillåts inte för alla .NET-typer som inte finns i listan över godkända. I allmänhetConstrainedLanguagetillåter läget inte anrop av objektmetoder förutom godkända .NET-typer för att förhindra åtkomst till ej betrodda .NET-typer.Export-ModuleMembercmdlet-begränsningOm du använder
Export-ModuleMembercmdlet för att exportera funktioner i en kapslad modulskriptfil där den underordnade modulen inte är betrodd och den överordnade modulen är betrodd resulterar det i ett fel. Om du blockerar det här scenariot förhindrar du att en opålitlig modul exporterar farliga funktioner från en betrodd modul.New-Modulecmdlet-begränsningNär du kör
New-Modulei ett betrott skript markeras alla skriptblock som tillhandahålls av parameternScriptBlockför att köras iConstrainedLanguageläge för att förhindra inmatning av godtycklig kod i en betrodd körningskontext.Configurationnyckelord tillåts inteSpråknyckelordet
Configurationtillåts inte iConstrainedLanguageläge för att förhindra kodinmatningsattacker.classnyckelord tillåts inteSpråknyckelordet
classtillåts inte iConstrainedLanguageläge för att förhindra inmatning av godtycklig kod.Begränsningar för omfång för skriptblockbearbetning
Underordnade skriptblock tillåts inte köras i överordnade skriptblocksomfång om skriptblocken har olika förtroendenivåer. Du kan till exempel skapa en underordnad relation när du punktkälla ett skript till ett annat. Om du blockerar det här scenariot förhindrar du att ett skript som inte är betrott får åtkomst till farliga funktioner i det betrodda skriptomfånget.
Förhindra kommandoidentifiering av obetrodda skriptfunktioner
PowerShell-kommandoidentifiering returnerar inte funktioner från en ej betrodd källa, till exempel ett skript eller en modul som inte är betrodd, till en betrodd funktion. Blockera identifiering av ej betrodda kommandon förhindrar kodinmatning via kommandoplantering.
Hashtable till objektkonvertering tillåts inte
ConstrainedLanguageläge blockerar hashtable till objektkonverteringar i avsnittenDatai PowerShell-datafiler (.psd1) för att förhindra potentiella kodinmatningsattacker.Automatisk typkonvertering begränsad
ConstrainedLanguageläge blockerar automatisk typkonvertering förutom en liten uppsättning godkända säkra typer för att förhindra potentiella kodinmatningsattacker.Exportbegränsning för implicit modulfunktion
Om en modul inte uttryckligen exporterar funktioner exporterar PowerShell implicit alla definierade modulfunktioner automatiskt som en bekvämlighetsfunktion. I
ConstrainedLanguageläge sker inte längre implicita exporter när en modul läses in över förtroendegränser. Blockera implicit export förhindrar oavsiktlig exponering av farliga modulfunktioner som inte är avsedda för offentligt bruk.Skriptfiler kan inte importeras som moduler
Med PowerShell kan du importera skriptfiler (
.ps1) som en modul. Alla definierade funktioner blir offentligt tillgängliga.ConstrainedLanguageläge blockerar import av skriptfil för att förhindra oavsiktlig exponering av farliga skriptfunktioner.Inställning av begränsning av variabler
AllScopeConstrainedLanguageläget inaktiverar möjligheten att angeAllScopevariabler. Om du begränsar variablernas omfång hindras variablerna från att störa sessionstillståndet för betrodda kommandon.Typmetodanrop tillåts inte
ConstrainedLanguageläge tillåter inte metodanrop på icke godkända typer. Blockeringsmetoder på icke godkända typer förhindrar anrop av .NET-typmetoder som kan vara farliga eller tillåta kodinmatning.Typegenskapsuppsättningar tillåts inte
ConstrainedLanguageläge begränsar anrop av egenskapsuppsättningar för icke godkända typer. Blockering av egenskapsuppsättningar på icke godkända typer förhindrar kodinmatningsattacker.Det går inte att skapa typen
ConstrainedLanguageläge blockerar skapande av typ på icke godkända typer för att blockera obetrodda konstruktorer som kan tillåta kodinmatning.Modulomfångsoperatorn tillåts inte
ConstrainedLanguage-läget tillåter inte användning av modulomfångsoperatorn. Exempel:& (Get-Module MyModule) MyFunction. Om du blockerar modulomfångsoperatorn förhindras åtkomst till privata funktioner och variabler för modulen.
Ytterligare läsning
- Mer information om PowerShell-språklägen finns i about_Language_Modes.
- Information om hur du konfigurerar och använder App Control finns i Använda App Control för PowerShell.