Delen via


Hoe App Control werkt met PowerShell

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_ALLOWED
  • WLDP_CAN_EXECUTE_BLOCKED
  • WLDP_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 in FullLanguage de 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 in ConstrainedLanguage de 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 in FullLanguage de modus met enkele beperkingen.
  • Audit: het bestand wordt zonder beperkingen uitgevoerd of geladen in FullLanguage de modus. In PowerShell 7.4 of hoger registreert het beleid beperkingsgegevens voor de Windows-gebeurtenislogboeken.
  • Enforce: het bestand wordt uitgevoerd of geladen in ConstrainedLanguage de 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 ConstrainedLanguage de modus om te voorkomen dat willekeurige code wordt uitgevoerd. Vertrouwde modules die in de sessie zijn geladen, worden uitgevoerd in FullLanguage de 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 in ConstrainedLanguage de modus.

    In dit voorbeeld is de conversie van parameterbindingstypen normaal toegestaan, maar mislukt het uitvoeren in ConstrainedLanguage de modus. De ConnectionPort typeconstructor 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-PSHostProcess cmdlet is niet toegestaan

    De Enter-PSHostProcess cmdlet 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-Type cmdlet is niet toegestaan

    Blokkeren Add-Type voorkomt dat willekeurige .NET-code wordt uitgevoerd.

  • Import-LocalizedData cmdlet beperkt

    Door de blokkeren, voorkomt u dat willekeurige code wordt uitgevoerd.

  • Invoke-Expression cmdlet beperkt

    Alle scriptblokken die aan de cmdlet worden doorgegeven, worden uitgevoerd in Invoke-Expression de ConstrainedLanguage modus om te voorkomen dat willekeurige code wordt uitgevoerd.

  • New-Object cmdlet beperkt

    De New-Object cmdlet is beperkt tot het gebruik van alleen toegestane .NET- en COM-typen om toegang tot niet-vertrouwde typen te voorkomen.

  • ForEach-Object cmdlet-beperking

    Typemethode-aanroep voor variabelen die aan de ForeEach-Object variabelen 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, ConstrainedLanguage met uitzondering van goedgekeurde .NET-typen om toegang tot niet-vertrouwde .NET-typen te voorkomen.

  • Export-ModuleMember cmdlet-beperking

    Het gebruik van Export-ModuleMember cmdlet 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-Module cmdlet-beperking

    Wanneer u een vertrouwd script uitvoert New-Module , wordt elk scriptblok dat door de ScriptBlock parameter wordt geleverd, gemarkeerd om te worden uitgevoerd in ConstrainedLanguage de modus om te voorkomen dat willekeurige code wordt opgenomen in een vertrouwde uitvoeringscontext.

  • Configuration trefwoord niet toegestaan

    Het Configuration trefwoord taal is niet toegestaan in ConstrainedLanguage de modus om aanvallen met code-injectie te voorkomen.

  • class trefwoord niet toegestaan

    Het class trefwoord taal is niet toegestaan in ConstrainedLanguage de 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

    ConstrainedLanguage modus blokkeert hashtabel naar objectconversies in de Data secties van PowerShell-gegevensbestanden (.psd1) om mogelijke aanvallen op code-injectie te voorkomen.

  • Automatische typeconversie beperkt

    ConstrainedLanguage modus 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 ConstrainedLanguage de 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. ConstrainedLanguage modus blokkeert de invoer van scriptbestand om onbedoelde blootstelling van gevaarlijke scriptfuncties te voorkomen.

  • Beperking voor variabelen AllScope instellen

    ConstrainedLanguage met de modus schakelt u de mogelijkheid uit om in te stellen AllScope op 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

    ConstrainedLanguage de 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

    ConstrainedLanguage modus 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

    ConstrainedLanguage modus 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

    ConstrainedLanguage in 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