Como o Controle de Aplicativo funciona com o PowerShell
Este artigo explica como o Controle de Aplicativo 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 deteta uma política de bloqueio do sistema
O PowerShell deteta as políticas do AppLocker e do App Control for Business em todo o sistema. O AppLocker foi preterido. O App Control é o sistema de controle de aplicativos preferido para Windows.
Deteção de imposição de política de Controle de Aplicativo Legado
O PowerShell usa a API de Controle de WldpGetLockdownPolicy
Aplicativo herdada para descobrir duas coisas:
- Aplicaçã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) suportam esta deteção de política de Controlo de Aplicações.
Deteção de aplicação de política de Controlo de Aplicações mais recente
O Controle de Aplicativo introduziu novas APIs em versões recentes do Windows. A partir da versão 7.3, o PowerShell usa a nova WldpCanExecuteFile
API para decidir como um arquivo deve ser manipulado. 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 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 leva a entrada de linha de comando dos usuários como comandos ou scripts para 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 a entrada do usuário. Os fluxos de dados de resultado são ignorados ou redirecionados para um arquivo.
Modo interativo em execução sob imposição de política
O PowerShell executa comandos no ConstrainedLanguage
modo. Esse modo impede que usuários interativos executem determinados comandos ou executem códigos arbitrários. Para obter mais informações sobre as restrições nesse modo, consulte a seção Restrições do PowerShell sob política de bloqueio deste artigo.
Modo não interativo em execução sob imposição de política
Quando o PowerShell executa um script ou carrega um módulo, ele usa a API de Controle de Aplicativo para obter a imposição de política para o arquivo.
O PowerShell versão 7.3 ou superior usa a WldpCanExecuteFile
API, se disponível. Essa API retorna um dos seguintes resultados:
WLDP_CAN_EXECUTE_ALLOWED
: O arquivo é aprovado pela política e é usado noFullLanguage
modo 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 noConstrainedLanguage
modo.
No Windows PowerShell 5.1 ou se WldpCanExecuteFile
a API não estiver disponível, o comportamento por arquivo do PowerShell é:
None
: O arquivo é executado carregado noFullLanguage
modo com algumas restrições.Audit
: O arquivo é executado ou carregado noFullLanguage
modo 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 noConstrainedLanguage
modo.
Restrições do PowerShell sob política de bloqueio
Quando o PowerShell deteta que o sistema está sob uma política de bloqueio do Controle de Aplicativo, 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 podem resultar na execução arbitrária de código em um sistema bloqueado. A política de bloqueio impõe as seguintes restrições:
Módulo dot-sourcing com restrição de exportação de função curinga
Qualquer módulo que use script dot-sourcing e exporte funções usando nomes curinga resulta em um erro. O bloqueio de exportações de curingas impede a injeção de script de um usuário mal-intencionado que pode plantar um script não confiável que é originado por pontos em um módulo confiável. O script mal-intencionado pode então obter acesso às funções privadas do módulo confiável.
Recomendação de segurança: Nunca use script dot-sourcing em um módulo e sempre exporte funções de 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 curingas de módulos aninhados impede a exportação acidental de funções aninhadas perigosas por meio da correspondência de nomes curinga.
Recomendação de segurança: sempre exporte funções de módulo com nomes explícitos (sem caracteres curinga).
Conversão interativa de tipo de parâmetro shell
Quando o sistema é bloqueado, as sessões interativas do PowerShell são executadas no
ConstrainedLanguage
modo para evitar a execução arbitrária de código. Os módulos confiáveis carregados na sessão são executados noFullLanguage
modo. Se um cmdlet de módulo confiável usar tipos complexos para seus parâmetros, a conversão de tipo durante a vinculação de parâmetros 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 podem ser executados noConstrainedLanguage
modo.Neste exemplo, a conversão de tipo de vinculação de parâmetro é normalmente permitida, mas falha quando executada no
ConstrainedLanguage
modo. OConnectionPort
construtor type 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".
Enter-PSHostProcess
cmdlet não permitidoO
Enter-PSHostProcess
cmdlet está desabilitado e gera um erro se usado. Este comando é usado para anexar e depurar sessões. Ele permite que você se conecte a qualquer outra sessão do PowerShell na máquina local. O cmdlet está desabilitado para impedir a divulgação de informações e a execução arbitrária de código.
Restrições do PowerShell no modo de idioma restrito
O script ou função que não é aprovado pela política de Controlo de Aplicações não é fidedigno. Quando você executa um comando não confiável, o PowerShell bloqueia a execução do comando (novo comportamento) ou executa o comando no ConstrainedLanguage
modo. As seguintes restrições aplicam-se ao ConstrainedLanguage
modo:
Add-Type
cmdlet não permitidoO bloqueio
Add-Type
impede a execução de código .NET arbitrário.Import-LocalizedData
cmdlet restritoBloquear o parâmetro SupportedCommand de
Import-LocalizedData
impede a execução de código arbitrário.Invoke-Expression
cmdlet restritoTodos os blocos de script passados para o
Invoke-Expression
cmdlet são executados noConstrainedLanguage
modo para evitar a execução arbitrária de código.New-Object
cmdlet restritoO
New-Object
cmdlet é restrito a usar apenas os tipos .NET e COM permitidos, para impedir o acesso a tipos não confiáveis.ForEach-Object
restrição de cmdletA invocação do método Type para variáveis passadas para o
ForeEach-Object
não é permitida para qualquer tipo .NET que não esteja na lista aprovada. Em geral, o modo não permite qualquer invocação de método de objeto,ConstrainedLanguage
exceto para tipos .NET aprovados para impedir o acesso a tipos .NET não confiáveis.Export-ModuleMember
restrição de cmdletUsar
Export-ModuleMember
o cmdlet 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 mal-intencionado não confiável exporte funções perigosas de um módulo confiável.New-Module
restrição de cmdletQuando você executa
New-Module
em um script confiável, qualquer bloco de script fornecido peloScriptBlock
parâmetro é marcado para ser executado noConstrainedLanguage
modo para evitar a injeção de código arbitrário em um contexto de execução confiável.Configuration
palavra-chave não permitidaA
Configuration
palavra-chave language não é permitida noConstrainedLanguage
modo para evitar ataques de injeção de código.class
palavra-chave não permitidaA
class
palavra-chave language não é permitida noConstrainedLanguage
modo 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 podem 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 quando você dot-source 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. O bloqueio da descoberta de comandos não confiáveis impede a injeção de código por meio do plantio de comandos.
Conversão de hashtable para objeto não permitida
ConstrainedLanguage
mode bloqueia conversões de hashtable para objeto nasData
seções 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
ConstrainedLanguage
O modo bloqueia a conversão automática de tipos, exceto para um pequeno conjunto de tipos seguros aprovados para evitar possíveis ataques de injeção de código.Restrição de exportação de função de módulo implícita
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
ConstrainedLanguage
modo, as exportações implícitas não ocorrem mais quando um módulo é carregado através dos limites de confiança. O bloqueio das exportações implícitas evita a exposição não intencional de funções perigosas dos módulos 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 acessíveis ao público.ConstrainedLanguage
bloqueia a importação de arquivo de script para evitar a exposição não intencional de funções de script perigosas.Definição de restrição de variáveis
AllScope
ConstrainedLanguage
modo desativa a capacidade de definirAllScope
variáveis. Limitar o escopo das variáveis impede que as variáveis interfiram com o estado da sessão de comandos confiáveis.Invocação do método de tipo não permitida
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 impede a invocação de métodos de tipo .NET que podem ser perigosos ou permitir a injeção de código.Definir propriedades de tipo não permitido
ConstrainedLanguage
restringe a invocação de setters de propriedade em tipos não aprovados. Bloquear setters de propriedades em tipos não aprovados evita ataques de injeção de código.Criação de tipo não permitida
ConstrainedLanguage
O modo bloqueia a criação de tipos em tipos não aprovados para bloquear construtores não confiáveis que poderiam permitir a injeção de código.Operador de escopo do módulo não permitido
ConstrainedLanguage
não permite o uso do operador de escopo do módulo. Por exemplo:& (Get-Module MyModule) MyFunction
. O bloqueio do operador do escopo do módulo impede o acesso às 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 Aplicativo, consulte Como usar o Controle de Aplicativo para PowerShell.