Fecha de publicación:
25 de febrero de 2025Versión:
.NET 8 y versiones posteriores.NET Framework, todas las versionesResumen
Microsoft ha implementado mejoras de seguridad en versiones recientes de Windows. Estas mejoras de seguridad modifican el control de rutas temporales y pueden provocar que determinadas API de .NET Framework y .NET, comoSystem.IO.Path.GetTempPath(), devuelvan una ubicación diferente después de aplicar la revisión.
Acción necesaria
No se requiere ninguna acción de .NET Framework o . Aplicación basada en NET. La aplicación se beneficiará automáticamente de cualquier mejora de seguridad aplicable a su entorno. La mayoría de las aplicaciones no observarán ningún cambio conductual.
El resto de este artículo detalla cómo determinar si estas mejoras de seguridad pueden afectar al comportamiento en tiempo de ejecución de la aplicación. En este artículo también se enumeran los pasos para personalizar el comportamiento del tiempo de ejecución si lo desea.
Software aplicable
Este artículo se aplica al software siguiente:
-
.NET 8 y versiones posteriores
-
.NET Framework, todas las versiones, a partir de las actualizaciones de seguridad de julio de 2024 y las actualizaciones posteriores
Solo cuando se ejecuta en las siguientes versiones de actualización de Windows:
-
Windows 10, versión 22H2 cuando se instala KB5052077
-
Windows Server 2019, cuando se instala KB5053594
-
Windows Server 2016, al instalar KB5053594
Este artículo no se aplica a .NET Framework o .NET que se ejecuta en Windows 11, Windows Server 2022 o posterior.
Este artículo no se aplica a .NET cuando se ejecuta en plataformas que no son Windows.
Descripción detallada e instrucción de impacto
A partir de los códigos KB de actualización de Windows mencionados anteriormente, Microsoft ha retrocedido la API GetTempPath2 de Win32 a versiones más antiguas del mercado de Windows para que actúen como un reemplazo más seguro para la API GetTempPath de Win32 más antigua. Internamente, .NET Framework y .NET se basan en estas API de Win32 para proporcionar la implementación del método de System.IO.Path.GetTempPath() : se prefiere la API de Win32 GetTempPath2 si existe; y la API de GetTempPath de Win32 se usa como reserva si GetTempPath2 no existe.
Dado que estos KB hacen que la nueva API de Win32 GetTempPath2 esté disponible en las plataformas aplicables, .NET Framework y .NET empezarán a usar GetTempPath2 una vez que se hayan instalado los KB.
El cambio de comportamiento principal es que los autores de llamadas que se ejecutan como la identidad del SISTEMA observarán el método System.IO.Path.GetTempPath() devuelven %WINDIR%\SystemTemp de forma predeterminada, mientras que los autores de llamadas que se ejecutan como cualquier cosa que no sea la identidad del SISTEMA observarán que el método seguirá devolviendo su valor existente.
Si la aplicación cumple todos los criterios siguientes, es posible que se vea afectado por este cambio:
-
La aplicación utiliza una plataforma en tiempo de ejecución y sistema operativo que aparece bajo el encabezado anterior "Software aplicable"; y
-
La aplicación se ejecuta como identidad de SISTEMA; y
-
Establezca manualmente la variable de entorno %TMP% o %TEMP% para redirigir la ubicación del archivo temporal estándar. (Consulta la sección Observaciones de la documentación de api de GetTempPath de Win32).
Si cumples todos estos criterios, una vez instalados los KB de Windows, puedes observar la escritura de la aplicación en un directorio temporal distinto del directorio deseado.
Este cambio de comportamiento puede ser visible a través de .NET Framework o . API proporcionada por NET que finalmente se basa en GetTempPath2. Los puntos de entrada más comunes son:
Esta no es una lista exhaustiva de métodos cuyos comportamientos pueden cambiar una vez instalados los KB.
Determinar si una aplicación se ejecuta con la identidad system
Existen varios mecanismos diferentes para determinar la identidad de una aplicación .NET Framework o .NET
Aplicaciones web basadas en IIS
IIS se refiere a la identidad del SISTEMA como "LOCALSYSTEM". En el Administrador de IIS (inetmgr.exe), vaya a la pestaña Grupos de aplicaciones para ver todos los grupos de aplicaciones y sus identidades asociadas. También puedes seleccionar "Identidad" en el grupo en la lista desplegable para que sea más fácil ver los grupos de aplicaciones que se ejecutan como identidad LOCALSYSTEM.
La captura de pantalla siguiente muestra un ejemplo de un grupo de aplicaciones ("MyAppPool") que está configurado para ejecutarse como LOCALSYSTEM. Todas las aplicaciones que se ejecuten dentro de este grupo de aplicaciones se ejecutarán como identidad del SISTEMA.
También puede obtener acceso a esta información mediante programación desde una sesión de PowerShell con privilegios elevados mediante el script siguiente.
Import-Module IISAdministration Get-IISAppPool | where {$_.ProcessModel.IdentityType -eq "LocalSystem"}
En un equipo configurado con un grupo de aplicaciones "MyAppPool" de nivel DE SISTEMA, tal como se muestra en la captura de pantalla anterior, este script de PowerShell imprime lo siguiente, lo que muestra que "MyAppPool" se ejecuta bajo la identidad del SISTEMA.
Name Status CLR Ver Pipeline Mode Start Mode ---- ------ ------- ------------- ---------- MyAppPool Started v4.0 Integrated OnDemand
Servicios de Windows
Si .NET Framework o . La aplicación basada en NET está registrada como servicio de Windows, puede usar el Administrador de servicios para ver su identidad asociada.
Desde un símbolo del sistema con privilegios elevados, ejecute services.msc. Se mostrará la interfaz de usuario del Administrador de servicios.
Si la columna Iniciar sesión como enumera "Sistema local" para la identidad del servicio, entonces el servicio se ejecuta bajo la identidad del SISTEMA.
También puede consultar estos datos a través de PowerShell mediante el cmdlet de Get-Service . Por ejemplo, para consultar esta información de un servicio denominado MyService, use el siguiente comando.
(Get-Service MyService).UserName -ieq "LocalSystem"
Si el servicio está registrado para ejecutarse con la identidad de SISTEMA, se imprimirá True en la consola.
Otros mecanismos
Herramientas como el Administrador de tareas (taskmgr.exe) o el Explorador de procesos de Sysinternals también pueden indicarte si una aplicación se está ejecutando bajo la identidad del SISTEMA.
En el Administrador de tareas, use la vista de detalles para enumerar todos los procesos en ejecución en el sistema, a continuación, busque el proceso de interés y mire la entrada en la columna Nombre de usuario .
Si el valor nombre de usuario lee "SISTEMA", el proceso se ejecuta bajo la identidad del SISTEMA.
O bien, en el Explorador de procesos de Sysinternals, busque el proceso de interés, escriba la vista Propiedades y, a continuación, mire el campo Usuario en la pestaña Imagen .
Si el valor usuario lee "NT AUTHORITY\SYSTEM", el proceso se ejecuta bajo la identidad del SISTEMA.
Cambiar la ruta temporal de los procesos de nivel de SISTEMA
El script de PowerShell siguiente muestra cómo crear un nuevo directorio C:\NewSystemTemp\ y restringir el acceso al directorio solo a los procesos que se ejecutan bajo la identidad del SISTEMA. No intente cambiar las ACL de un directorio que ya se ha rellenado con archivos.
Este script debe ejecutarse desde una sesión de PowerShell con privilegios elevados.
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
Puede confirmar que esta operación se realizó correctamente ejecutando el comando
icacls C:\NewSystemTemp\
Lo que producirá el siguiente resultado que muestra el éxito:
C:\NewSystemTemp\ NT AUTHORITY\SYSTEM:(OI)(CI)(F) BUILTIN\Administrators:(OI)(CI)(F) Successfully processed 1 files; Failed processing 0 files
Una vez creado el directorio, establezca la variable de entorno %SYSTEMTEMP% con el ámbito del nivel del sistema. Puede establecer esto a través de la interfaz de usuario de System Panel de control o puede establecerlo mediante programación a través de PowerShell:
[Environment]::SetEnvironmentVariable("SYSTEMTEMP", "C:\NewSystemTemp", [EnvironmentVariableTarget]::Machine)
A continuación, reinicia el equipo.
Cambiar la variable de entorno %SYSTEMTEMP%no cambiará el valor devuelto de System.IO.Path.GetTempPath() para las aplicaciones .NET Framework y .NET que se ejecutan como una identidad distinta de SYSTEM. Esas aplicaciones seguirán siguiendo la misma lógica de resolución que siempre tienen, lo que incluye respetar las variables de entorno %TMP% o %TEMP% si están presentes.
De forma similar, establecer la variable de entorno %TMP% o %TEMP% no cambiará el valor devuelto de System.IO.Path.GetTempPath() para .NET Framework y las aplicaciones .NET que se ejecutan como identidad del SISTEMA.
Para obtener más información
Para obtener más información sobre los comportamientos de .NET Framework y .NET, consulte la documentación de .NET sobre Path.GetTempPath.
Para obtener más información sobre el comportamiento subyacente del SO Windows, consulte la documentación de Windows sobre la API GetTempPath2 de Win32.