Data di rilascio:25 febbraio 2025

Versione:.NET 8 e higher.NETFramework, tutte le versioni

Riepilogo

Microsoft ha implementato miglioramenti della sicurezza per le versioni recenti di Windows. Questi miglioramenti della sicurezza modificano la gestione del percorso temporaneo e possono causare la restituzione di determinate API .NET Framework e .NET comeSystem.IO.Path.GetTempPath()una posizione diversa dopo l'applicazione della patch.These security improvements modify temp path handling and may cause cause certain .NET Framework and .NET APIs likeSystem.IO.Path.GetTempPath()to return a different location after the patch is applied.

Azione necessaria

Non è richiesta alcuna azione da parte di .NET Framework o . applicazione basata su NET. L'applicazione trarrà automaticamente vantaggio da eventuali miglioramenti della sicurezza applicabili all'ambiente. La maggior parte delle applicazioni non osserva alcuna modifica comportamentale. 

Il resto di questo articolo spiega come determinare se questi miglioramenti della sicurezza possono influire sul comportamento di runtime dell'applicazione. Questo articolo elenca anche i passaggi per personalizzare il comportamento di runtime, se necessario

Software applicabile

Questo articolo si applica al software seguente: 

Solo in esecuzione sulle versioni di Windows Update seguenti: 

  • Windows 10, versione 22H2 quando è installato KB5052077

  • Windows Server 2019, quando è installato KB5053594 

  • Windows Server 2016, quando è installato KB5053594 

Questo articolo non si applica a .NET Framework o .NET in esecuzione su Windows 11, Windows Server 2022 o versione successiva. 

Questo articolo non si applica a .NET quando è in esecuzione su piattaforme non Windows. 

Descrizione dettagliata e dichiarazione d'impatto

Come indicato in precedenza, microsoft ha eseguito il backport dell'API GetTempPath2 di Win32 alle versioni precedenti di Windows sul mercato per fungere da sostituzione più sicura della precedente API GetTempPath di Win32. Internamente, .NET Framework e .NET si basano su queste API Win32 per fornire l'implementazione del metodo System.IO.Path.GetTempPath() : l'API win32 GetTempPath2 è preferibile se esiste; e l'API win32 GetTempPath viene utilizzata come fallback se GetTempPath2 non esiste. 

Poiché questi kb rendono disponibile la nuova API GetTempPath2 Win32 sulle piattaforme applicabili, .NET Framework e .NET inizieranno a usare GetTempPath2 dopo l'installazione. 

La modifica comportamentale principale è che i chiamanti che eseguono come identità SYSTEM osservano il metodo System.IO.Path.GetTempPath() restituire %WINDIR%\SystemTemp per impostazione predefinita, mentre i chiamanti che eseguono come qualsiasi altra cosa diversa dall'identità SYSTEM vedranno che il metodo continuerà a restituire il valore esistente. 

Se l'applicazione soddisfa tutti i criteri seguenti, questa modifica potrebbe influire su di esse: 

  • L'applicazione utilizza un runtime e una piattaforma del sistema operativo elencati sotto la precedente intestazione "Software applicabile"; e

  • L'applicazione viene eseguita come identità SYSTEM; e

  • Impostare manualmente la variabile di ambiente %TMP% o %TEMP% per reindirizzare il percorso di file temp standard. Vedere la sezione Osservazioni della documentazione sull'API Win32 GetTempPath .

Se soddisfi tutti questi criteri, una volta installate le kb di Windows, puoi osservare la scrittura dell'applicazione in una directory temporanea diversa da quella prevista. 

Questa modifica comportamentale può essere visibile tramite .NET Framework o . API fornita da NET che alla fine si basa su GetTempPath2. I punti di ingresso più comuni sono: 

Non si tratta di un elenco esaustivo dei metodi i cui comportamenti potrebbero cambiare dopo l'installazione delle kb. 

Determinare se un'applicazione viene eseguita sotto l'identità SYSTEM 

Esistono diversi meccanismi per determinare l'identità di un'applicazione .NET Framework o .NET

Applicazioni Web basate su IIS 

IIS fa riferimento all'identità SYSTEM come "LOCALSYSTEM". In Gestione IIS (inetmgr.exe) passare alla scheda Pool di applicazioni per visualizzare tutti i pool di app e le identità associate. È anche possibile selezionare "Identità" nell'elenco a discesa Raggruppa per per semplificare la visualizzazione dei pool di app in esecuzione come identità LOCALSYSTEM. 

Lo screenshot seguente mostra un esempio di pool di app ("MyAppPool") configurato per l'esecuzione come LOCALSYSTEM. Tutte le applicazioni in esecuzione all'interno di questo pool di app verranno eseguite come identità SYSTEM. 

