วันที่เผยแพร่:25 กุมภาพันธ์ 2025
เวอร์ชัน:.NET 8 และใหม่กว่า.NET Framework ทุกเวอร์ชัน
สรุป
Microsoft ได้เปิดตัวการปรับปรุงความปลอดภัยสําหรับ Windows เวอร์ชันล่าสุด การปรับปรุงความปลอดภัยเหล่านี้ปรับเปลี่ยนการจัดการเส้นทางชั่วคราว และอาจทําให้เกิดบาง.NET Framework และ .NET API เช่นSystem.IO.Path.GetTempPath()ส่งคืนตําแหน่งที่ตั้งอื่นหลังจากใช้โปรแกรมแก้ไข
จําเป็นต้องดําเนินการ
ไม่จําเป็นต้องดําเนินการใดๆ .NET Framework หรือ แอปพลิเคชันที่ใช้ NET แอปพลิเคชันของคุณจะได้รับประโยชน์จากการปรับปรุงความปลอดภัยใดๆ ที่ใช้กับสภาพแวดล้อมของคุณโดยอัตโนมัติ แอปพลิเคชันส่วนใหญ่จะไม่สังเกตเห็นการเปลี่ยนแปลงเชิงพฤติกรรมใดๆ
ส่วนที่เหลือของบทความนี้แสดงรายละเอียดวิธีการตรวจสอบว่าการปรับปรุงความปลอดภัยเหล่านี้อาจส่งผลกระทบต่อลักษณะการทํางานในรันไทม์ของแอปพลิเคชันของคุณหรือไม่ บทความนี้ยังแสดงขั้นตอนสําหรับการกําหนดลักษณะการทํางานของรันไทม์เองหากต้องการ
ซอฟต์แวร์ที่สามารถใช้ได้
บทความนี้ใช้กับซอฟต์แวร์ต่อไปนี้:
-
.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 ตามที่กล่าวไว้ข้างต้น Microsoft ได้สนับสนุน Win32 GetTempPath2 API เป็น Windows เวอร์ชันที่เก่ากว่าซึ่งทําหน้าที่แทนที่ด้วยความปลอดภัยมากขึ้นสําหรับ Win32 GetTempPath API ที่เก่ากว่า ภายใน .NET Framework และ .NET พึ่งพา Win32 API เหล่านี้เพื่อให้มีการใช้งานวิธีการ System.IO.Path.GetTempPath() : Win32 GetTempPath2 API เป็นที่ต้องการถ้ามี และ Win32 GetTempPath API ถูกใช้เป็นรายการย้อนกลับ ถ้าไม่มี GetTempPath2 อยู่
เนื่องจากเคบีเหล่านี้ทําให้ Win32 GetTempPath2 API ใหม่พร้อมใช้งานบนแพลตฟอร์มที่เกี่ยวข้อง .NET Framework และ .NET จะเริ่มใช้ GetTempPath2 เมื่อติดตั้ง KB แล้ว
การเปลี่ยนแปลงลักษณะการทํางานหลักคือ ผู้เรียกที่กําลังเรียกใช้เป็นข้อมูลเฉพาะตัวของระบบจะสังเกตวิธี System.IO.Path.GetTempPath() ส่งกลับ %WINDIR%\SystemTemp ตามค่าเริ่มต้น ในขณะที่ผู้เรียกที่กําลังเรียกใช้เป็นอย่างอื่นนอกเหนือจากข้อมูลประจําตัวของระบบจะสังเกตวิธีการส่งกลับค่าที่มีอยู่ต่อไป
ถ้าแอปพลิเคชันของคุณตรงตามเกณฑ์ด้านล่าง ทั้งหมด คุณอาจได้รับผลกระทบจากการเปลี่ยนแปลงนี้:
-
แอปพลิเคชันของคุณใช้แพลตฟอร์มรันไทม์และระบบปฏิบัติการที่แสดงอยู่ภายใต้หัวข้อ "ซอฟต์แวร์ที่สามารถใช้ได้" เวอร์ชันก่อนหน้า และ
-
แอปพลิเคชันของคุณทํางานเป็นข้อมูลเฉพาะตัวของระบบ และ
-
คุณตั้งค่าตัวแปรสภาพแวดล้อม %TMP% หรือ %TEMP% ด้วยตนเองเพื่อเปลี่ยนเส้นทางตําแหน่งที่ตั้งไฟล์ชั่วคราวมาตรฐาน (ดู ที่ส่วน หมายเหตุ ของเอกสารประกอบ Win32 GetTempPath API)
หากคุณมีคุณสมบัติตรงตามเกณฑ์เหล่านี้ ทั้งหมด เมื่อติดตั้ง Windows KB แล้ว คุณอาจสังเกตเห็นการเขียนแอปพลิเคชันของคุณไปยังไดเรกทอรีชั่วคราวอื่นที่ไม่ใช่ไดเรกทอรีที่คุณต้องการ
การเปลี่ยนแปลงลักษณะการทํางานนี้อาจมองเห็นได้ผ่าน.NET Framework หรือ API ที่ NET มีให้ซึ่งสุดท้ายแล้วต้องอาศัย GetTempPath2 จุดเข้าใช้งานที่พบบ่อยที่สุดคือ:
นี่ไม่ใช่รายการวิธีการที่ครบถ้วนซึ่งลักษณะการทํางานอาจเปลี่ยนแปลงได้เมื่อติดตั้ง KB แล้ว
การกําหนดว่าแอปพลิเคชันจะทํางานภายใต้ข้อมูลเฉพาะตัวของระบบหรือไม่
มีกลไกต่างๆ มากมายในการกําหนดข้อมูลประจําตัวของแอปพลิเคชัน .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" กําลังทํางานภายใต้ข้อมูลประจําตัวของระบบ
Name Status CLR Ver Pipeline Mode Start Mode ---- ------ ------- ------------- ---------- MyAppPool Started v4.0 Integrated OnDemand
บริการของ Windows
ถ้า .NET Framework หรือ ของคุณ แอปพลิเคชันที่ใช้ NET ได้รับการลงทะเบียนเป็นบริการของ Windows คุณสามารถใช้ตัวจัดการบริการเพื่อดูข้อมูลเฉพาะตัวที่เชื่อมโยงได้
จากพร้อมท์คําสั่งด้วยสิทธิ์ผู้ดูแล ให้เรียกใช้ services.msc ซึ่งจะแสดง UI ตัวจัดการบริการ
ถ้าคอลัมน์ เข้าสู่ระบบ เป็น แสดงรายการ "ระบบภายในเครื่อง" สําหรับข้อมูลเฉพาะตัวของบริการ แสดงว่าบริการกําลังทํางานภายใต้ข้อมูลเฉพาะตัวของระบบ
คุณยังสามารถสอบถามข้อมูลนี้ผ่านทาง PowerShell โดยใช้ cmdlet Get-Service ตัวอย่างเช่น เมื่อต้องการสอบถามข้อมูลนี้สําหรับบริการที่ชื่อว่า MyServiceให้ใช้คําสั่งต่อไปนี้
(Get-Service MyService).UserName -ieq "LocalSystem"
ถ้าลงทะเบียนบริการให้ทํางานภายใต้ข้อมูลเฉพาะตัวของระบบ การดําเนินการนี้จะพิมพ์เป็น True ไปยังคอนโซล
กลไกอื่นๆ
เครื่องมือ เช่น ตัวจัดการงาน (taskmgr.exe) หรือ Sysinternals Process Explorer ยังสามารถบอกคุณได้ว่าแอปพลิเคชันกําลังทํางานภายใต้ข้อมูลประจําตัวของระบบหรือไม่
ในตัวจัดการงาน ให้ใช้มุมมอง รายละเอียด เพื่อแสดงรายการกระบวนการที่กําลังทํางานอยู่ในระบบ จากนั้นค้นหากระบวนการที่สนใจ และดูที่รายการภายใต้คอลัมน์ ชื่อผู้ใช้
ถ้าค่า ชื่อผู้ใช้ อ่านว่า "SYSTEM" กระบวนการกําลังทํางานอยู่ภายใต้ข้อมูลเฉพาะตัวของระบบ
หรือใน Sysinternals Process Explorer ให้ค้นหากระบวนการที่สนใจ และเข้าสู่มุมมอง คุณสมบัติ แล้วดูที่เขตข้อมูล ผู้ใช้ ภายใต้แท็บ รูปภาพ
ถ้าค่า ผู้ใช้ อ่าน "NT AUTHORITY\SYSTEM" กระบวนการจะทํางานภายใต้ข้อมูลเฉพาะตัวของระบบ
การเปลี่ยนเส้นทางชั่วคราวสําหรับกระบวนการระดับระบบ
สคริปต์ PowerShell ด้านล่างแสดงวิธีการสร้างไดเรกทอรีใหม่ C:\NewSystemTemp\ และจํากัดการเข้าถึงไดเรกทอรีเฉพาะกระบวนการที่ทํางานภายใต้ข้อมูลประจําตัวของระบบ อย่าพยายามเปลี่ยน 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% ด้วยขอบเขตระดับระบบ คุณสามารถตั้งค่านี้ผ่านทาง UI ของระบบแผงควบคุม หรือคุณสามารถตั้งค่าทางโปรแกรมผ่าน 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 ซึ่งกําลังทํางานเป็นข้อมูลเฉพาะตัวของระบบ
สําหรับข้อมูลเพิ่มเติม
สําหรับข้อมูลเพิ่มเติมเกี่ยวกับลักษณะการทํางานของ .NET Framework และ .NET โปรดดูเอกสารประกอบ .NET บน Path.GetTempPath
สําหรับข้อมูลเพิ่มเติมเกี่ยวกับลักษณะการทํางานของระบบปฏิบัติการ Windows โปรดดูเอกสารประกอบของ Windows บน Win32 GetTempPath2 API