Not
- Çıkış Tarihi:
Şubat 25, 2025 - Sürüm:
.NET 8 ve üzeri
.NET Framework.NET Framework, tüm sürümler
Özet
Microsoft, Windows'un son sürümlerine güvenlik geliştirmeleri yaptı. Bu güvenlik iyileştirmeleri, geçici yol işlemeyi değiştirir ve düzeltme eki uygulandıktan sonra bazı .NET Framework ve .NET API'lerinin System.IO.Path.GetTempPath()farklı bir konum döndürmesine neden olabilir.
Eylem gerekiyor
Herhangi bir .NET Framework veya . NET tabanlı uygulama. Uygulamanız, ortamınız için geçerli olan tüm güvenlik geliştirmelerinden otomatik olarak yararlanır. Çoğu uygulama herhangi bir davranış değişikliği gözlemlemeyecektir.
Bu makalenin kalan bölümünde, bu güvenlik geliştirmelerinin uygulamanızın çalışma zamanı davranışını etkileyip etkilemeyeceğinin nasıl belirleneceği ayrıntılarıyla açıklanmaktadır. Bu makalede, istenirse çalışma zamanı davranışını özelleştirme adımları da listelenir
Uygulanabilir Yazılım
Bu makale aşağıdaki yazılımlar için geçerlidir:
- .NET 8 ve üzeri
- .NET Framework.NET Framework, Temmuz 2024 güvenlik güncelleştirmeleri ve sonraki güncelleştirmelerden itibaren tüm sürümleri
Yalnızca aşağıdaki Windows Update sürümlerinde çalışırken:
- Windows 10, KB5052077 yüklendiğinde sürüm 22H2
- Windows Server 2019, KB5053594 yüklendiğinde
- Windows Server 2016, KB5053594 yüklendiğinde
Bu makale, Windows 11, Windows Server 2022 veya sonraki sürümlerde çalışan .NET Framework veya .NET için geçerli değildir.
Bu makale , Windows dışı platformlarda çalışırken .NET için geçerli değildir.
Ayrıntılı açıklama ve etki beyanı
Yukarıda bahsedilen Windows güncelleştirme KB'lerinden itibaren Microsoft, Win32 GetTempPath2 API'sini eski Win32 GetTempPath API'sinin yerine daha güvenli bir yedek olarak işlev görmesi için Windows'un daha eski pazar içi sürümlerine geri taşıdı. Dahili olarak, .NET Framework ve .NET yöntemin System.IO.Path.GetTempPath() uygulanmasını sağlamak için bu Win32 API'lerine güvenir: varsa Win32 GetTempPath2 API'si tercih edilir; GetTempPath2 yoksa Win32 GetTempPath API'si geri dönüş olarak kullanılır.
Bu KB'ler yeni Win32GetTempPath2API'sini ilgili platformlarda kullanılabilir hale getirdiğinden, KB'ler yüklendikten sonra .NET Framework ve .NET GetTempPath2 kullanmaya başlayacaktır.
Birincil davranış değişikliği, SİSTEM kimliği olarak çalışan çağıranların varsayılan olarak yöntemin geri dönüşünü System.IO.Path.GetTempPath()%WINDIR%\SystemTemp gözlemlemesi, SİSTEM kimliği dışında herhangi bir şey olarak çalışan çağıranların ise yöntemin var olan değerini döndürmeye devam ettiğini gözlemlemesidir.
Uygulamanız aşağıdaki ölçütlerin tümünü karşılıyorsa, bu değişiklikten etkilenebilirsiniz:
- Uygulamanız, önceki "Geçerli Yazılım" başlığı altında listelenen bir çalışma zamanı ve işletim sistemi platformunu kullanır; ve
- Uygulamanız SİSTEM kimliği olarak çalışır; ve
- Standart geçici dosya konumunu yeniden yönlendirmek için veya
%TEMP%ortam değişkenini el ile ayarlarsınız%TMP%. (Win32'ninGetTempPathNotlar bölümüne bakın API belgeleri.)
Tüm bu ölçütleri karşılıyorsanız, Windows KB'leri yüklendikten sonra uygulamanızın amaçladığınız dizinden farklı bir geçici dizine yazdığını gözlemleyebilirsiniz.
Bu davranış değişikliği, herhangi bir .NET Framework.NET Framework veya aracılığıyla görülebilir. Sonunda GetTempPath2'ye dayanan NET tarafından sağlanan API. En yaygın giriş noktaları şunlardır:
- System.IO.Path.GetTempPath
- System.IO.Path.GetTempFileName
- System.IO.Directory.CreateTempSubdirectory
Bunun, KB'ler yüklendikten sonra davranışları değişebilecek yöntemlerin kapsamlı bir listesi olması amaçlanmamıştır.
Uygulamanın SİSTEM kimliği altında çalışıp çalışmadığını belirleme
Bir .NET Framework.NET Framework veya .NET uygulamasının kimliğini belirlemek için birkaç farklı mekanizma vardır
IIS tabanlı web uygulamaları
IIS, SİSTEM kimliğini "LOCALSYSTEM" olarak adlandırır. IIS Yöneticisi'nde (inetmgr.exe), tüm uygulama havuzlarını ve bunlarla ilişkilendirilmiş kimliklerini görmek için Uygulama Havuzları sekmesine gidin. LOCALSYSTEM kimliği olarak çalışan uygulama havuzlarını görmeyi kolaylaştırmak için Gruplandırma Ölçütü açılan listesinden "Kimlik" öğesini de seçebilirsiniz.
Aşağıdaki ekran görüntüsünde, LOCALSYSTEM olarak çalışacak şekilde yapılandırılmış bir uygulama havuzu ("MyAppPool") örneği gösterilmektedir. Bu uygulama havuzunda çalışan tüm uygulamalar SİSTEM kimliği olarak çalışır.
Bu bilgilere, aşağıdaki betiği kullanarak yükseltilmiş bir PowerShell oturumundan program aracılığıyla da erişebilirsiniz.
Import-Module IISAdministration
Get-IISAppPool | where {$_.ProcessModel.IdentityType -eq "LocalSystem"}
Yukarıdaki ekran görüntüsünde gösterildiği gibi SİSTEM düzeyinde "MyAppPool" uygulama havuzuyla yapılandırılmış bir makinede, bu PowerShell betiği aşağıdakileri yazdırır ve "MyAppPool"un SİSTEM kimliği altında çalıştığını gösterir.
Name Status CLR Ver Pipeline Mode Start Mode
---- ------ ------- ------------- ----------
MyAppPool Started v4.0 Integrated OnDemand
Windows hizmetleri
T.NET Framework.NET Framework veya . NET tabanlı uygulama bir Windows Hizmeti olarak kayıtlıdır, ilişkili kimliğini görüntülemek için Hizmetler yöneticisini kullanabilirsiniz.
Yükseltilmiş bir komut isteminden komutunu çalıştırın services.msc. Hizmetler yöneticisi kullanıcı arabirimi görüntülenir.
Farklı Oturum Aç sütununda hizmet kimliği olarak "Yerel Sistem" listeleniyorsa, hizmet SİSTEM kimliği altında çalışıyordur.
Ayrıca, cmdlet'i Get-Service kullanarak bu verileri PowerShell aracılığıyla da sorgulayabilirsiniz. Örneğin, adlı bir hizmet MyServiceiçin bu bilgileri sorgulamak üzere aşağıdaki komutu kullanın.
(Get-Service MyService).UserName -ieq "LocalSystem"
Hizmet, SİSTEM kimliği altında çalışacak şekilde kayıtlıysa, bu işlem konsola True değerini yazdırır.
Diğer mekanizmalar
Görev Yöneticisi (taskmgr.exe) veya Sysinternals Process Explorer gibi araçlar da bir uygulamanın SİSTEM kimliği altında çalışıp çalışmadığını size söyleyebilir.
Görev Yöneticisi'nde, sistemde çalışan tüm işlemleri listelemek için Ayrıntılar görünümünü kullanın, ardından ilgilendiğiniz işlemi bulun ve Kullanıcı adı sütununun altındaki girişe bakın.
Kullanıcı adı değeri "SİSTEM" ise, işlem SİSTEM kimliği altında çalışıyor demektir.
Alternatif olarak, Sysinternals İşlem Gezgini'nde ilgilendiğiniz işlemi bulun ve Özellikler görünümüne girin, ardından Görüntü sekmesinin altındaki Kullanıcı alanına bakın.
Kullanıcı değeri "NT AUTHORITY\SYSTEM" olarak görünüyorsa, işlem SİSTEM kimliği altında çalışıyor demektir.
SİSTEM düzeyindeki işlemler için geçici yolu değiştirme
Aşağıdaki PowerShell betiğinde, yeni bir dizin C:\NewSystemTemp\ oluşturma ve dizin erişimini yalnızca SİSTEM kimliği altında çalışan işlemlerle kısıtlama gösterilmektedir. Zaten dosyalarla doldurulmuş bir dizinin ACL'lerini değiştirmeyi denemeyin.
Bu betik, yükseltilmiş bir PowerShell oturumundan çalıştırılmalıdır.
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
Komutu çalıştırarak bu işlemin başarılı olduğunu onaylayabilirsiniz
icacls C:\NewSystemTemp\
Bu da başarıyı gösteren aşağıdaki çıktıyı oluşturur:
C:\NewSystemTemp\ NT AUTHORITY\SYSTEM:(OI)(CI)(F)
BUILTIN\Administrators:(OI)(CI)(F)
Successfully processed 1 files; Failed processing 0 files
Dizin oluşturulduktan sonra, ortam değişkenini %SYSTEMTEMP% sistem düzeyi kapsamıyla ayarlayın. Bunu System Denetim MasasıDenetim Masası UI aracılığıyla ayarlayabilir veya PowerShell aracılığıyla programlı olarak ayarlayabilirsiniz:
[Environment]::SetEnvironmentVariable("SYSTEMTEMP", "C:\NewSystemTemp", [EnvironmentVariableTarget]::Machine)
Ardından makineyi yeniden başlatın.
Ortam değişkenini %SYSTEMTEMP% değiştirmek, SYSTEM dışında bir kimlik olarak çalışan .NET Framework ve .NET uygulamalarının dönüş değerini System.IO.Path.GetTempPath() değiştirmez. Bu uygulamalar, varsa ortam %TEMP% değişkenlerini dikkate almak %TMP% da dahil olmak üzere her zaman sahip oldukları aynı çözünürlük mantığını izlemeye devam edecektir.
Benzer şekilde, veya %TEMP% ortam değişkeninin %TMP% ayarlanması, SİSTEM kimliği olarak çalışan .NET Framework ve .NET uygulamaları için dönüş değerini System.IO.Path.GetTempPath() değiştirmez.
Daha fazla bilgi için
T.NET Framework, T.NET Framework ve .NET davranışları hakkında daha fazla bilgi için Path.GetTempPath üzerindeki .NET belgelerine bakın.
Temel alınan Windows işletim sistemi davranışı hakkında daha fazla bilgi için Win32 GetTempPath2 API'si ile ilgili Windows belgelerine bakın.