Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit artikel wordt uitgelegd hoe App Control voor Bedrijven PowerShell beveiligt en de beperkingen die worden opgelegd. Het veilige gedrag van PowerShell varieert op basis van de versie van Windows en PowerShell die u gebruikt.
Hoe PowerShell een systeemvergrendelingsbeleid detecteert
PowerShell detecteert zowel AppLocker als App Control voor Bedrijven systeembreed beleid. AppLocker is afgeschaft. App Control is het voorkeurssysteem voor toepassingsbeheer voor Windows.
Detectie van verouderde app-beheerbeleid
PowerShell maakt gebruik van de verouderde App Control-API WldpGetLockdownPolicy om twee dingen te detecteren:
- Systeembrede beleidshandhaving:
None,AuditEnforce - Beleid voor afzonderlijke bestanden:
None,Audit(toegestaan door beleid),Enforce(niet toegestaan door beleid)
Alle versies van PowerShell (v5.1 - v7.x) ondersteunen deze app-beheerbeleidsdetectie.
Nieuwste detectie van app-beheerbeleid
App Control heeft nieuwe API's geïntroduceerd in recente versies van Windows. Vanaf versie 7.3 gebruikt PowerShell de nieuwe WldpCanExecuteFile API om te bepalen hoe een bestand moet worden verwerkt. Windows PowerShell 5.1 biedt geen ondersteuning voor deze nieuwe API. De nieuwe API heeft voorrang op de verouderde API voor afzonderlijke bestanden.
PowerShell blijft echter de verouderde API gebruiken om de configuratie van het systeembrede beleid op te halen. Als de nieuwe API niet beschikbaar is, valt PowerShell terug op het oude API-gedrag.
De nieuwe API biedt de volgende informatie voor elk bestand:
WLDP_CAN_EXECUTE_ALLOWEDWLDP_CAN_EXECUTE_BLOCKEDWLDP_CAN_EXECUTE_REQUIRE_SANDBOX
PowerShell-gedrag onder vergrendelingsbeleid
PowerShell kan worden uitgevoerd in interactieve en niet-interactieve modi.
- In de interactieve modus is PowerShell een opdrachtregeltoepassing waarmee gebruikers opdrachtregelinvoer als opdrachten of scripts uitvoeren. De resultaten worden weer weergegeven aan de gebruiker.
- In de niet-interactieve modus laadt PowerShell modules en voert scriptbestanden uit zonder gebruikersinvoer. Resultaatgegevensstromen worden genegeerd of omgeleid naar een bestand.
Interactieve modus die wordt uitgevoerd onder het afdwingen van beleid
PowerShell voert opdrachten uit in ConstrainedLanguage de modus. Deze modus voorkomt dat interactieve gebruikers bepaalde opdrachten uitvoeren of willekeurige code uitvoeren. Zie de PowerShell-beperkingen in de sectie Vergrendelingsbeleid van dit artikel voor meer informatie over de beperkingen in deze modus.
Niet-interactieve modus die wordt uitgevoerd onder het afdwingen van beleid
Wanneer PowerShell een script uitvoert of een module laadt, wordt de App Control-API gebruikt om het afdwingen van het beleid voor het bestand op te halen.
PowerShell-versie 7.3 of hoger maakt gebruik van de WldpCanExecuteFile API, indien beschikbaar. Deze API retourneert een van de volgende resultaten:
-
WLDP_CAN_EXECUTE_ALLOWED: Het bestand wordt goedgekeurd door beleid en wordt gebruikt inFullLanguagede modus met enkele beperkingen. -
WLDP_CAN_EXECUTE_BLOCKED: Het bestand wordt niet goedgekeurd door beleid. PowerShell genereert een fout wanneer het bestand wordt uitgevoerd of geladen. -
WLDP_CAN_EXECUTE_REQUIRE_SANDBOX: Het bestand wordt niet goedgekeurd door het beleid, maar kan nog steeds worden uitgevoerd of geladen inConstrainedLanguagede modus.
In Windows PowerShell 5.1 of als WldpCanExecuteFile DE API niet beschikbaar is, is het gedrag per bestand van PowerShell:
-
None: Het bestand wordt geladen inFullLanguagede modus met enkele beperkingen. -
Audit: het bestand wordt zonder beperkingen uitgevoerd of geladen inFullLanguagede modus. In PowerShell 7.4 of hoger registreert het beleid beperkingsgegevens voor de Windows-gebeurtenislogboeken. -
Enforce: het bestand wordt uitgevoerd of geladen inConstrainedLanguagede modus.
PowerShell-beperkingen onder vergrendelingsbeleid
Wanneer PowerShell detecteert dat het systeem onder een vergrendelingsbeleid voor app-beheer valt, worden er beperkingen toegepast, zelfs als het script wordt vertrouwd en uitgevoerd in FullLanguage de modus. Deze beperkingen verhinderen bekende gedragingen van PowerShell die kunnen leiden tot willekeurige uitvoering van code op een vergrendeld systeem. Het vergrendelingsbeleid dwingt de volgende beperkingen af:
Module dot-sourcing met exportbeperking voor jokertekenfuncties
Elke module die gebruikmaakt van script-dot-sourcing- en exportfuncties met behulp van jokertekennamen, resulteert in een fout. Het blokkeren van jokertekenexports voorkomt dat scriptinjectie van een kwaadwillende gebruiker een niet-vertrouwd script kan installeren dat dot-source in een vertrouwde module wordt opgehaald. Het schadelijke script kan vervolgens toegang krijgen tot de privéfuncties van de vertrouwde module.
Beveiligingsaanbeveling: gebruik nooit dot-sourcing van scripts in een module en exporteer altijd modulefuncties met expliciete namen (geen jokertekens).
Geneste module met exportbeperking voor jokertekenfuncties
Als een bovenliggende module functies exporteert met jokertekens van de functienaam, verwijdert PowerShell een functienaam in een geneste module uit de lijst met functieexports. Het blokkeren van jokertekenexports van geneste modules voorkomt onbedoelde export van gevaarlijke geneste functies via overeenkomende jokertekens.
Aanbeveling voor beveiliging: Modulefuncties altijd exporteren met expliciete namen (geen jokertekens).
Conversie van parametertype interactieve shell
Wanneer het systeem is vergrendeld, worden interactieve PowerShell-sessies uitgevoerd in
ConstrainedLanguagede modus om te voorkomen dat willekeurige code wordt uitgevoerd. Vertrouwde modules die in de sessie zijn geladen, worden uitgevoerd inFullLanguagede modus. Als een cmdlet voor vertrouwde modules complexe typen gebruikt voor de parameters, kan de typeconversie tijdens parameterbinding mislukken als de conversie niet is toegestaan binnen de grenzen van vertrouwensrelaties. De fout treedt op wanneer PowerShell probeert een waarde te converteren door een typeconstructor uit te voeren. Typeconstructors mogen niet worden uitgevoerd inConstrainedLanguagede modus.In dit voorbeeld is de conversie van parameterbindingstypen normaal toegestaan, maar mislukt het uitvoeren in
ConstrainedLanguagede modus. DeConnectionPorttypeconstructor is niet toegestaan: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 is niet toegestaanDe
Enter-PSHostProcesscmdlet is uitgeschakeld en genereert een fout als deze wordt gebruikt. Deze opdracht wordt gebruikt voor attach-and-debug-sessies. Hiermee kunt u verbinding maken met elke andere PowerShell-sessie op de lokale computer. De cmdlet is uitgeschakeld om openbaarmaking van informatie en willekeurige code-uitvoering te voorkomen.
PowerShell-beperkingen onder de beperkte taalmodus
Het script of de functie die niet is goedgekeurd door het app-beheerbeleid, is niet vertrouwd. Wanneer u een niet-vertrouwde opdracht uitvoert, blokkeert PowerShell het uitvoeren van de opdracht (nieuw gedrag) of voert u de opdracht uit in ConstrainedLanguage de modus. De volgende beperkingen gelden voor ConstrainedLanguage de modus:
Add-Typecmdlet is niet toegestaanBlokkeren
Add-Typevoorkomt dat willekeurige .NET-code wordt uitgevoerd.Import-LocalizedDatacmdlet beperktDoor de blokkeren, voorkomt u dat willekeurige code wordt uitgevoerd.
Invoke-Expressioncmdlet beperktAlle scriptblokken die aan de cmdlet worden doorgegeven, worden uitgevoerd in
Invoke-ExpressiondeConstrainedLanguagemodus om te voorkomen dat willekeurige code wordt uitgevoerd.New-Objectcmdlet beperktDe
New-Objectcmdlet is beperkt tot het gebruik van alleen toegestane .NET- en COM-typen om toegang tot niet-vertrouwde typen te voorkomen.ForEach-Objectcmdlet-beperkingTypemethode-aanroep voor variabelen die aan de
ForeEach-Objectvariabelen worden doorgegeven, is niet toegestaan voor een .NET-type dat niet in de goedgekeurde lijst voorkomt. Over het algemeen wordt in de modus geen aanroep van objectmethoden toegestaan,ConstrainedLanguagemet uitzondering van goedgekeurde .NET-typen om toegang tot niet-vertrouwde .NET-typen te voorkomen.Export-ModuleMembercmdlet-beperkingHet gebruik van
Export-ModuleMembercmdlet om functies te exporteren in een geneste modulescriptbestand waarin de onderliggende module niet wordt vertrouwd en de bovenliggende module wordt vertrouwd, resulteert in een fout. Als u dit scenario blokkeert, voorkomt u dat een kwaadwillende niet-vertrouwde module gevaarlijke functies uit een vertrouwde module exporteert.New-Modulecmdlet-beperkingWanneer u een vertrouwd script uitvoert
New-Module, wordt elk scriptblok dat door deScriptBlockparameter wordt geleverd, gemarkeerd om te worden uitgevoerd inConstrainedLanguagede modus om te voorkomen dat willekeurige code wordt opgenomen in een vertrouwde uitvoeringscontext.Configurationtrefwoord niet toegestaanHet
Configurationtrefwoord taal is niet toegestaan inConstrainedLanguagede modus om aanvallen met code-injectie te voorkomen.classtrefwoord niet toegestaanHet
classtrefwoord taal is niet toegestaan inConstrainedLanguagede modus om de injectie van willekeurige code te voorkomen.Beperkingen voor verwerken van scriptblokkeringsbereiken
Onderliggende scriptblokken mogen niet worden uitgevoerd in bovenliggende scriptblokbereiken als de scriptblokken verschillende vertrouwensniveaus hebben. U maakt bijvoorbeeld een onderliggende relatie wanneer u een punt-bronscript in een ander script maakt. Als u dit scenario blokkeert, voorkomt u dat een niet-vertrouwd script toegang krijgt tot gevaarlijke functies in het bereik van het vertrouwde script.
Detectie van niet-vertrouwde scriptfuncties voorkomen
PowerShell-opdrachtdetectie retourneert geen functies van een niet-vertrouwde bron, zoals een niet-vertrouwd script of module, naar een vertrouwde functie. Het blokkeren van detectie van niet-vertrouwde opdrachten voorkomt dat code-injectie via opdrachtplant.
Hashtabel naar objectconversie is niet toegestaan
ConstrainedLanguagemodus blokkeert hashtabel naar objectconversies in deDatasecties van PowerShell-gegevensbestanden (.psd1) om mogelijke aanvallen op code-injectie te voorkomen.Automatische typeconversie beperkt
ConstrainedLanguagemodus blokkeert automatische typeconversie, met uitzondering van een kleine set goedgekeurde veilige typen om mogelijke aanvallen met code-injectie te voorkomen.Impliciete exportbeperking voor modulefuncties
Als een module niet expliciet functies exporteert, exporteert PowerShell impliciet alle gedefinieerde modulefuncties automatisch als een handige functie. In
ConstrainedLanguagede modus treden impliciete exports niet meer op wanneer een module wordt geladen over de grenzen van vertrouwensrelaties. Het blokkeren van impliciete exports voorkomt onbedoelde blootstelling van gevaarlijke modulefuncties die niet bedoeld zijn voor openbaar gebruik.Scriptbestanden kunnen niet worden geïmporteerd als modules
Met PowerShell kunt u scriptbestanden (
.ps1) importeren als een module. Alle gedefinieerde functies worden openbaar toegankelijk.ConstrainedLanguagemodus blokkeert de invoer van scriptbestand om onbedoelde blootstelling van gevaarlijke scriptfuncties te voorkomen.Beperking voor variabelen
AllScopeinstellenConstrainedLanguagemet de modus schakelt u de mogelijkheid uit om in te stellenAllScopeop variabelen. Door het bereik van variabelen te beperken, voorkomt u dat de variabelen de sessiestatus van vertrouwde opdrachten verstoren.Aanroep van typemethode is niet toegestaan
ConstrainedLanguagede modus staat geen methode-aanroep toe voor niet-goedgekeurde typen. Blokkerende methoden voor niet-goedgekeurde typen voorkomt aanroepen van .NET-typemethoden die gevaarlijk kunnen zijn of code-injectie toestaan.Type eigenschapssetters niet toegestaan
ConstrainedLanguagemodus beperkt het aanroepen van eigenschapssetters op niet-goedgekeurde typen. Door eigenschappensetters op niet-goedgekeurde typen te blokkeren, voorkomt u aanvallen met code-injectie.Type maken is niet toegestaan
ConstrainedLanguagemodus blokkeert het maken van typen op niet-goedgekeurde typen om niet-vertrouwde constructors te blokkeren die code-injectie kunnen toestaan.Operator voor modulebereik is niet toegestaan
ConstrainedLanguagein de modus is het gebruik van de operator voor modulebereik niet toegestaan. Voorbeeld:& (Get-Module MyModule) MyFunction. Het blokkeren van de operator voor modulebereik voorkomt toegang tot privéfuncties en variabelen van de module.
Meer lezen
- Zie about_Language_Modes voor meer informatie over powerShell-taalmodi.
- Zie App Control gebruiken voor PowerShell voor meer informatie over het configureren en gebruiken van App Control.