릴리스 날짜:2025년 2월 25일
버전:.NET 8 이상.NET Framework, 모든 버전
요약
Microsoft는 최신 버전의 Windows에 보안 개선 사항을 출시했습니다. 이러한 보안 향상은 임시 경로 처리를 수정하고 패치가 적용된 후System.IO.Path.GetTempPath()같은 특정 .NET Framework 및 .NET API가 다른 위치를 반환하도록 할 수 있습니다.
작업 필요
.NET Framework 또는 에 대한 작업은 필요하지 않습니다. NET 기반 애플리케이션. 애플리케이션은 사용자 환경에 적용되는 모든 보안 개선 사항의 이점을 자동으로 활용합니다. 대부분의 애플리케이션은 동작 변경을 관찰하지 않습니다.
이 문서의 나머지 부분에서는 이러한 보안 개선 사항이 애플리케이션의 런타임 동작에 영향을 미칠 수 있는지 확인하는 방법을 자세히 설명합니다. 이 문서에서는 원하는 경우 런타임 동작을 사용자 지정하는 단계도 나열합니다.
적용 가능한 소프트웨어
이 문서는 다음 소프트웨어에 적용됩니다.
-
.NET 8 이상
-
.NET Framework 2024년 7월 보안 업데이트 및 후속 업데이트를 기준으로 모든 버전
다음 Windows 업데이트 버전에서 실행되는 경우에만 다음을 수행합니다.
-
KB5052077 설치된 Windows 10 버전 22H2
-
KB5053594 설치된 2019년 Windows Server
-
Windows Server 2016, KB5053594 설치된 경우
이 문서는 Windows 11 Windows Server 2022 이상에서 실행되는 .NET Framework 또는 .NET에는 적용되지 않습니다.
이 문서는 비 Windows 플랫폼에서 실행되는 경우 .NET에 적용되지 않습니다 .
자세한 설명 및 영향 문
위에서 언급한 Windows 업데이트 KB를 기준으로 Microsoft는 이전 Win32 GetTempPath API를 보다 안전한 대체 기능으로 사용할 수 있도록 Win32 GetTempPath2 API를 이전 버전의 Windows로 백포트했습니다. 내부적으로 .NET Framework 및 .NET은 이러한 Win32 API를 사용하여 System.IO.Path.GetTempPath() 메서드의 구현을 제공합니다. Win32 GetTempPath2 API가 있는 경우 선호되며, GetTempPath2가 없는 경우 Win32 GetTempPath API가 대체로 사용됩니다.
이러한 KB는 해당 플랫폼에서 새 Win32 GetTempPath2 API를 사용할 수 있도록 하기 때문에 .NET Framework 및 .NET은 KB가 설치되면 GetTempPath2를 사용하기 시작합니다.
기본 동작 변경은 SYSTEM ID로 실행되는 호출자가 기본적으로 System.IO.Path.GetTempPath() 메서드가 %WINDIR%\SystemTemp 반환하는 것을 관찰하는 반면, SYSTEM ID 이외의 다른 항목으로 실행되는 호출자는 메서드가 기존 값을 계속 반환하는 것을 관찰합니다.
애플리케이션이 아래 조건을 모두 충족하는 경우 이 변경의 영향을 받을 수 있습니다.
-
애플리케이션은 이전 "적용 가능한 소프트웨어" 제목 아래에 나열된 런타임 및 OS 플랫폼을 활용합니다. 그리고
-
애플리케이션은 SYSTEM ID로 실행됩니다. 그리고
-
%TMP% 또는 %TEMP% 환경 변수를 수동으로 설정하여 표준 임시 파일 위치를 리디렉션합니다. (Win32 GetTempPath API 설명서의 설명 섹션 을 참조하세요.)
이러한 모든 조건을 충족하는 경우 Windows KB가 설치되면 애플리케이션이 의도한 디렉터리가 아닌 임시 디렉터리에 쓰는 것을 관찰할 수 있습니다.
이러한 동작 변경은 .NET Framework 또는 을 통해 표시될 수 있습니다. 결국 GetTempPath2를 사용하는 NET 제공 API입니다. 가장 일반적인 진입점은 다음과 같습니다.
KB가 설치되면 동작이 변경될 수 있는 메서드의 전체 목록이 아닙니다.
애플리케이션이 SYSTEM ID에서 실행되는지 여부 확인
.NET Framework 또는 .NET 애플리케이션의 ID를 결정하는 몇 가지 메커니즘이 있습니다.
IIS 기반 웹 애플리케이션
IIS는 시스템 ID를 "LOCALSYSTEM"으로 참조합니다. IIS 관리자(inetmgr.exe)에서 애플리케이션 풀 탭으로 이동하여 모든 앱 풀 및 관련 ID를 확인합니다. 그룹별 드롭다운에서 "ID"를 선택하여 LOCALSYSTEM ID로 실행되는 앱 풀을 더 쉽게 볼 수 있습니다.
아래 스크린샷은 LOCALSYSTEM으로 실행되도록 구성된 앱 풀("MyAppPool")의 예를 보여 줍니다. 이 앱 풀 내에서 실행되는 모든 애플리케이션은 SYSTEM ID로 실행됩니다.
아래 스크립트를 사용하여 관리자 권한 PowerShell 세션에서 프로그래밍 방식으로 이 정보에 액세스할 수도 있습니다.
Import-Module IISAdministration Get-IISAppPool | where {$_.ProcessModel.IdentityType -eq "LocalSystem"}
위의 스크린샷과 같이 시스템 수준 "MyAppPool" 앱 풀로 구성된 컴퓨터에서 이 PowerShell 스크립트는 다음을 인쇄하여 "MyAppPool"이 시스템 ID에서 실행되고 있음을 보여 줍니다.
Name Status CLR Ver Pipeline Mode Start Mode ---- ------ ------- ------------- ---------- MyAppPool Started v4.0 Integrated OnDemand
Windows 서비스
.NET Framework 또는 인 경우 NET 기반 애플리케이션은 Windows 서비스로 등록됩니다. Services 관리자를 사용하여 연결된 ID를 볼 수 있습니다.
관리자 권한 명령 프롬프트에서 services.msc실행합니다. 그러면 Services 관리자 UI가 표시됩니다.
로그온 열에 서비스 ID에 대한 "로컬 시스템"이 나열되면 서비스가 시스템 ID에서 실행되고 있습니다.
Get-Service cmdlet을 사용하여 PowerShell을 통해 이 데이터를 쿼리할 수도 있습니다. 예를 들어 MyService라는 서비스에 대해 이 정보를 쿼리하려면 다음 명령을 사용합니다.
(Get-Service MyService).UserName -ieq "LocalSystem"
서비스가 SYSTEM ID에서 실행되도록 등록된 경우 콘솔에 True가 출력됩니다.
기타 메커니즘
작업 관리자(taskmgr.exe) 또는 Sysinternals Process Explorer 같은 도구는 애플리케이션이 SYSTEM ID에서 실행 중인지 여부를 알려줄 수도 있습니다.
작업 관리자에서 세부 정보 보기를 사용하여 시스템의 실행 중인 모든 프로세스를 나열한 다음 관심 있는 프로세스를 찾아 사용자 이름 열 아래의 항목을 확인합니다.
사용자 이름 값이 "SYSTEM"을 읽는 경우 프로세스는 SYSTEM ID에서 실행됩니다.
또는 Sysinternals Process Explorer 관심 있는 프로세스를 찾아 속성 보기를 입력한 다음 이미지 탭 아래의 사용자 필드를 확인합니다.
사용자 값이 "NT AUTHORITY\SYSTEM"을 읽는 경우 프로세스는 SYSTEM ID에서 실행됩니다.
시스템 수준 프로세스의 임시 경로 변경
아래 PowerShell 스크립트는 새 디렉터리 C:\NewSystemTemp\ 만들고 SYSTEM ID에서 실행되는 프로세스로만 디렉터리 액세스를 제한하는 방법을 보여 줍니다. 이미 파일로 채워진 디렉터리의 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
디렉터리가 만들어지면 시스템 수준 scope 사용하여 %SYSTEMTEMP% 환경 변수를 설정합니다. 시스템 제어판 UI를 통해 설정하거나 PowerShell을 통해 프로그래밍 방식으로 설정할 수 있습니다.
[Environment]::SetEnvironmentVariable("SYSTEMTEMP", "C:\NewSystemTemp", [EnvironmentVariableTarget]::Machine)
그런 다음 컴퓨터를 다시 부팅합니다.
%SYSTEMTEMP% 환경 변수를 변경해도 SYSTEM 이외의 ID로 실행되는 .NET Framework 및 .NET 애플리케이션에 대한 System.IO.Path.GetTempPath() 반환 값은 변경되지 않습니다. 이러한 애플리케이션은 환경 변수가 있는 경우 %TMP% 또는 %TEMP% 환경 변수를 적용하는 등 항상 가지고 있는 것과 동일한 해결 논리를 계속 따릅니다.
마찬가지로 %TMP% 또는 %TEMP% 환경 변수를 설정해도 SYSTEM ID로 실행되는 .NET Framework 및 .NET 애플리케이션에 대한 System.IO.Path.GetTempPath() 반환 값은 변경되지 않습니다.
자세한 내용은
.NET Framework 및 .NET 동작에 대한 자세한 내용은 Path.GetTempPath의 .NET 설명서를 참조하세요.
기본 Windows OS 동작에 대한 자세한 내용은 Win32 GetTempPath2 API의 Windows 설명서를 참조하세요.