Poznámka
- Datum vydání:
25 února, 2025 - Verze:
.NET 8 a novější
.NET Framework, všechny verze
Souhrn
Společnost Microsoft zavedla vylepšení zabezpečení do nejnovějších verzí systému Windows. Tato vylepšení zabezpečení upravují zpracování dočasných cest a můžou způsobit, že některá rozhraní .NET Framework a .NET API System.IO.Path.GetTempPath()po provedení opravy vrátí jiné umístění.
Vyžaduje se akce.
Od rozhraní .NET Framework nebo rozhraní .NET Framework není vyžadována žádná akce. Aplikace založená na síti. Vaše aplikace bude automaticky využívat všech vylepšení zabezpečení platných pro vaše prostředí. Většina aplikací nebude pozorovat žádné změny chování.
Zbývající část tohoto článku podrobně popisuje, jak zjistit, jestli tato vylepšení zabezpečení mohou ovlivnit chování aplikace za běhu. Tento článek také obsahuje kroky pro případné přizpůsobení chování modulu runtime
Použitelný software
Tento článek se týká následujícího softwaru:
- .NET 8 a novější
- .NET Framework, všechny verze, od aktualizací zabezpečení z července 2024 a následných aktualizací
Jenom při spuštění s následujícími verzemi aktualizací Windows:
- Windows 10, verze 22H2 při instalaci KB5052077
- Windows Server 2019 při instalaci KB5053594
- Windows Server 2016 při instalaci KB5053594
Tento článek se nevztahuje na .NET Framework nebo .NET běžící v systému Windows 11, Windows Server 2022 nebo novějším.
Tento článek se nevztahuje na rozhraní .NET při spuštění na jiných platformách než Windows.
Podrobný popis a prohlášení o dopadu
Od výše zmíněných aktualizací KB pro Windows Microsoft zpětně portoval rozhraní API Win32 GetTempPath2 do starších tržních verzí Windows, aby fungoval jako bezpečnější náhrada staršího rozhraní API Win32 GetTempPath . Interně rozhraní .NET Framework a .NET spoléhají na tato rozhraní API Win32 k zajištění implementace System.IO.Path.GetTempPath() metody: rozhraní API Win32 GetTempPath2 je upřednostňováno, pokud existuje; a rozhraní API Win32 GetTempPath je používáno jako záložní řešení, pokud GetTempPath2 neexistuje.
Vzhledem k tomu, že tyto aktualizace KB zpřístupňují nové rozhraní API Win32GetTempPath2na příslušných platformách, začnou rozhraní .NET Framework a .NET po instalaci aktualizací používat funkci GetTempPath2.
Primární změna chování spočívá v tom, že volající, kteří jsou spuštěni jako SYSTEM identita, budou ve výchozím nastavení pozorovat System.IO.Path.GetTempPath() vrácení %WINDIR%\SystemTemp metody, zatímco volající, kteří jsou spuštěni jako cokoli jiného než SYSTEM identita, uvidí, že metoda nadále vrací její existující hodnotu.
Pokud vaše aplikace splňuje všechna následující kritéria, může se vás tato změna dotknout:
- Vaše aplikace využívá modul runtime a platformu operačního systému uvedenou ve výše uvedeném oddílu "Příslušný software"; a dále
- Vaše aplikace běží jako identita SYSTEM. a dále
- Ručně nastavíte proměnnou
%TMP%prostředí or%TEMP%tak, aby přesměrovala standardní umístění dočasného souboru. (Viz část Poznámky ve Win32GetTempPathDokumentace k rozhraní API.)
Pokud splňujete všechna tato kritéria, pak po instalaci Windows KB můžete pozorovat, že vaše aplikace zapisuje do jiného dočasného adresáře, než jste zamýšleli.
Tato změna chování může být viditelná prostřednictvím libovolného rozhraní .NET Framework nebo rozhraní . rozhraní API poskytované sítí, které se nakonec spoléhá na GetTempPath2. Nejběžnější vstupní body jsou:
- System.IO.Path.GetTempPath
- System.IO.Path.GetTempFileName
- System.IO.Directory.CreateTempSubdirectory
Tento článek nelze chápat jako vyčerpávající seznam metod, jejichž chování se může po instalaci KB změnit.
Určení, jestli aplikace běží pod identitou SYSTEM
Existuje několik různých mechanismů pro určení identity rozhraní .NET Framework nebo aplikace .NET
Webové aplikace založené na službě IIS
Služba IIS označuje identitu SYSTEM jako LOCALSYSTEM. Ve Správci IIS (inetmgr.exe) přejděte na kartu Fondy aplikací a zobrazte si všechny fondy aplikací a jejich přidružené identity. Můžete také vybrat možnost Identita z rozevíracího seznamu Seskupit podle, abyste usnadnili zobrazení fondů aplikací, které běží pod identitou LOCALSYSTEM.
Snímek obrazovky níže ukazuje příklad fondu aplikací ("MyAppPool"), který je nakonfigurovaný tak, aby běžel jako LOCALSYSTEM. Všechny aplikace spuštěné v tomto fondu aplikací budou spuštěny jako identita SYSTEM.
K těmto informacím můžete přistupovat také programově z relace PowerShellu se zvýšenými oprávněními pomocí následujícího skriptu.
Import-Module IISAdministration
Get-IISAppPool | where {$_.ProcessModel.IdentityType -eq "LocalSystem"}
Na počítači nakonfigurovaném s fondem aplikací "MyAppPool" na úrovni systému, jak je znázorněno na výše uvedeném snímku obrazovky, tento skript PowerShellu vytiskne následující a zobrazí, že "MyAppPool" běží pod identitou SYSTEM.
Name Status CLR Ver Pipeline Mode Start Mode
---- ------ ------- ------------- ----------
MyAppPool Started v4.0 Integrated OnDemand
Služby Windows
Pokud vaše rozhraní .NET Framework nebo rozhraní . Aplikace založená na síti je registrována jako služba systému Windows, můžete použít Správce služeb k zobrazení její přidružené identity.
Z příkazového řádku se zvýšenými oprávněními spusťte services.mscpříkaz . Zobrazí se uživatelské rozhraní Správce služeb.
Pokud je ve sloupci Přihlásit jako pro identitu služby uveden "Místní systém", služba běží pod identitou SYSTEM.
Na tato data se můžete také dotazovat prostřednictvím PowerShellu pomocí rutiny Get-Service . Chcete-li například na tyto informace zadat dotaz na službu s názvem MyService, použijte následující příkaz.
(Get-Service MyService).UserName -ieq "LocalSystem"
Pokud je služba registrovaná ke spuštění pod identitou SYSTEM, vytiskne se tato možnost do konzoly jako True.
Další mechanismy
Nástroje, jako je Správce úloh (taskmgr.exe) nebo Průzkumník procesů Sysinternals , vám také můžou sdělit, jestli je aplikace spuštěná pod identitou SYSTEM.
Ve Správci úloh použijte zobrazení podrobností k zobrazení seznamu všech spuštěných procesů v systému, pak vyhledejte proces, který vás zajímá, a podívejte se na položku ve sloupci Uživatelské jméno .
Pokud je v poli Uživatelské jméno uvedeno "SYSTEM", proces běží pod identitou SYSTEM.
Nebo v Průzkumníku procesů Sysinternals vyhledejte proces, který vás zajímá, přejděte do zobrazení Vlastnosti a pak se podívejte na pole Uživatel na kartě Obrázek .
Pokud hodnota User je "NT AUTHORITY\SYSTEM", proces běží pod identitou SYSTEM.
Změna dočasné cesty pro procesy na úrovni systému
Následující skript PowerShellu ukazuje, jak vytvořit nový adresář C:\NewSystemTemp\ a omezit přístup k adresáři jenom na procesy spuštěné pod identitou SYSTEM. Nepokoušejte se měnit seznamy řízení přístupu v adresáři, který je již naplněn soubory.
Tento skript se musí spustit z relace PowerShellu se zvýšenými oprávněními.
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
Spuštěním tohoto příkazu můžete potvrdit, že tato operace proběhla úspěšně
icacls C:\NewSystemTemp\
Výsledkem bude následující úspěšný výstup:
C:\NewSystemTemp\ NT AUTHORITY\SYSTEM:(OI)(CI)(F)
BUILTIN\Administrators:(OI)(CI)(F)
Successfully processed 1 files; Failed processing 0 files
Po vytvoření adresáře nastavte proměnnou prostředí s oborem %SYSTEMTEMP% na úrovni systému. Můžete to nastavit pomocí uživatelského rozhraní systému v Ovládací panely systému nebo programově pomocí PowerShellu:
[Environment]::SetEnvironmentVariable("SYSTEMTEMP", "C:\NewSystemTemp", [EnvironmentVariableTarget]::Machine)
Pak restartujte počítač.
Změna proměnné %SYSTEMTEMP% prostředí nezmění návratovou hodnotu System.IO.Path.GetTempPath() pro .NET Framework a .NET aplikace, které běží jako jiná identita než SYSTEM. Tyto aplikace se budou dál řídit stejnou logikou rozlišení, jakou měly vždycky, včetně respektování %TMP% proměnných prostředí nebo %TEMP% , pokud jsou přítomné.
Podobně nastavení proměnné %TMP% prostředí or %TEMP% nezmění návratovou hodnotu System.IO.Path.GetTempPath() pro aplikace .NET Framework a .NET, které běží jako identita SYSTEM.
Další informace
Další informace o rozhraní .NET Framework a chování .NET najdete v dokumentaci k rozhraní .NET na Path.GetTempPath.
Další informace o základním chování operačního systému Windows najdete v dokumentaci k rozhraní API Win32 GetTempPath2.