Lo screenshot mostra un esempio di pool di app ("MyAppPool") configurato per l'esecuzione come LOCALSYSTEM. Tutte le applicazioni in esecuzione all'interno di questo pool di app verranno eseguite come identità SYSTEM.

È anche possibile accedere a queste informazioni a livello di programmazione da una sessione di PowerShell con privilegi elevati usando lo script seguente. 

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

In un computer configurato con un pool di app "MyAppPool" a livello di SISTEMA, come illustrato nello screenshot precedente, questo script di PowerShell stampa quanto segue, mostrando che "MyAppPool" è in esecuzione sotto l'identità SYSTEM. 

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

Servizi Windows 

Se .NET Framework o . L'applicazione basata su NET è registrata come servizio Windows, puoi usare il gestore dei servizi per visualizzare l'identità associata. 

Da un prompt dei comandi con privilegi elevati eseguire services.msc. Viene visualizzata l'interfaccia utente di Gestione servizi. 

Da un prompt dei comandi con privilegi elevati esegui services.msc. Viene visualizzata l'interfaccia utente di Gestione servizi.

Se la colonna Accedi come elenca "Sistema locale" per l'identità del servizio, il servizio è in esecuzione sotto l'identità SYSTEM. 

È anche possibile eseguire query su questi dati tramite PowerShell usando il cmdlet Get-Service . Ad esempio, per eseguire una query su queste informazioni per un servizio denominato MyService, usare il comando seguente. 

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

Se il servizio è registrato per l'esecuzione con l'identità SYSTEM, verrà stampato True sulla console. 

Altri meccanismi 

Strumenti come Gestione attività (taskmgr.exe) o Sysinternals Process Explorer possono anche stabilire se un'applicazione è in esecuzione sotto l'identità SYSTEM. 

In Gestione attività, utilizzare la visualizzazione Dettagli per elencare tutti i processi in esecuzione nel sistema, quindi individuare il processo di interesse e guardare la voce sotto la colonna Nome utente

In Gestione attività, utilizzare la visualizzazione Dettagli per elencare tutti i processi in esecuzione nel sistema, quindi individuare il processo di interesse e guardare la voce sotto la colonna Nome utente.

Se il valore Nome utente è "SISTEMA", il processo è in esecuzione sotto l'identità SYSTEM. 

In alternativa, in Sysinternals Process Explorer individuare il processo di interesse e immettere la visualizzazione Proprietà , quindi osservare il campo Utente nella scheda Immagine

in Sysinternals Process Explorer individuare il processo di interesse e immettere la visualizzazione Proprietà, quindi osservare il campo Utente nella scheda Immagine.

Se il valore User è "NT AUTHORITY\SYSTEM", il processo è in esecuzione sotto l'identità SYSTEM. 

Modifica del percorso temporaneo per i processi a livello di SISTEMA 

Lo script di PowerShell seguente illustra come creare una nuova directory C:\NewSystemTemp\ e limitare l'accesso alla directory solo ai processi in esecuzione sotto l'identità SYSTEM. Non tentare di modificare gli ACL di una directory che è già popolata con file. 

Questo script deve essere eseguito da una sessione di PowerShell con privilegi elevati. 

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 

È possibile verificare che l'operazione sia riuscita eseguendo il comando 

icacls C:\NewSystemTemp\ 

Che produrrà il seguente output che mostra il successo: 

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

Dopo aver creato la directory, impostare la variabile di ambiente %SYSTEMTEMP% con ambito a livello di sistema. Puoi impostare questa opzione tramite l'interfaccia utente di System Pannello di controllo oppure a livello di programmazione tramite PowerShell: 

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

Riavvia quindi il computer. 

La modifica della variabile di ambiente %SYSTEMTEMP%non modifica il valore restituito di System.IO.Path.GetTempPath() per le applicazioni .NET Framework e .NET in esecuzione come identità diversa da SYSTEM. Tali applicazioni continueranno a seguire la stessa logica di risoluzione che hanno sempre, inclusa l'onorare la %TMP% o %TEMP% variabili di ambiente, se presenti. 

Analogamente, l'impostazione della variabile di ambiente %TMP% o %TEMP% non modifica il valore restituito di System.IO.Path.GetTempPath() per le applicazioni .NET Framework e .NET in esecuzione come identità SYSTEM. 

Per ulteriori informazioni

Per altre informazioni sui comportamenti di .NET Framework e .NET, vedere la documentazione di .NET in Path.GetTempPath

Per altre informazioni sul comportamento del sistema operativo Windows sottostante, vedi la documentazione di Windows sull'API GetTempPath2 di Win32.

Serve aiuto?

Vuoi altre opzioni?

Esplorare i vantaggi dell'abbonamento e i corsi di formazione, scoprire come proteggere il dispositivo e molto altro ancora.