Data de lançamento:25 de fevereiro de 2025

Versão:.NET 8 e superior.NET Framework, todas as versões

Resumo

A Microsoft distribuiu melhorias de segurança para versões recentes do Windows. Essas melhorias de segurança modificam o tratamento de caminho temporário e podem fazer com que determinadas APIs do .NET Framework e do .NET, comoSystem.IO.Path.GetTempPath(), retornem um local diferente após a aplicação do patch.

Ação necessária

Nenhuma ação é necessária de qualquer .NET Framework ou . Aplicativo baseado em NET. Seu aplicativo se beneficiará automaticamente de quaisquer melhorias de segurança aplicáveis ao seu ambiente. A maioria dos aplicativos não observará nenhuma alteração comportamental. 

O restante deste artigo detalha como determinar se essas melhorias de segurança podem afetar o comportamento de runtime do seu aplicativo. Este artigo também lista as etapas para personalizar o comportamento de runtime, se desejado

Software aplicável

Este artigo se aplica ao seguinte software: 

Somente ao executar nas seguintes versões de atualização do Windows: 

  • Windows 10, versão 22H2 quando KB5052077 é instalado

  • Windows Server 2019, quando o KB5053594 é instalado 

  • Windows Server 2016, quando KB5053594 é instalado 

Este artigo não se aplica a .NET Framework ou .NET em execução em Windows 11, Windows Server 2022 ou posterior. 

Este artigo não se aplica ao .NET ao executar em plataformas que não são do Windows. 

Descrição detalhada e instrução de impacto

A partir dos KBs de atualização do Windows mencionados acima, a Microsoft tem apoiado a API Win32 GetTempPath2 para versões mais antigas no mercado do Windows para atuar como uma substituição mais segura para a API GetTempPath do Win32 mais antiga. Internamente, .NET Framework e .NET dependem dessas APIs Win32 para fornecer a implementação do método System.IO.Path.GetTempPath() : a API GetTempPath2 Win32 é preferencial se ela existir; e a API GetTempPath Win32 é usada como um fallback se GetTempPath2 não existir. 

Como esses KBs disponibilizam a nova API do Win32 GetTempPath2 nas plataformas aplicáveis, .NET Framework e .NET começarão a usar GetTempPath2 depois que os KBs forem instalados. 

A principal alteração comportamental é que os chamadores que estão executando como a identidade SYSTEM observarão o método System.IO.Path.GetTempPath() retornar %WINDIR%\SystemTemp por padrão, enquanto os chamadores que estão executando como qualquer outra coisa que não a identidade SYSTEM observarão que o método continuará a retornar seu valor existente. 

Se o aplicativo atender a todos os critérios abaixo, você poderá ser afetado por essa alteração: 

  • Seu aplicativo utiliza uma plataforma de runtime e sistema operacional listada no título "Software Aplicável" anterior; e

  • Seu aplicativo é executado como a identidade system; e

  • Você define manualmente a variável de ambiente %TMP% ou %TEMP% para redirecionar o local do arquivo temporário padrão. (Confira a seção Comentários da documentação da API do GetTempPath Win32.)

Se você atender a todos esses critérios, depois que os KBs do Windows forem instalados, você poderá observar seu aplicativo escrevendo em um diretório temporário diferente do diretório pretendido. 

Essa alteração comportamental pode estar visível por meio de qualquer .NET Framework ou . A API fornecida pelo NET, que eventualmente depende do GetTempPath2. Os pontos de entrada mais comuns são: 

Isso não se destina a ser uma lista exaustiva de métodos cujos comportamentos podem ser alterados depois que os KBs forem instalados. 

Determinar se um aplicativo é executado sob a identidade system 

Há vários mecanismos diferentes para determinar a identidade de um aplicativo .NET Framework ou .NET

Aplicativos Web baseados em IIS 

O IIS refere-se à identidade SYSTEM como "LOCALSYSTEM". No Gerenciador do IIS (inetmgr.exe), acesse a guia Pools de Aplicativos para ver todos os pools de aplicativos e suas identidades associadas. Você também pode selecionar "Identidade" no grupo por lista suspensa para facilitar a visualização de pools de aplicativos que estão em execução como a identidade LOCALSYSTEM. 

A captura de tela abaixo mostra um exemplo de um pool de aplicativos ("MyAppPool") que está configurado para ser executado como LOCALSYSTEM. Todos os aplicativos em execução neste pool de aplicativos serão executados como a identidade system. 

A captura de tela mostra um exemplo de um pool de aplicativos ("MyAppPool") que está configurado para ser executado como LOCALSYSTEM. Todos os aplicativos em execução neste pool de aplicativos serão executados como a identidade system.

Você também pode acessar essas informações programaticamente a partir de uma sessão do PowerShell elevada usando o script abaixo. 

Import-Module IISAdministration  Get-IISAppPool | where {$_.ProcessModel.IdentityType -eq "LocalSystem"} 

