Дата випуску:25 лютого 2025 р.
Версія:.NET 8 і новіші.NET Framework, усі версії
Загальні відомості
Корпорація Майкрософт випустила вдосконалення системи безпеки для останніх версій Windows. Ці покращення безпеки змінюють тимчасову обробку шляхів і можуть призвести до того, що певні .NET Framework та API .NET, наприкладSystem.IO.Path.GetTempPath(), повертають інше розташування після застосування виправлення.
Потрібна дія
Жодних дій з .NET Framework або . Net-based application. Ваша програма автоматично виграє від будь-яких покращень безпеки, що застосовуються до вашого середовища. У більшості програм не спостерігатимуться будь-які зміни поведінки.
В решті цієї статті пояснюється, як визначити, чи можуть ці покращення безпеки вплинути на поведінку середовища виконання програми. У цій статті також наведено вказівки з настроювання поведінки середовища виконання, якщо потрібно
Застосовне програмне забезпечення
Ця стаття стосується такого програмного забезпечення:
-
.NET 8 і новішої версії
-
.NET Framework, усі версії, оновлення системи безпеки за липень 2024 р. та подальші оновлення
Лише в таких версіях Windows Update:
-
Windows 10 версії 22H2 під час інсталяції KB5052077
-
Windows Server 2019 р. під час інсталяції KB5053594
-
Windows Server 2016 р. під час інсталяції KB5053594
Ця стаття не стосується .NET Framework або .NET, які працюють Windows 11, Windows Server 2022 р. або новішої версії.
Ця стаття не стосується .NET під час роботи на платформах, відмінних від Windows.
Докладний опис і опис впливу
Як зазначено вище в оновленні Windows, корпорація Майкрософт підтримувала інтерфейс API Win32 GetTempPath2 для старіших ринкових версій Windows, щоб зробити більш безпечною заміну старішому інтерфейсу API Win32 GetTempPath . Внутрішньо .NET Framework та .NET використовують ці інтерфейси API Win32, щоб забезпечити реалізацію методу System.IO.Path.GetTempPath() : API GetTempPath2 Win32 краще використовувати, якщо він існує; а API GetTempPath Win32 використовується як недолік, якщо GetTempPath2 не існує.
Оскільки ці KBs роблять новий інтерфейс API Win32 GetTempPath2 доступним на відповідних платформах, .NET Framework та .NET почнуть використовувати GetTempPath2 після інсталяції KBs.
Основна зміна поведінки полягає в тому, що абоненти, які працюють як посвідчення СИСТЕМИ, спостерігають за System.IO.Path.GetTempPath() методом, який повертає %WINDIR%\SystemTemp за замовчуванням, тоді як абоненти, які працюють як будь-що інше, ніж посвідчення SYSTEM, спостерігатимуть, як метод продовжує повертати наявне значення.
Якщо ваша програма відповідає всім наведеним нижче умовам, на вас може вплинути така зміна:
-
Програма використовує середовище виконання та платформу ОС, указану під попереднім заголовком "Застосовне програмне забезпечення"; і
-
Програма запускається як посвідчення СИСТЕМИ; і
-
Ви вручну встановити змінну середовища %TMP% або %TEMP% , щоб переспрямувати стандартне тимчасове розташування файлу. (Див . розділ Примітки в документації Win32 GetTempPath API.)
Якщо ви відповідаєте всім цим умовам, після інсталяції KBs Windows ви можете спостерігати, як програма пише в тимчасовому каталозі, відмінному від потрібного каталогу.
Ця зміна поведінки може відображатися в будь-якому .NET Framework або . API, наданий NET, який згодом залежить від GetTempPath2. Найпоширеніші точки входу:
Це не вичерпний список методів, поведінка яких може змінитися після інсталяції KBs.
Визначення того, чи програма запускається під посвідченням SYSTEM
Існує кілька різних механізмів визначення ідентичності програми .NET Framework або .NET
Веб-застосунки на основі IIS
IiS називає системну ідентичність "LOCALSYSTEM". У диспетчері IIS (inetmgr.exe) перейдіть на вкладку Пули застосунків, щоб переглянути всі пули програм і пов'язані з ними ідентичності. Ви також можете вибрати "Посвідчення" з розкривного списку Групувати за, щоб спростити перегляд пулів програм, які працюють як посвідчення LOCALSYSTEM.
На знімку екрана нижче показано приклад пулу програм ("MyAppPool"), який налаштовано на запуск як LOCALSYSTEM. Усі програми, запущені в цьому пулі програм, працюватимуть як посвідчення СИСТЕМИ.
Ви також можете отримати доступ до цієї інформації програмно під час сеансу PowerShell у режимі адміністратора за допомогою наведеного нижче сценарію.
Import-Module IISAdministration Get-IISAppPool | where {$_.ProcessModel.IdentityType -eq "LocalSystem"}
На комп'ютері, настроєному з системним пулом програм "MyAppPool", як показано на знімку екрана вище, цей сценарій PowerShell друкує наведений нижче сценарій, показуючи, що "MyAppPool" запущено під посвідченням SYSTEM.
Name Status CLR Ver Pipeline Mode Start Mode ---- ------ ------- ------------- ---------- MyAppPool Started v4.0 Integrated OnDemand
Служби Windows
Якщо .NET Framework або . Net-based application is registered as a Windows Service, you can use the Services manager to view its associated identity.
У командному рядку в режимі адміністратора запустіть services.msc. Відобразиться інтерфейс диспетчера служб.
Якщо в стовпці Вхід як відображається список "Локальна система" для ідентичності служби, то службу запущено під посвідченням SYSTEM.
Ви також можете запитувати ці дані за допомогою PowerShell за допомогою командлета Get-Service . Наприклад, щоб запитати ці відомості для служби з іменем MyService, скористайтеся наведеною нижче командою.
(Get-Service MyService).UserName -ieq "LocalSystem"
Якщо службу зареєстровано для запуску під посвідченням СИСТЕМИ, буде надруковано true на консолі.
Інші механізми
Такі засоби, як Диспетчер завдань (taskmgr.exe) або Sysinternals Process Explorer , також можуть визначити, чи запущено програму під посвідченням СИСТЕМИ.
У диспетчері завдань у поданні Відомості можна перелічити всі запущені процеси в системі, знайти потрібний процес і переглянути запис у стовпці Ім'я користувача .
Якщо значення "Ім'я користувача " читає слово "SYSTEM", процес виконується під посвідченням SYSTEM.
Або в Sysinternals Process Explorer знайдіть потрібний процес і відкрийте подання Властивості, а потім погляньте на поле User (Користувач) на вкладці Image (Зображення).
Якщо значення користувача читає "NT AUTHORITY\SYSTEM", процес виконується під посвідченням СИСТЕМИ.
Змінення тимчасового шляху для процесів на рівні СИСТЕМИ
Наведений нижче сценарій PowerShell демонструє, як створити новий каталог C:\NewSystemTemp\ і обмежити доступ до каталогу лише процесами, запущеними в ідентичності SYSTEM. Не намагайтеся змінити списки ACL каталогу, який уже заповнено файлами.
Цей сценарій має виконуватися з сеансу 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
Щоб переконатися, що операцію виконано успішно, виконайте команду
icacls C:\NewSystemTemp\
Це призведе до таких результатів, що показують успіх:
C:\NewSystemTemp\ NT AUTHORITY\SYSTEM:(OI)(CI)(F) BUILTIN\Administrators:(OI)(CI)(F) Successfully processed 1 files; Failed processing 0 files
Створивши каталог, установіть змінну середовища %SYSTEMTEMP% за допомогою області на рівні системи. Ви можете налаштувати цю настройку за допомогою системного Панель керування інтерфейсу користувача або налаштувати програмно за допомогою PowerShell:
[Environment]::SetEnvironmentVariable("SYSTEMTEMP", "C:\NewSystemTemp", [EnvironmentVariableTarget]::Machine)
Потім перезавантажте комп'ютер.
Змінення змінної середовища %SYSTEMTEMP%не змінить повернуте значення System.IO.Path.GetTempPath() для програм .NET Framework та .NET, які працюють як посвідчення, відмінне від SYSTEM. Ці програми будуть продовжувати дотримуватися тієї ж логіки роздільної здатності, яку вони завжди мають, включаючи вшанування %TMP% або %TEMP% змінних середовища, якщо вони присутні.
Аналогічно, якщо встановити змінну середовища %TMP% або %TEMP% , значення System.IO.Path.GetTempPath() для програм .NET Framework та .NET, які працюють як посвідчення SYSTEM, не зміниться.
Для отримання додаткової інформації
Докладні відомості про поведінку .NET Framework та .NET див. в документації .NET на сторінці Path.GetTempPath.
Докладні відомості про базову поведінку ОС Windows див. в документації Windows до API Win32 GetTempPath2.