Data wydania:
25 lutego 2025 r.Wersja:
.NET 8 i nowsze .NET Framework, wszystkie wersjePodsumowanie
Firma Microsoft wdrożyła ulepszenia zabezpieczeń w najnowszych wersjach systemu Windows. Te ulepszenia zabezpieczeń modyfikują obsługę ścieżek tymczasowych i mogą powodować, że niektóre interfejsy API .NET Framework i .NET, takie jakSystem.IO.Path.GetTempPath(), zwracają inną lokalizację po zastosowaniu poprawki.
Wymagane działanie
Nie jest wymagane żadne działanie w przypadku żadnych .NET Framework ani . Aplikacja oparta na usłudze NET. Twoja aplikacja automatycznie skorzysta z wszelkich ulepszeń zabezpieczeń mających zastosowanie do Twojego środowiska. Większość aplikacji nie będzie obserwować żadnych zmian behawioralnych.
W dalszej części tego artykułu opisano, jak ustalić, czy te ulepszenia zabezpieczeń mogą mieć wpływ na zachowanie aplikacji w czasie wykonywania. W tym artykule wymieniono również kroki dostosowywania zachowania środowiska uruchomieniowego w razie potrzeby
Odpowiednie oprogramowanie
Ten artykuł dotyczy następującego oprogramowania:
-
.NET 8 lub nowszy
-
.NET Framework, wszystkie wersje, od aktualizacji zabezpieczeń z lipca 2024 r. i kolejnych aktualizacji
Tylko w następujących wersjach aktualizacji systemu Windows:
-
Windows 10, wersja 22H2 po zainstalowaniu KB5052077
-
Windows Server 2019 r. po zainstalowaniu KB5053594
-
Windows Server 2016 po zainstalowaniu KB5053594
Ten artykuł nie dotyczy .NET Framework ani programu .NET działającego w Windows 11, Windows Server 2022 lub nowszym.
Ten artykuł nie dotyczy programu .NET działającego na platformach innych niż Windows.
Szczegółowy opis i instrukcja wpływu
W związku z wymienionymi powyżej aktualizacjami systemu Windows firma Microsoft przywróciła interfejs API Win32 GetTempPath2 do starszych wersji systemu Windows na rynku, aby działać jako bezpieczniejszy zamiennik starszego interfejsu API GetTempPath win32. Wewnętrznie .NET Framework i .NET korzystają z tych interfejsów API win32, aby zapewnić implementację metody System.IO.Path.GetTempPath() : preferowany jest interfejs API usługi Win32 GetTempPath2 , jeśli istnieje; a interfejs API GetTempPath win32 jest używany jako rezerwowy interfejs api, jeśli nie istnieje program GetTempPath2.
Ponieważ te kb udostępnić nowy interfejs API win32 GetTempPath2 na odpowiednich platformach, .NET Framework i .NET zacznie używać GetTempPath2 po zainstalowaniu kb.
Podstawowa zmiana behawioralna polega na tym, że osoby dzwoniące działające jako tożsamość SYSTEM będą domyślnie obserwować metodę System.IO.Path.GetTempPath() zwracaną %WINDIR%\SystemTemp , natomiast osoby wywołujące działające jako dowolne inne elementy niż tożsamość SYSTEM będą obserwować metodę, która będzie nadal zwracać jej istniejącą wartość.
Jeśli aplikacja spełnia wszystkie poniższe kryteria, ta zmiana może mieć wpływ na Ciebie:
-
Aplikacja korzysta z środowiska uruchomieniowego i platformy systemu operacyjnego wymienionej pod wcześniejszym nagłówkiem "Odpowiednie oprogramowanie". i
-
Aplikacja działa jako tożsamość SYSTEM; i
-
Ręcznie ustawiasz zmienną środowiskową %TMP% lub %TEMP% w celu przekierowania standardowej lokalizacji pliku tymczasowego. (Zobacz sekcję Uwagi w dokumentacji interfejsu API GetTempPath Win32).
Jeśli spełniasz wszystkie te kryteria, po zainstalowaniu plików KB systemu Windows możesz obserwować zapisywanie aplikacji w katalogu tymczasowym innym niż katalog, który został zamierzony.
Ta zmiana behawioralna może być widoczna w dowolnym .NET Framework lub . Interfejs API dostarczany przez sieć NET, który ostatecznie korzysta z programu GetTempPath2. Najpopularniejsze punkty wejścia to:
Nie jest to pełna lista metod, których zachowania mogą ulec zmianie po zainstalowaniu kb.
Określanie, czy aplikacja działa w ramach tożsamości SYSTEM
Istnieje kilka różnych mechanizmów określania tożsamości aplikacji .NET Framework lub .NET
Aplikacje sieci Web oparte na systemie IIS
Usługa IIS określa tożsamość systemu jako "LOCALSYSTEM". W menedżerze IIS (inetmgr.exe) przejdź do karty Pule aplikacji, aby wyświetlić wszystkie pule aplikacji i skojarzone z nimi tożsamości. Możesz również wybrać pozycję "Tożsamość" z listy rozwijanej Grupuj według, aby ułatwić wyświetlanie pul aplikacji działających jako tożsamość LOCALSYSTEM.
Poniższy zrzut ekranu przedstawia przykład puli aplikacji ("MyAppPool"), która jest skonfigurowana do uruchamiania jako LOCALSYSTEM. Wszystkie aplikacje uruchomione w tej puli aplikacji będą uruchamiane jako tożsamość SYSTEM.
Dostęp do tych informacji można również uzyskać programowo z poziomu sesji programu PowerShell z podwyższonym poziomem uprawnień przy użyciu poniższego skryptu.
Import-Module IISAdministration Get-IISAppPool | where {$_.ProcessModel.IdentityType -eq "LocalSystem"}
Na komputerze skonfigurowanym przy użyciu puli aplikacji "MyAppPool" na poziomie systemowym, jak pokazano na powyższym zrzucie ekranu, ten skrypt programu PowerShell drukuje następujące elementy, pokazując, że aplikacja "MyAppPool" jest uruchomiona w ramach tożsamości systemu.
Name Status CLR Ver Pipeline Mode Start Mode ---- ------ ------- ------------- ---------- MyAppPool Started v4.0 Integrated OnDemand
Usługi systemu Windows
Jeśli .NET Framework lub . Aplikacja oparta na sieci jest zarejestrowana jako usługa systemu Windows. Menedżer usług może wyświetlać skojarzoną tożsamość tej aplikacji.
W wierszu polecenia z podwyższonym poziomem uprawnień uruchom services.msc. Spowoduje to wyświetlenie interfejsu użytkownika menedżera usług.
Jeśli kolumna Zaloguj jako zawiera listę "System lokalny" dla tożsamości usługi, usługa jest uruchomiona w ramach tożsamości SYSTEM.
Za pomocą polecenia cmdlet Get-Service można również wykonywać zapytania dotyczące tych danych za pośrednictwem programu PowerShell. Aby na przykład wykonać zapytanie dotyczące usługi o nazwie MyService, użyj następującego polecenia.
(Get-Service MyService).UserName -ieq "LocalSystem"
Jeśli usługa jest zarejestrowana do uruchomienia pod tożsamością SYSTEM, spowoduje to wydrukowanie na konsoli wartości True.
Inne mechanizmy
Narzędzia, takie jak Menedżer zadań (taskmgr.exe) lub Eksplorator procesów Sysinternals , mogą również określić, czy aplikacja jest uruchomiona w ramach tożsamości SYSTEMU.
W Menedżerze zadań użyj widoku Szczegóły, aby wyświetlić listę wszystkich uruchomionych procesów w systemie, a następnie znajdź interesujący proces i spójrz na wpis w kolumnie Nazwa użytkownika .
Jeśli wartość Nazwa użytkownika brzmi "SYSTEM", proces jest uruchamiany w ramach tożsamości SYSTEM.
Ewentualnie w Eksploratorze procesów firmy Sysinternals znajdź interesujący cię proces i wprowadź widok Właściwości , a następnie spójrz na pole Użytkownik na karcie Obraz .
Jeśli wartość User (Użytkownik ) ma wartość "NT AUTHORITY\SYSTEM", proces jest uruchamiany w ramach tożsamości SYSTEM.
Zmienianie ścieżki tymczasowej dla procesów na poziomie systemu
Poniższy skrypt programu PowerShell pokazuje, jak utworzyć nowy katalog C:\NewSystemTemp\ i ograniczyć dostęp do katalogu tylko do procesów uruchamianych w ramach tożsamości SYSTEM. Nie próbuj zmieniać list ACL katalogu, który jest już wypełniony plikami.
Ten skrypt musi być uruchamiany z poziomu sesji programu PowerShell z podwyższonym poziomem uprawnień.
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
Możesz potwierdzić, że ta operacja zakończyła się pomyślnie, uruchamiając polecenie
icacls C:\NewSystemTemp\
Co spowoduje uzyskanie następujących wyników pokazujących sukces:
C:\NewSystemTemp\ NT AUTHORITY\SYSTEM:(OI)(CI)(F) BUILTIN\Administrators:(OI)(CI)(F) Successfully processed 1 files; Failed processing 0 files
Po utworzeniu katalogu ustaw zmienną środowiskową %SYSTEMTEMP% z zakresem na poziomie systemu. Można to ustawić za pomocą interfejsu użytkownika Panel sterowania systemowego lub programowo za pomocą programu PowerShell:
[Environment]::SetEnvironmentVariable("SYSTEMTEMP", "C:\NewSystemTemp", [EnvironmentVariableTarget]::Machine)
Następnie uruchom ponownie komputer.
Zmiana zmiennej środowiskowej %SYSTEMTEMP%nie spowoduje zmiany zwracanej wartości System.IO.Path.GetTempPath() dla aplikacji .NET Framework i .NET działających jako tożsamość inna niż SYSTEM. Te aplikacje będą nadal przestrzegać tej samej logiki rozdzielczości, które zawsze mają, w tym uwzględniania %TMP% lub %TEMP% zmiennych środowiskowych, jeśli istnieją.
Podobnie ustawienie zmiennej środowiskowej %TMP% lub %TEMP% nie spowoduje zmiany zwracanej wartości System.IO.Path.GetTempPath() dla aplikacji .NET Framework i .NET uruchomionych jako tożsamość SYSTEM.
Aby uzyskać więcej informacji
Aby uzyskać więcej informacji na temat zachowań .NET Framework i .NET, zobacz dokumentację programu .NET w witrynie Path.GetTempPath.
Aby uzyskać więcej informacji na temat zachowania systemu operacyjnego Windows, zobacz dokumentację systemu Windows dotyczącą interfejsu API Win32 GetTempPath2.