Come funziona App Control con PowerShell

Questo articolo illustra in che modo Controllo app per le aziende protegge PowerShell e le restrizioni imposte. Il comportamento sicuro di PowerShell varia in base alla versione di Windows e PowerShell in uso.

Come PowerShell rileva un criterio di blocco del sistema

PowerShell rileva i criteri di sistema sia di AppLocker sia di App Control for Business. Microsoft non investe più in AppLocker. AppLocker riceverà solo correzioni di sicurezza. App Control è il sistema preferito per il controllo delle applicazioni in Windows.

Rilevamento dell'applicazione del criterio di controllo delle applicazioni legacy

PowerShell usa l'API di controllo WldpGetLockdownPolicy delle app legacy per individuare due elementi:

  • Applicazione dei criteri a livello di sistema: None, Audit, Enforce
  • Criterio per singolo file: None, Audit (consentito dal criterio), Enforce (non consentito dal criterio)

Tutte le versioni di PowerShell (v5.1 - v7.x) supportano questo rilevamento dei criteri di Controllo app.

Rilevamento più recente dell'applicazione dei criteri di controllo delle app

Controllo delle app ha introdotto nuove API nelle versioni più recenti di Windows. A partire dalla versione 7.3, PowerShell usa la nuova WldpCanExecuteFile API per decidere come gestire un file. Windows PowerShell 5.1 non supporta questa nuova API. La nuova API ha la precedenza sull'API legacy per singoli file. Tuttavia, PowerShell continua a usare l'API legacy per ottenere la configurazione dei criteri a livello di sistema. Se la nuova API non è disponibile, PowerShell esegue il fallback al comportamento precedente dell'API.

La nuova API fornisce le informazioni seguenti per ogni file:

  • WLDP_CAN_EXECUTE_ALLOWED
  • WLDP_CAN_EXECUTE_BLOCKED
  • WLDP_CAN_EXECUTE_REQUIRE_SANDBOX

Comportamento di PowerShell in base ai criteri di blocco

PowerShell può essere eseguito in modalità interattiva e non interattiva.

  • In modalità interattiva PowerShell è un'applicazione della riga di comando che accetta l'input della riga di comando degli utenti come comandi o script da eseguire. I risultati vengono visualizzati di nuovo all'utente.
  • In modalità non interattiva PowerShell carica i moduli ed esegue file di script senza input dell'utente. I flussi di dati dei risultati vengono ignorati o reindirizzati a un file.

Modalità interattiva in esecuzione nell'applicazione dei criteri

PowerShell esegue i comandi in ConstrainedLanguage modalità . Questa modalità impedisce agli utenti interattivi di eseguire determinati comandi o di eseguire codice arbitrario. Per ulteriori informazioni sulle restrizioni in questa modalità, vedi la sezione restrizioni di PowerShell nei criteri di blocco di questo articolo.

Modalità non interattiva in esecuzione nell'applicazione dei criteri

Quando PowerShell esegue uno script o carica un modulo, usa l'API Controllo app per ottenere l'imposizione dei criteri per il file.

PowerShell versione 7.3 o successiva usa l'API WldpCanExecuteFile , se disponibile. Questa API restituisce uno dei risultati seguenti:

  • WLDP_CAN_EXECUTE_ALLOWED: il criterio consente l'uso del file in FullLanguage modalità con alcune restrizioni.
  • WLDP_CAN_EXECUTE_BLOCKED: la politica non consente il file. PowerShell genera un errore quando il file viene eseguito o caricato.
  • WLDP_CAN_EXECUTE_REQUIRE_SANDBOX: la policy non approva il file, ma può essere eseguito o caricato in modalità ConstrainedLanguage.

In Windows PowerShell 5.1 o se WldpCanExecuteFile l'API non è disponibile, il comportamento di PowerShell per ogni file è:

  • None: il file viene eseguito in FullLanguage modalità con alcune restrizioni.
  • Audit: il file viene eseguito o caricato in FullLanguage modalità senza restrizioni. In PowerShell 7.4 o versione successiva, il criterio registra le informazioni relative alle restrizioni nei registri eventi di Windows.
  • Enforce: il file viene eseguito o caricato in ConstrainedLanguage modalità .

Restrizioni di PowerShell in base al criterio di blocco

