Ngày Phát hành:25/02/2025
Phiên bản:.NET 8 trở lên.NETFramework, tất cả các phiên bản
Tóm tắt
Microsoft đã triển khai các cải tiến bảo mật cho các phiên bản Windows gần đây. Những cải tiến bảo mật này sửa đổi xử lý đường dẫn tạm thời và có thể khiến một số .NET Framework và .NET API nhất địnhSystem.IO.Path.GetTempPath()sẽ trả về một vị trí khác sau khi áp dụng bản vá.
Yêu cầu hành động
Mọi .NET Framework hoặc . Ứng dụng dựa trên NET. Ứng dụng của bạn sẽ tự động hưởng lợi từ mọi cải tiến bảo mật áp dụng cho môi trường của bạn. Hầu hết các ứng dụng sẽ không quan sát bất kỳ thay đổi hành vi nào.
Phần còn lại của bài viết này chi tiết cách xác định xem những cải tiến bảo mật này có thể ảnh hưởng đến hành vi thời gian chạy của ứng dụng của bạn. Bài viết này cũng liệt kê các bước để tùy chỉnh hành vi thời gian chạy nếu muốn
Phần mềm Áp dụng
Bài viết này áp dụng cho phần mềm sau đây:
-
.NET 8 trở lên
-
.NET Framework, tất cả các phiên bản, kể từ bản cập nhật bảo mật tháng 7 năm 2024 và các bản cập nhật tiếp theo
Chỉ khi chạy trên các phiên bản Windows update sau:
-
Windows 10, phiên bản 22H2 khi KB5052077 được cài đặt
-
Windows Server 2019, khi KB5053594 được cài đặt
-
Windows Server 2016, khi KB5053594 được cài đặt
Bài viết này không áp dụng cho .NET Framework hoặc .NET chạy trên Windows 11, Windows Server 2022 trở lên.
Bài viết này không áp dụng cho .NET khi chạy trên các nền tảng không phải của Windows.
Mô tả chi tiết và điều khoản tác động
Kể từ bản cập nhật Windows KBs nêu trên, Microsoft đã hỗ trợ API Win32 GetTempPath2 cho các phiên bản windows cũ hơn trên thị trường để đóng vai trò thay thế an toàn hơn cho API Win32 GetTempPath cũ hơn. Trong nội bộ, .NET Framework và .NET dựa vào các API Win32 này để cung cấp việc thực hiện phương pháp System.IO.Path.GetTempPath() : API Win32 GetTempPath2 được ưa thích nếu API tồn tại; và API GetTempPath Win32 được sử dụng làm bản dự phòng nếu GetTempPath2 không tồn tại.
Vì các KBs này giúp API GetTempPath2 Win32 mới sẵn dùng trên các nền tảng được áp dụng, .NET Framework và .NET sẽ bắt đầu sử dụng GetTempPath2 sau khi cài đặt KBs.
Thay đổi hành vi chính là người gọi đang chạy với vai trò là định danh HỆ THỐNG sẽ quan sát phương pháp System.IO.Path.GetTempPath() trả về %WINDIR%\SystemTemp theo mặc định, trong khi người gọi đang chạy như bất cứ điều gì khác ngoài danh tính HỆ THỐNG sẽ quan sát thấy phương pháp tiếp tục trả về giá trị hiện có.
Nếu ứng dụng của bạn đáp ứng tất cả các tiêu chí dưới đây, bạn có thể bị ảnh hưởng bởi thay đổi này:
-
Ứng dụng của bạn sử dụng thời gian chạy và nền tảng HĐH được liệt kê trong tiêu đề "Phần mềm Áp dụng" trước đó; và
-
Ứng dụng của bạn chạy dưới dạng danh tính HỆ THỐNG; và
-
Bạn tự đặt biến môi trường %TMP% hoặc %TEMP% để chuyển hướng vị trí tệp tạm thời tiêu chuẩn. (Hãy xem phần Ghi chú trong tài liệu Win32 GetTempPath API.)
Nếu bạn đáp ứng tất cả các tiêu chí này, sau đó một khi windows KBs được cài đặt, bạn có thể quan sát ứng dụng của bạn bằng văn bản vào một thư mục tạm thời khác với thư mục bạn dự kiến.
Thay đổi hành vi này có thể hiển thị thông qua bất kỳ .NET Framework hoặc . NET-provided API mà cuối cùng phụ thuộc vào GetTempPath2. Các điểm tham gia phổ biến nhất là:
Đây không phải là nhằm mục đích là một danh sách đầy đủ các phương pháp có hành vi có thể thay đổi sau khi các KBs được cài đặt.
Xác định xem một ứng dụng có chạy theo định danh HỆ THỐNG hay không
Có một số cơ chế khác nhau để xác định danh tính của ứng dụng .NET Framework hoặc .NET
Các ứng dụng web dựa trên IIS
IIS đề cập đến nhận dạng HỆ THỐNG là "LOCALSYSTEM". Trong Trình quản lý IIS (inetmgr.exe), đi tới tab Vùng Ứng dụng để xem tất cả các vùng ứng dụng và danh tính liên quan của chúng. Bạn cũng có thể chọn "Danh tính" từ danh sách thả xuống Nhóm theo để dễ dàng xem các vùng ứng dụng đang chạy dưới dạng danh tính LOCALSYSTEM.
Ảnh chụp màn hình dưới đây hiển thị ví dụ về vùng ứng dụng ("MyAppPool") được đặt cấu hình để chạy dưới dạng LOCALSYSTEM. Mọi ứng dụng chạy trong vùng ứng dụng này sẽ chạy dưới dạng danh tính HỆ THỐNG.
Bạn cũng có thể truy nhập thông tin này theo chương trình từ phiên PowerShell nâng cao bằng cách sử dụng tập lệnh dưới đây.
Import-Module IISAdministration Get-IISAppPool | where {$_.ProcessModel.IdentityType -eq "LocalSystem"}
Trong một máy được đặt cấu hình với vùng ứng dụng "MyAppPool" cấp HỆ THỐNG như minh họa trong ảnh chụp màn hình ở trên, tập lệnh PowerShell này sẽ in nội dung sau đây, cho thấy rằng "MyAppPool" đang chạy dưới định danh HỆ THỐNG.
Name Status CLR Ver Pipeline Mode Start Mode ---- ------ ------- ------------- ---------- MyAppPool Started v4.0 Integrated OnDemand
Dịch vụ Windows
Nếu .NET Framework hoặc . Ứng dụng dựa trên NET được đăng ký là Dịch vụ Windows, bạn có thể sử dụng trình quản lý Dịch vụ để xem danh tính liên quan của ứng dụng đó.
Từ dấu nhắc lệnh mức cao, hãy chạy services.msc. Thao tác này sẽ hiển thị giao diện người dùng trình quản lý Dịch vụ.
Nếu cột Đăng nhập Dưới dạng liệt kê "Hệ thống Cục bộ" cho danh tính dịch vụ thì dịch vụ đang chạy dưới danh tính HỆ THỐNG.
Bạn cũng có thể truy vấn dữ liệu này thông qua PowerShell bằng cách sử Get-Service lệnh ghép ngắn. Ví dụ: để truy vấn thông tin này cho một dịch vụ có tên MyService, hãy sử dụng lệnh sau đây.
(Get-Service MyService).UserName -ieq "LocalSystem"
Nếu dịch vụ được đăng ký chạy theo danh tính HỆ THỐNG, điều này sẽ in True vào bảng điều khiển.
Các cơ chế khác
Các công cụ như Trình quản lý Tác vụ (taskmgr.exe) hoặc Sysinternals Process Explorer cũng có thể cho bạn biết liệu một ứng dụng có đang chạy trong danh tính HỆ THỐNG hay không.
Trong Trình quản lý Tác vụ, sử dụng dạng xem Chi tiết để liệt kê tất cả các quy trình đang chạy trong hệ thống, sau đó xác định vị trí quy trình quan tâm và xem mục nhập bên dưới cột Tên người dùng.
Nếu giá trị Tên người dùng đọc "HỆ THỐNG", quy trình đang chạy trong danh tính HỆ THỐNG.
Hoặc trong Trình khám phá Tiến trình Sysinternals, định vị quy trình quan tâm và nhập dạng xem Thuộc tính, sau đó xem trường Người dùng bên dưới tab Hình ảnh.
Nếu giá trị Người dùng đọc "NT AUTHORITY\SYSTEM", quy trình đang chạy trong danh tính HỆ THỐNG.
Thay đổi đường dẫn tạm thời cho các quy trình cấp HỆ THỐNG
Tập lệnh PowerShell bên dưới sẽ minh họa cách tạo thư mục mới C:\NewSystemTemp\ và hạn chế quyền truy nhập thư mục chỉ cho các quy trình chạy theo định danh HỆ THỐNG. Không cố gắng để thay đổi các ACLs của một thư mục đã được dân cư với tập tin.
Tập lệnh này phải được chạy từ phiên PowerShell nâng cao.
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
Bạn có thể xác nhận rằng thao tác này đã thành công bằng cách chạy lệnh
icacls C:\NewSystemTemp\
Điều này sẽ tạo ra đầu ra sau đây cho thấy sự thành công:
C:\NewSystemTemp\ NT AUTHORITY\SYSTEM:(OI)(CI)(F) BUILTIN\Administrators:(OI)(CI)(F) Successfully processed 1 files; Failed processing 0 files
Sau khi thư mục được tạo, đặt biến %SYSTEMTEMP% môi trường với phạm vi mức hệ thống. Bạn có thể đặt giao diện người dùng này thông qua giao diện người Panel điều khiển hệ thống hoặc bạn có thể đặt giao diện người dùng theo chương trình thông qua PowerShell:
[Environment]::SetEnvironmentVariable("SYSTEMTEMP", "C:\NewSystemTemp", [EnvironmentVariableTarget]::Machine)
Sau đó khởi động lại máy.
Thay đổi biến %SYSTEMTEMP% môi trường mới sẽ không thay đổi giá trị trả về của System.IO.Path.GetTempPath() cho các ứng dụng .NET Framework và .NET đang chạy dưới dạng danh tính khác ngoài HỆ THỐNG. Những ứng dụng này sẽ tiếp tục làm theo logic độ phân giải tương tự mà họ luôn có, bao gồm việc vinh danh các biến môi %TMP% hoặc %TEMP% môi trường nếu chúng hiện diện.
Tương tự, việc đặt biến môi trường %TMP% hoặc %TEMP% sẽ không thay đổi giá trị trả về của System.IO.Path.GetTempPath() cho các ứng dụng .NET Framework và .NET đang chạy dưới dạng danh tính HỆ THỐNG.
Để biết thêm thông tin
Để biết thêm thông tin về hành vi .NET Framework và .NET, hãy xem tài liệu .NET trên Path.GetTempPath.
Để biết thêm thông tin về hành vi HĐH Windows cơ bản, hãy xem hướng dẫn sử dụng Windows trên API Win32 GetTempPath2.