Como o Controle de Aplicativos funciona com o PowerShell
Este artigo explica como o Controle de Aplicativos para Empresas protege o PowerShell e as restrições que ele impõe. O comportamento seguro do PowerShell varia de acordo com a versão do Windows e do PowerShell que você está usando.
Como o PowerShell detecta uma política de bloqueio do sistema
O PowerShell detecta políticas de todo o sistema AppLocker e App Control for Business . O AppLocker foi descontinuado. O App Control é o sistema de controle de aplicativos preferido para Windows.
Detecção de imposição de política de Controle de Aplicativos herdado
O PowerShell usa a API de Controle de Aplicativos WldpGetLockdownPolicy
herdada para descobrir duas coisas:
- Imposição de políticas em todo o sistema:
None
,Audit
,Enforce
- Política de arquivo individual:
None
,Audit
(permitido pela política),Enforce
(não permitido pela política)
Todas as versões do PowerShell (v5.1 - v7.x) dão suporte a essa detecção de política de Controle de Aplicativos.
Detecção mais recente de imposição de política do Controle de Aplicativos
O Controle de Aplicativos introduziu novas APIs em versões recentes do Windows. Começando na versão 7.3, o PowerShell usa a nova API WldpCanExecuteFile
para decidir como um arquivo deve ser tratado. O Windows PowerShell 5.1 não oferece suporte a essa nova API. A nova API tem precedência sobre a API herdada para arquivos individuais.
No entanto, o PowerShell continua a usar a API herdada para obter a configuração de política em todo o sistema. Se a nova API não estiver disponível, o PowerShell retornará ao comportamento da API antiga.
A nova API fornece as seguintes informações para cada arquivo:
WLDP_CAN_EXECUTE_ALLOWED
WLDP_CAN_EXECUTE_BLOCKED
WLDP_CAN_EXECUTE_REQUIRE_SANDBOX
Comportamento do PowerShell sob a política de bloqueio
O PowerShell pode ser executado nos modos interativo e não interativo.
- No modo interativo, o PowerShell é um aplicativo de linha de comando que usa a entrada de linha de comando dos usuários como comandos ou scripts a serem executados. Os resultados são exibidos de volta para o usuário.
- No modo não interativo, o PowerShell carrega módulos e executa arquivos de script sem entrada do usuário. Os fluxos de dados resultantes são ignorados ou redirecionados para um arquivo.
Modo interativo em execução sob imposição da política
O PowerShell executa comandos no modo ConstrainedLanguage
. Esse modo impede que usuários interativos executem determinados comandos ou executem código arbitrário. Para obter mais informações sobre as restrições nesse modo, consulte a seção Restrições do PowerShell sob a política de bloqueio deste artigo.
Modo não interativo em execução sob imposição da política
Quando o PowerShell executa um script ou carrega um módulo, ele usa a API de Controle de Aplicativos para obter a imposição de política para o arquivo.
O PowerShell versão 7.3 ou superior usa a API WldpCanExecuteFile
, se disponível. Essa API retorna os seguintes resultados:
WLDP_CAN_EXECUTE_ALLOWED
: o arquivo é aprovado pela política e é usado no modoFullLanguage
com algumas restrições.WLDP_CAN_EXECUTE_BLOCKED
: o arquivo não é aprovado pela política. O PowerShell gera um erro quando o arquivo é executado ou carregado.WLDP_CAN_EXECUTE_REQUIRE_SANDBOX
: o arquivo não é aprovado pela política, mas ainda pode ser executado ou carregado no modoConstrainedLanguage
.
No Windows PowerShell 5.1 ou se a API WldpCanExecuteFile
não estiver disponível, o comportamento por arquivo do PowerShell será:
None
: o arquivo é executado carregado no modoFullLanguage
com algumas restrições.Audit
: o arquivo é executado ou carregado no modoFullLanguage
sem restrições. No PowerShell 7.4 ou superior, a política registra informações de restrição nos logs de eventos do Windows.Enforce
: o arquivo é executado ou carregado no modoConstrainedLanguage
.
Restrições do PowerShell sob a política de bloqueio
Quando o PowerShell detecta que o sistema está sob uma política de bloqueio do Controle de Aplicativos, ele aplica restrições mesmo que o script seja confiável e esteja em execução no FullLanguage
modo. Essas restrições impedem comportamentos conhecidos do PowerShell que poderiam resultar na execução de código arbitrário em um sistema bloqueado. A política de bloqueio impõe as seguintes restrições:
Dot-sourcing de módulo com restrição de exportação de função curinga
Qualquer módulo que usar dot-sourcing de scripts e exportar funções usando nomes curinga resultará em um erro. O bloqueio de exportações de curinga impede a injeção de scripts de um usuário mal-intencionado que pode inserir por dot-source um script não confiável em um módulo confiável. O script malicioso poderia então obter acesso às funções privadas do módulo confiável.
Recomendação de segurança: nunca use o dot-sourcing de scripts em um módulo e sempre exporte funções do módulo com nomes explícitos (sem caracteres curinga).
Módulo aninhado com restrição de exportação de função curinga
Se um módulo pai exportar funções usando caracteres curinga de nome de função, o PowerShell removerá qualquer nome de função em um módulo aninhado da lista de exportação de função. O bloqueio de exportações de curinga de módulos aninhados impede a exportação acidental de funções aninhadas perigosas por meio da correspondência de nome curinga.
Recomendação de segurança: sempre exporte funções do módulo com nomes explícitos (sem caracteres curinga).
Conversão interativa de tipo de parâmetro de shell
Quando o sistema está bloqueado, as sessões interativas do PowerShell são executadas no modo
ConstrainedLanguage
para impedir a execução de código arbitrário. Os módulos confiáveis carregados na sessão são executados no modoFullLanguage
. Se um cmdlet de módulo confiável usar tipos complexos para seus parâmetros, a conversão de tipo durante a associação de parâmetro poderá falhar se a conversão não for permitida entre limites de confiança. A falha ocorre quando o PowerShell tenta converter um valor executando um construtor de tipo. Os construtores de tipo não têm permissão para serem executados no modoConstrainedLanguage
.Neste exemplo, a conversão de tipo de associação de parâmetro normalmente é permitida, mas falha quando executada no modo
ConstrainedLanguage
. O construtor de tipoConnectionPort
não é permitido:PS> Create-ConnectionOnPort -Connection 22 Create-ConnectionOnPort: Cannot bind parameter 'Connection'. Cannot convert the "22" value of type "System.Int32" to type "ConnectionPort".
O cmdlet
Enter-PSHostProcess
não é permitidoO cmdlet
Enter-PSHostProcess
está desabilitado e gera um erro se usado. Esse comando é usado para sessões de anexação e depuração. Ele permite que você se conecte a qualquer outra sessão do PowerShell no computador local. O cmdlet está desabilitado para impedir a divulgação de informações e a execução de código arbitrário.
Restrições do PowerShell sob o modo de linguagem restrita
O script ou a função que não é aprovado pela política de Controle de Aplicativos não é confiável. Quando você executa um comando não confiável, o PowerShell bloqueia a execução do comando (novo comportamento) ou executa o comando no modo ConstrainedLanguage
. As restrições a seguir se aplicam ao modo ConstrainedLanguage
:
O cmdlet
Add-Type
não é permitidoBloquear
Add-Type
impede a execução de código .NET arbitrário.Cmdlet
Import-LocalizedData
restritoBloquear o parâmetro SupportedCommand de
Import-LocalizedData
impede a execução de código arbitrário.Cmdlet
Invoke-Expression
restritoTodos os blocos de script passados para o cmdlet
Invoke-Expression
são executados no modoConstrainedLanguage
para impedir a execução de código arbitrário.Cmdlet
New-Object
restritoO cmdlet
New-Object
é restrito a usar apenas tipos .NET e COM permitidos para impedir o acesso a tipos não confiáveis.Restrição do cmdlet
ForEach-Object
A invocação do método de tipo para variáveis passadas para
ForeEach-Object
não é permitida tipos .NET que não estejam na lista de aprovados. Em geral, o modoConstrainedLanguage
não permite qualquer invocação de método de objeto, exceto para tipos .NET aprovados para impedir o acesso a tipos .NET não confiáveis.Restrição do cmdlet
Export-ModuleMember
Usar o cmdlet
Export-ModuleMember
para exportar funções em um arquivo de script de módulo aninhado em que o módulo filho não é confiável e o módulo pai é confiável resulta em um erro. O bloqueio desse cenário impede que um módulo não confiável mal-intencionado exporte funções perigosas de um módulo confiável.Restrição do cmdlet
New-Module
Quando você executa
New-Module
em um script confiável, qualquer bloco de script fornecido pelo parâmetroScriptBlock
é marcado para ser executado no modoConstrainedLanguage
para evitar a injeção de código arbitrário em um contexto de execução confiável.Palavra-chave
Configuration
não permitidaA palavra-chave de linguagem
Configuration
não é permitida no modoConstrainedLanguage
para evitar ataques de injeção de código.Palavra-chave
class
não permitidaA palavra-chave de linguagem
class
não é permitida no modoConstrainedLanguage
para evitar a injeção de código arbitrário.Restrições de escopo de processamento do bloco de script
Os blocos de script filho não terão permissão para ser executados em escopos de bloco de script pai se os blocos de script tiverem níveis de confiança diferentes. Por exemplo, você cria uma relação filho ao fazer o dot-source de um script em outro. Bloquear esse cenário impede que um script não confiável obtenha acesso a funções perigosas no escopo do script confiável.
Impedir a descoberta de comandos de funções de script não confiáveis
A descoberta de comandos do PowerShell não retorna funções de uma fonte não confiável, como um script ou módulo não confiável, para uma função confiável. Bloquear a descoberta de comandos não confiáveis impede a injeção de código por meio do plantio de comandos.
Conversão de tabela de hash para objeto não permitida
O modo
ConstrainedLanguage
bloqueia conversões de tabela de hash para objeto nas seçõesData
de arquivos de dados (.psd1
) do PowerShell para evitar possíveis ataques de injeção de código.Conversão automática de tipo restrita
O modo
ConstrainedLanguage
bloqueia a conversão automática de tipo, exceto para um pequeno conjunto de tipos seguros aprovados para evitar possíveis ataques de injeção de código.Restrição implícita de exportação de função de módulo
Se um módulo não exportar funções explicitamente, o PowerShell exportará implicitamente todas as funções de módulo definidas automaticamente como um recurso de conveniência. No modo
ConstrainedLanguage
, as exportações implícitas não ocorrem mais quando um módulo é carregado entre limites de confiança. O bloqueio de exportações implícitas previne a exposição não intencional de funções de módulo perigosas não destinadas ao uso público.Os arquivos de script não podem ser importados como módulos
O PowerShell permite importar arquivos de script (
.ps1
) como um módulo. Todas as funções definidas tornam-se publicamente acessíveis. O modoConstrainedLanguage
bloqueia a importação do arquivo de script para evitar a exposição não intencional de funções de script perigosas.Configurando a restrição
AllScope
de variáveisO modo
ConstrainedLanguage
desabilita a capacidade de definirAllScope
em variáveis. Limitar o escopo das variáveis impede que elas interfiram no estado da sessão de comandos confiáveis.Invocação de método de tipo não permitida
O modo
ConstrainedLanguage
não permite a invocação de método em tipos não aprovados. O bloqueio de métodos em tipos não aprovados previne a invocação de métodos do tipo .NET que podem ser perigosos ou permitir a injeção de código.Setters de propriedade de tipo não são permitidos
O modo
ConstrainedLanguage
restringe a invocação de setters de propriedade em tipos não aprovados. O bloqueio de setters de propriedade em tipos não aprovados impede ataques de injeção de código.Criação de tipo não permitida
O modo
ConstrainedLanguage
bloqueia a criação de tipos em tipos não aprovados para bloquear construtores não confiáveis que podem permitir a injeção de código.Operador de escopo de módulo não permitido
O modo
ConstrainedLanguage
não permite o uso do operador de escopo do módulo. Por exemplo:& (Get-Module MyModule) MyFunction
. Bloquear o operador de escopo do módulo impede o acesso a funções e variáveis privadas do módulo.
Leitura adicional
- Para obter mais informações sobre os modos de linguagem do PowerShell, consulte about_Language_modes.
- Para obter informações sobre como configurar e usar o Controle de Aplicativos, consulte Como usar o Controle de Aplicativos para PowerShell.