Quando PowerShell rileva che il sistema si trova sotto una politica di blocco di Controllo applicazioni, applica restrizioni anche se lo script è attendibile e in esecuzione nella modalità FullLanguage. Queste restrizioni impediscono comportamenti noti di PowerShell che potrebbero comportare l'esecuzione arbitraria del codice in un sistema bloccato. Il criterio di blocco impone le seguenti restrizioni:

  • Modulo dot-sourcing con restrizione dell'esportazione di funzioni con caratteri jolly

    Qualsiasi modulo che usa lo script dot-sourcing ed esporta funzioni usando nomi con caratteri jolly genera un errore. Il blocco delle esportazioni wildcard impedisce l'iniezione di script da parte di un utente malintenzionato che può collocare uno script non attendibile, richiamato tramite dot-sourcing in un modulo attendibile. Lo script dannoso potrebbe quindi ottenere l'accesso alle funzioni private del modulo attendibile.

    Raccomandazione di sicurezza: Non usare mai il dot-sourcing degli script in un modulo e esportare sempre le funzioni del modulo con nomi espliciti, senza caratteri wildcard.

  • Modulo annidato con restrizione sull'esportazione di funzioni wildcard

    Se un modulo padre esporta funzioni usando caratteri jolly nei nomi delle funzioni, PowerShell rimuove dall'elenco delle funzioni esportate qualsiasi nome di funzione presente in un modulo annidato. Il blocco delle esportazioni di caratteri jolly da moduli annidati impedisce l'esportazione accidentale di funzioni annidate pericolose tramite la corrispondenza dei nomi con caratteri jolly.

    Raccomandazione di sicurezza: esportare sempre le funzioni del modulo usando nomi espliciti (senza caratteri jolly).

  • Conversione interattiva del tipo di parametro della shell

    Quando il sistema è bloccato, le sessioni interattive di PowerShell vengono eseguite in ConstrainedLanguage modalità per impedire l'esecuzione arbitraria del codice. I moduli attendibili caricati nella sessione vengono eseguiti in modalità FullLanguage. Se un cmdlet di modulo attendibile usa tipi complessi per i relativi parametri, la conversione dei tipi durante l'associazione di parametri può non riuscire se la conversione non è consentita attraverso i limiti di attendibilità. L'errore si verifica quando PowerShell tenta di convertire un valore eseguendo un costruttore di tipo. I costruttori di tipi non possono essere eseguiti in modalità ConstrainedLanguage.

    In questo esempio, la conversione del tipo nel binding dei parametri è normalmente consentita, ma ha esito negativo quando viene eseguita in modalità ConstrainedLanguage. Il ConnectionPort costruttore del tipo non è consentito:

    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 non consentita

    Il Enter-PSHostProcess cmdlet è disabilitato e genera un errore se usato. Questo comando viene usato per le sessioni attach-and-debug. Consente di connettersi a qualsiasi altra sessione di PowerShell nel computer locale. Il cmdlet è disabilitato per impedire la divulgazione di informazioni e l'esecuzione arbitraria del codice.

Restrizioni di PowerShell in modalità linguaggio vincolato

