Data de Lançamento:25 de fevereiro de 2025

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

Resumo

A Microsoft implementou melhorias de segurança em versões recentes do Windows. Estas melhorias de segurança modificam o processamento do caminho temporário e podem fazer com que determinadas APIs de .NET Framework e .NET, comoSystem.IO.Path.GetTempPath(), devolvam uma localização diferente após a aplicação do patch.

Ação necessária

Não é necessária qualquer ação de qualquer .NET Framework ou . Aplicação baseada em NET. A sua aplicação beneficiará automaticamente de quaisquer melhorias de segurança aplicáveis ao seu ambiente. A maioria das aplicações não observará alterações comportamentais. 

O resto deste artigo detalha como determinar se estas melhorias de segurança podem afetar o comportamento do runtime da sua aplicação. Este artigo também lista os passos para personalizar o comportamento do runtime, se pretender

Software Aplicável

Este artigo aplica-se ao seguinte software: 

Apenas ao executar nas seguintes versões do Windows Update: 

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

  • Windows Server 2019, quando a KB5053594 está instalada 

  • Windows Server 2016, quando a KB5053594 é instalada 

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

Este artigo não se aplica ao .NET quando é executado em plataformas não Windows. 

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

A partir dos KBs de atualização do Windows mencionados acima, a Microsoft apoiou a API Win32 GetTempPath2 para versões mais antigas no mercado do Windows para funcionar como um substituto mais seguro para a API Win32 GetTempPath mais antiga. Internamente, .NET Framework e .NET dependem destas APIs Win32 para fornecer a implementação do método System.IO.Path.GetTempPath() : a API win32 GetTempPath2 é preferível se existir; e a API de GetTempPath Win32 é utilizada como contingência se GetTempPath2 não existir. 

Uma vez que estes KBs disponibilizam a nova API de GetTempPath2 Win32 nas plataformas aplicáveis, .NET Framework e .NET começarão a utilizar GetTempPath2 assim que os KBs tiverem sido instalados. 

A principal alteração comportamental é que os autores de chamadas que estejam a executar como a identidade SYSTEM observarão o método System.IO.Path.GetTempPath() devolver %WINDIR%\SystemTemp por predefinição, enquanto os autores de chamadas que estão a executar como qualquer outra coisa que não a identidade do SISTEMA observarão que o método continuará a devolver o valor existente. 

Se a sua aplicação cumprir todos os critérios abaixo, poderá ser afetado por esta alteração: 

  • A sua aplicação utiliza um runtime e uma plataforma de SO listadas no cabeçalho "Software Aplicável" anterior; e

  • A sua aplicação é executada como a identidade SYSTEM; e

  • Defina manualmente a variável de ambiente %TMP% ou %TEMP% para redirecionar a localização do ficheiro temporário padrão. (Veja a secção Observações da documentação da API win32 GetTempPath .)

Se cumprir todos estes critérios, assim que os KBs do Windows estiverem instalados, poderá observar a sua aplicação a escrever num diretório temporário diferente do diretório pretendido. 

Esta alteração comportamental pode ser visível através de qualquer .NET Framework ou . API fornecida pelo NET que, eventualmente, depende de GetTempPath2. Os pontos de entrada mais comuns são: 

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

Determinar se uma aplicação é executada na identidade SYSTEM 

Existem vários mecanismos diferentes para determinar a identidade de uma aplicação .NET Framework ou .NET

Aplicações Web baseadas em IIS 

O IIS refere-se à identidade do SISTEMA como "LOCALSYSTEM". No Gestor de IIS (inetmgr.exe), aceda ao separador Conjuntos Aplicacionais para ver todos os conjuntos de aplicações e as respetivas identidades associadas. Também pode selecionar "Identidade" na lista pendente Agrupar por para facilitar a visualização de conjuntos de aplicações em execução como a identidade LOCALSYSTEM. 

A captura de ecrã abaixo mostra um exemplo de um conjunto de aplicações ("MyAppPool") que está configurado para ser executado como LOCALSYSTEM. Todas as aplicações em execução neste conjunto de aplicações serão executadas como a identidade SYSTEM. 

