Partilhar via


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 no FullLanguage 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 no ConstrainedLanguage 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 no FullLanguage modo com algumas restrições.
  • Audit: O arquivo é executado ou carregado no FullLanguage 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 no ConstrainedLanguage 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 no FullLanguage 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 no ConstrainedLanguage modo.

    Neste exemplo, a conversão de tipo de vinculação de parâmetro é normalmente permitida, mas falha quando executada no ConstrainedLanguage modo. O ConnectionPort 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 permitido

    O 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 permitido

    O bloqueio Add-Type impede a execução de código .NET arbitrário.

  • Import-LocalizedData cmdlet restrito

    Bloquear o parâmetro SupportedCommand de Import-LocalizedData impede a execução de código arbitrário.

  • Invoke-Expression cmdlet restrito

    Todos os blocos de script passados para o Invoke-Expression cmdlet são executados no ConstrainedLanguage modo para evitar a execução arbitrária de código.

  • New-Object cmdlet restrito

    O 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 cmdlet

    A 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 cmdlet

    Usar 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 cmdlet

    Quando você executa New-Module em um script confiável, qualquer bloco de script fornecido pelo ScriptBlock parâmetro é marcado para ser executado no ConstrainedLanguage modo para evitar a injeção de código arbitrário em um contexto de execução confiável.

  • Configuration palavra-chave não permitida

    A Configuration palavra-chave language não é permitida no ConstrainedLanguage modo para evitar ataques de injeção de código.

  • class palavra-chave não permitida

    A class palavra-chave language não é permitida no ConstrainedLanguage 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 nas Data 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 definir AllScope 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