Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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_ALLOWEDWLDP_CAN_EXECUTE_BLOCKEDWLDP_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 inFullLanguagemodalità 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 inFullLanguagemodalità con alcune restrizioni. -
Audit: il file viene eseguito o caricato inFullLanguagemodalità 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 inConstrainedLanguagemodalità .
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
ConstrainedLanguagemodalità 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. IlConnectionPortcostruttore 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-PSHostProcesscmdlet non consentitaIl
Enter-PSHostProcesscmdlet è 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-Typecmdlet non consentitoIl blocco
Add-Typeimpedisce l'esecuzione di codice .NET arbitrario.Import-LocalizedDatacmdlet con restrizioniIl blocco del parametro SupportedCommand di
Import-LocalizedDataimpedisce l'esecuzione di codice arbitrario.Invoke-Expressioncmdlet con restrizioniTutti i blocchi di script passati al
Invoke-Expressioncmdlet vengono eseguiti inConstrainedLanguagemodalità per impedire l'esecuzione arbitraria del codice.New-Objectcmdlet con restrizioniIl
New-Objectcmdlet è limitato all'uso solo dei tipi .NET e COM consentiti, per impedire l'accesso a tipi non attendibili.ForEach-ObjectLimitazione dei cmdletLa chiamata al metodo di tipo per le variabili passate a
ForeEach-Objectnon è consentita per qualsiasi tipo .NET non incluso nell'elenco approvato. In generale,ConstrainedLanguagela modalità non consente alcuna chiamata al metodo oggetto, ad eccezione dei tipi .NET approvati per impedire l'accesso a tipi .NET non attendibili.Export-ModuleMemberRestrizione dei cmdletL'uso del cmdlet
Export-ModuleMemberper 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-ModuleLimitazione dei cmdletQuando si esegue
New-Modulein uno script attendibile, qualsiasi blocco di script fornito dalScriptBlockparametro è contrassegnato per l'esecuzione inConstrainedLanguagemodalità per impedire l'inserimento di codice arbitrario in un contesto di esecuzione attendibile.Configurationparola chiave non consentitaLa parola chiave
Configurationnon è consentita nella modalitàConstrainedLanguageper impedire attacchi di iniezione di codice.classparola chiave non consentitaLa parola chiave
classnon è consentita in modalitàConstrainedLanguageper 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à
ConstrainedLanguageblocca le conversioni da tabelle hash a oggetti nelle sezioniDatadei file di dati di PowerShell (.psd1) per prevenire potenziali attacchi di iniezione di codice.Conversione automatica dei tipi con restrizioni
ConstrainedLanguagemode 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
ConstrainedLanguagemodalità, 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.ConstrainedLanguagemode blocca l'importazione del file di script per impedire l'esposizione imprevista di funzioni script pericolose.Impostazione della restrizione delle variabili
AllScopeConstrainedLanguagemode disabilita la possibilità di impostareAllScopesulle 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
ConstrainedLanguagemode 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
ConstrainedLanguagemode 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
ConstrainedLanguagemode 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
ConstrainedLanguagemode 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
- Per altre informazioni sulle modalità del linguaggio di PowerShell, vedere about_Language_Modes.
- Per informazioni su come configurare e usare Controllo app, vedere Come usare Controllo app per PowerShell.