Uno script o una funzione non approvata dai criteri di controllo app non è attendibile. Quando si esegue un comando non attendibile, PowerShell blocca l'esecuzione del comando (nuovo comportamento) o esegue il comando in ConstrainedLanguage modalità . Le restrizioni seguenti si applicano alla ConstrainedLanguage modalità:

  • Add-Type cmdlet non consentito

    Il blocco Add-Type impedisce l'esecuzione di codice .NET arbitrario.

  • Import-LocalizedData cmdlet con restrizioni

    Il blocco del parametro SupportedCommand di Import-LocalizedData impedisce l'esecuzione di codice arbitrario.

  • Invoke-Expression cmdlet con restrizioni

    Tutti i blocchi di script passati al Invoke-Expression cmdlet vengono eseguiti in ConstrainedLanguage modalità per impedire l'esecuzione arbitraria del codice.

  • New-Object cmdlet con restrizioni

    Il New-Object cmdlet è limitato all'uso solo dei tipi .NET e COM consentiti, per impedire l'accesso a tipi non attendibili.

  • ForEach-Object Limitazione dei cmdlet

    La chiamata al metodo di tipo per le variabili passate a ForeEach-Object non è consentita per qualsiasi tipo .NET non incluso nell'elenco approvato. In generale, ConstrainedLanguage la modalità non consente alcuna chiamata al metodo oggetto, ad eccezione dei tipi .NET approvati per impedire l'accesso a tipi .NET non attendibili.

  • Export-ModuleMember Restrizione dei cmdlet

    L'uso del cmdlet Export-ModuleMember per esportare funzioni in un file di script di un modulo annidato, in cui il modulo figlio non è attendibile e il modulo padre è attendibile, provoca un errore. Il blocco di questo scenario impedisce a un modulo dannoso non attendibile di esportare funzioni pericolose da un modulo attendibile.

  • New-Module Limitazione dei cmdlet

    Quando si esegue New-Module in uno script attendibile, qualsiasi blocco di script fornito dal ScriptBlock parametro è contrassegnato per l'esecuzione in ConstrainedLanguage modalità per impedire l'inserimento di codice arbitrario in un contesto di esecuzione attendibile.

  • Configuration parola chiave non consentita

    La parola chiave Configuration non è consentita nella modalità ConstrainedLanguage per impedire attacchi di iniezione di codice.

  • class parola chiave non consentita

    La parola chiave class non è consentita in modalità ConstrainedLanguage per evitare l'iniezione di codice arbitrario.

  • Restrizioni relative all'ambito di elaborazione di blocchi di script

    I blocchi di script figlio non possono essere eseguiti nei contesti dei blocchi di script padre se i blocchi di script hanno livelli di attendibilità diversi. Ad esempio, si crea una relazione figlio quando si crea uno script dot source in un altro. Il blocco di questo scenario impedisce a uno script non attendibile di accedere a funzioni pericolose nell'ambito dello script attendibile.

  • Impedire l'individuazione dei comandi di funzioni script non attendibili

    L'individuazione dei comandi di PowerShell non restituisce funzioni da un'origine non attendibile, ad esempio uno script o un modulo non attendibile, a una funzione attendibile. Bloccare il rilevamento di comandi non attendibili impedisce l'iniezione di codice tramite il piazzamento di comandi.

  • Conversione da hashtable a oggetto non consentita

    La modalità ConstrainedLanguage blocca le conversioni da tabelle hash a oggetti nelle sezioni Data dei file di dati di PowerShell (.psd1) per prevenire potenziali attacchi di iniezione di codice.

  • Conversione automatica dei tipi con restrizioni

    ConstrainedLanguage mode blocca la conversione automatica dei tipi, ad eccezione di un piccolo set di tipi sicuri approvati per impedire potenziali attacchi di inserimento del codice.

  • Restrizione dell'esportazione delle funzioni del modulo implicito

    Se un modulo non esporta in modo esplicito le funzioni, PowerShell esporta in modo implicito tutte le funzioni del modulo definite automaticamente come funzionalità di praticità. In ConstrainedLanguage modalità, le esportazioni implicite non si verificano più quando un modulo viene caricato attraverso i limiti di attendibilità. Il blocco delle esportazioni implicite impedisce l'esposizione involontaria di funzioni pericolose del modulo non destinate all'uso pubblico.

  • I file di script non possono essere importati come moduli

    PowerShell consente di importare file di script (.ps1) come modulo. Tutte le funzioni definite diventano accessibili pubblicamente. ConstrainedLanguage mode blocca l'importazione del file di script per impedire l'esposizione imprevista di funzioni script pericolose.

  • Impostazione della restrizione delle variabili AllScope

    ConstrainedLanguage mode disabilita la possibilità di impostare AllScope sulle variabili. La limitazione dell'ambito delle variabili impedisce che le variabili interferiscano con lo stato della sessione dei comandi attendibili.

  • Invocazione di un metodo di tipo non consentita

    ConstrainedLanguage mode non consente l'invocazione di metodi per i tipi non approvati. I metodi di blocco su tipi non approvati impediscono la chiamata di metodi di tipo .NET che potrebbero essere pericolosi o consentire l'inserimento di codice.

  • Setter di proprietà di tipo non consentiti

    ConstrainedLanguage mode limita la chiamata dei setter di proprietà su tipi non approvati. Il blocco dei setter di proprietà nei tipi non approvati impedisce attacchi di inserimento del codice.

  • Creazione del tipo non consentita

    ConstrainedLanguage mode blocca la creazione dei tipi su tipi non approvati per bloccare costruttori non attendibili che potrebbero consentire l'inserimento di codice.

  • Operatore di ambito del modulo non consentito

    ConstrainedLanguage mode non consente l'uso dell'operatore di ambito del modulo. Ad esempio: & (Get-Module MyModule) MyFunction. Il blocco dell'operatore di ambito del modulo impedisce l'accesso a funzioni e variabili private del modulo.

Approfondimenti