A captura de ecrã mostra um exemplo de um conjunto aplicacional ("MyAppPool") que está configurado para ser executado como LOCALSYSTEM. Todas as aplicações em execução neste conjunto de aplicações serão executadas como a identidade SYSTEM.

Também pode aceder a estas informações programaticamente a partir de uma sessão elevada do PowerShell com o script abaixo. 

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

Num computador configurado com um conjunto de aplicações "MyAppPool" ao nível do SISTEMA, conforme mostrado na captura de ecrã acima, este script do PowerShell imprime o seguinte, mostrando que "MyAppPool" está em execução na identidade SYSTEM. 

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

Serviços Do Windows 

Se o seu .NET Framework ou . A aplicação baseada em NET está registada como um Serviço Windows. Pode utilizar o Gestor de serviços para ver a identidade associada. 

Numa linha de comandos elevada, execute services.msc. Esta ação apresenta a IU do Gestor de serviços. 

Numa linha de comandos elevada, execute services.msc. Esta ação apresenta a IU do Gestor de serviços.

Se a coluna Iniciar Sessão Como listar "Sistema Local" para a identidade do serviço, o serviço está em execução na identidade SYSTEM. 

Também pode consultar estes dados através do PowerShell com o cmdlet Get-Service . Por exemplo, para consultar estas informações de um serviço com o nome MyService, utilize o seguinte comando. 

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

Se o serviço estiver registado para ser executado na identidade SYSTEM, esta ação irá imprimir Verdadeiro na consola. 

Outros mecanismos 

Ferramentas como o Gestor de Tarefas (taskmgr.exe) ou o Explorador de Processos do Sysinternals também podem indicar se uma aplicação está em execução na identidade SYSTEM. 

No Gestor de Tarefas, utilize a vista Detalhes para listar todos os processos em execução no sistema e, em seguida, localize o processo de interesse e observe a entrada na coluna Nome de utilizador

No Gestor de Tarefas, utilize a vista Detalhes para listar todos os processos em execução no sistema e, em seguida, localize o processo de interesse e observe a entrada na coluna Nome de utilizador.

Se o valor Nome de utilizador indicar "SYSTEM", o processo está em execução na identidade SYSTEM. 

Em alternativa, no Explorador de Processos do Sysinternals, localize o processo de interesse e introduza a vista Propriedades e, em seguida, observe o campo Utilizador no separador Imagem

no Explorador de Processos do Sysinternals, localize o processo de interesse e introduza a vista Propriedades e, em seguida, observe o campo Utilizador no separador Imagem.

Se o valor de Utilizador ler "NT AUTHORITY\SYSTEM", o processo está em execução na identidade SYSTEM. 

Alterar o caminho temporário dos processos ao nível do SISTEMA 

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

Este script tem de ser executado a partir de uma sessão elevada do PowerShell. 

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 

Pode confirmar que esta operação foi efetuada com êxito ao executar o comando 

icacls C:\NewSystemTemp\ 

O que produzirá a seguinte saída com êxito: 

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

Assim que o diretório for criado, defina a variável de ambiente %SYSTEMTEMP% com o âmbito ao nível do sistema. Pode defini-lo através da IU do System Painel de Controlo ou pode defini-lo programaticamente através do PowerShell: 

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

Em seguida, reinicie o computador. 

Alterar a variável de ambiente %SYSTEMTEMP%não alterará o valor devolvido de System.IO.Path.GetTempPath() para aplicações .NET Framework e .NET que estejam em execução como uma identidade diferente de SYSTEM. Essas aplicações continuarão a seguir a mesma lógica de resolução que sempre tiveram, incluindo respeitar 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 devolvido de System.IO.Path.GetTempPath() para aplicações .NET Framework e .NET que estão a ser executadas como a identidade SYSTEM. 

Para obter mais informações

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

Para obter mais informações sobre o comportamento subjacente do SO Windows, veja a documentação do Windows sobre a API Win32 GetTempPath2.

Precisa de mais ajuda?

Quer mais opções?

Explore os benefícios da subscrição, navegue em cursos de formação, saiba como proteger o seu dispositivo e muito mais.