Em um computador configurado com um pool de aplicativos "MyAppPool" no nível do SISTEMA, conforme mostrado na captura de tela acima, este script do PowerShell imprime o seguinte, mostrando que "MyAppPool" está em execução sob a identidade SYSTEM. 

Name                 Status       CLR Ver  Pipeline Mode  Start Mode  ----                 ------       -------  -------------  ---------- MyAppPool            Started      v4.0     Integrated     OnDemand 

Serviços Windows 

Se o .NET Framework ou . O aplicativo baseado em NET é registrado como um Serviço Windows, você pode usar o gerenciador de Serviços para exibir sua identidade associada. 

Em um prompt de comando elevado, execute services.msc. Isso exibe a interface do usuário do Gerenciador de Serviços. 

De um prompt de comando elevado, execute services.msc. Isso exibe a interface do usuário do Gerenciador de Serviços.

Se a coluna Log On As listar "Sistema Local" para a identidade do serviço, o serviço estará em execução sob a identidade SYSTEM. 

Você também pode consultar esses dados por meio do PowerShell usando o cmdlet Get-Service . Por exemplo, para consultar essas informações para um serviço chamado MyService, use o comando a seguir. 

(Get-Service MyService).UserName -ieq "LocalSystem" 

Se o serviço estiver registrado para ser executado sob a identidade SYSTEM, isso imprimirá True para o console. 

Outros mecanismos 

Ferramentas como Gerenciador de Tarefas (taskmgr.exe) ou Sysinternals Process Explorer também podem informar se um aplicativo está em execução sob a identidade system. 

No Gerenciador de Tarefas, use a exibição Detalhes para listar todos os processos em execução no sistema e localize o processo de interesse e examine a entrada na coluna Nome de usuário

No Gerenciador de Tarefas, use a exibição Detalhes para listar todos os processos em execução no sistema e localize o processo de interesse e examine a entrada na coluna Nome de usuário.

Se o valor nome de usuário ler "SYSTEM", o processo será executado sob a identidade SYSTEM. 

Ou, no Processo Sysinternals Explorer, localize o processo de interesse e insira a exibição Propriedades e, em seguida, examine o campo Usuário na guia Imagem

no Processo Sysinternals Explorer, localize o processo de interesse e insira a exibição Propriedades e, em seguida, examine o campo Usuário na guia Imagem.

Se o valor de usuário ler "NT AUTHORITY\SYSTEM", o processo será executado sob a identidade system. 

Alterando o caminho temporário para processos no nível do SYSTEM 

O script do PowerShell abaixo demonstra como criar um novo diretório C:\NewSystemTemp\ e restringir o acesso ao diretório a apenas processos em execução sob a identidade SYSTEM. Não tente alterar as ACLs de um diretório que já está preenchido com arquivos. 

Esse script deve ser executado a partir de uma sessão do PowerShell elevada. 

mkdir C:\NewSystemTemp\  $acl = New-Object System.Security.AccessControl.DirectorySecurity  $acl.SetSecurityDescriptorSddlForm("O:SYG:SYD:PAI(A;OICI;FA;;;SY)(A;OICI;FA;;;BA)")  Set-Acl C:\NewSystemTemp\ -AclObject $acl 

Você pode confirmar que essa operação foi bem-sucedida executando o comando 

icacls C:\NewSystemTemp\ 

O que produzirá a seguinte saída mostrando sucesso: 

C:\NewSystemTemp\ NT AUTHORITY\SYSTEM:(OI)(CI)(F)                    BUILTIN\Administrators:(OI)(CI)(F)   Successfully processed 1 files; Failed processing 0 files 

Depois que o diretório for criado, defina a variável de ambiente %SYSTEMTEMP% com escopo no nível do sistema. Você pode definir isso por meio da interface do usuário do System Painel de Controle ou defini-la programaticamente por meio do PowerShell: 

[Environment]::SetEnvironmentVariable("SYSTEMTEMP", "C:\NewSystemTemp", [EnvironmentVariableTarget]::Machine) 

Em seguida, reinicialize o computador. 

A alteração da variável de ambiente %SYSTEMTEMP%não alterará o valor retornado de System.IO.Path.GetTempPath() para aplicativos .NET Framework e .NET que estão em execução como uma identidade diferente do SYSTEM. Esses aplicativos continuarão a seguir a mesma lógica de resolução que sempre têm, incluindo honrar as variáveis de ambiente %TMP% ou %TEMP% se estiverem presentes. 

Da mesma forma, definir a variável de ambiente %TMP% ou %TEMP% não alterará o valor retornado de System.IO.Path.GetTempPath() para aplicativos .NET Framework e .NET que estão em execução como a identidade SYSTEM. 

Para obter mais informações

Para obter mais informações sobre comportamentos .NET Framework e .NET, consulte a documentação do .NET em Path.GetTempPath

Para obter mais informações sobre o comportamento subjacente do sistema operacional Windows, consulte a documentação do Windows na API GetTempPath2 do Win32.

Precisa de mais ajuda?

Quer mais opções

Explore os benefícios da assinatura, procure cursos de treinamento, saiba como proteger seu dispositivo e muito mais.