Condividi tramite


Funzionamento di Controllo app 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 sia i criteri a livello di sistema appLocker che di Controllo app per le aziende. AppLocker è deprecato. Controllo app è il sistema di controllo delle applicazioni preferito per Windows.

Rilevamento dell'imposizione dei criteri di controllo delle app 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
  • Singoli criteri file: None, Audit (consentiti dai criteri), Enforce (non consentiti dai criteri)

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 app ha introdotto nuove API nelle versioni 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 nei 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 altre informazioni sulle restrizioni in questa modalità, vedere la sezione Relativa alle 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 file viene approvato dai criteri e viene usato in FullLanguage modalità con alcune restrizioni.
  • WLDP_CAN_EXECUTE_BLOCKED: il file non è approvato dai criteri. PowerShell genera un errore quando il file viene eseguito o caricato.
  • WLDP_CAN_EXECUTE_REQUIRE_SANDBOX: il file non è approvato dai criteri, ma può comunque essere eseguito o caricato in ConstrainedLanguage modalità.

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, i criteri registrano le informazioni sulle restrizioni nei registri eventi di Windows.
  • Enforce: il file viene eseguito o caricato in ConstrainedLanguage modalità .

Restrizioni di PowerShell nei criteri di blocco

Quando PowerShell rileva che il sistema si trova in un criterio di blocco controllo app, applica restrizioni anche se lo script è attendibile e in esecuzione in FullLanguage modalità. Queste restrizioni impediscono comportamenti noti di PowerShell che potrebbero comportare l'esecuzione arbitraria del codice in un sistema bloccato. I criteri di blocco applicano le restrizioni seguenti:

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

    Qualsiasi modulo che usa funzioni dot-sourcing ed esporta funzioni che usano nomi con caratteri jolly genera un errore. Il blocco delle esportazioni con caratteri jolly impedisce l'inserimento di script da parte di un utente malintenzionato che può inserire uno script non attendibile che viene inserito in un modulo attendibile. Lo script dannoso potrebbe quindi ottenere l'accesso alle funzioni private del modulo attendibile.

    Raccomandazione di sicurezza: non usare mai lo script dot-sourcing in un modulo ed esportare sempre le funzioni del modulo con nomi espliciti (senza caratteri jolly).

  • Modulo annidato con restrizione dell'esportazione delle funzioni con caratteri jolly

    Se un modulo padre esporta funzioni usando caratteri jolly nome funzione, PowerShell rimuove qualsiasi nome di funzione in un modulo annidato dall'elenco di esportazione delle funzioni. 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 con 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 FullLanguage modalità . 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 sono autorizzati a essere eseguiti in ConstrainedLanguage modalità .

    In questo esempio la conversione del tipo di associazione di parametri è normalmente consentita, ma non riesce quando viene eseguita in ConstrainedLanguage modalità . 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 consentito

    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

Lo script o la 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 Restrizione 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

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

  • New-Module Restrizione 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 Configuration parola chiave del linguaggio non è consentita in ConstrainedLanguage modalità per impedire attacchi di inserimento del codice.

  • class parola chiave non consentita

    La class parola chiave language non è consentita in ConstrainedLanguage modalità per impedire l'inserimento di codice arbitrario.

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

    I blocchi di script figlio non possono essere eseguiti negli ambiti 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. Il blocco dell'individuazione dei comandi non attendibili impedisce l'inserimento del codice tramite l'installazione di comandi.

  • Conversione hashtable in oggetto non consentita

    ConstrainedLanguage mode blocca le conversioni hashtable negli oggetti nelle Data sezioni dei file di dati di PowerShell (.psd1) per evitare potenziali attacchi di inserimento del 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.

  • Chiamata al metodo di tipo non consentita

    ConstrainedLanguage mode non consente la chiamata al metodo su 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 dell'ambito del modulo non consentito

    ConstrainedLanguage mode non consente l'uso dell'operatore dell'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.

Altre risorse