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:
-
.NET 8 e superior
-
.NET Framework, todas as versões, a partir das atualizações de segurança de julho de 2024 e atualizações subsequentes
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.
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.
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 .
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 .
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.