Güvenlik ve Yarış Durumları
Bir diğer endişe alanı da yarış koşullarından yararlanılan güvenlik açıkları potansiyelidir. Bunun çeşitli yolları vardır. İzleyen alt konu konuları, geliştiricinin kaçınması gereken bazı önemli tuzakları özetler.
Dispose Yönteminde Yarış Koşulları
Bir sınıfın Dispose yöntemi (daha fazla bilgi için bkz. Çöp Toplama) eşitlenmemişse, aşağıdaki örnekte gösterildiği gibi Dispose içindeki temizleme kodunun birden çok kez çalıştırılabilmesi mümkündür.
Sub Dispose()
If Not (myObj Is Nothing) Then
Cleanup(myObj)
myObj = Nothing
End If
End Sub
void Dispose()
{
if (myObj != null)
{
Cleanup(myObj);
myObj = null;
}
}
Bu Dispose uygulaması eşitlenmediğinden, Cleanup
ilk bir iş parçacığı tarafından çağrılabilir ve ardından null olarak ayarlanmadan önce _myObj
ikinci bir iş parçacığı çağrılabilir. Bunun bir güvenlik sorunu olup olmadığı, kod çalıştırıldığında Cleanup
ne olacağına bağlıdır. Eşitlenmemiş Dispose uygulamalarıyla ilgili önemli bir sorun, dosyalar gibi kaynak tanıtıcılarının kullanılmasını içerir. Hatalı kullanım yanlış tanıtıcının kullanılmasına neden olabilir ve bu da genellikle güvenlik açıklarına yol açar.
Oluşturucularda Yarış Koşulları
Bazı uygulamalarda, sınıf oluşturucuları tamamen çalışmadan önce diğer iş parçacıklarının sınıf üyelerine erişmesi mümkün olabilir. Bunun olması durumunda herhangi bir güvenlik sorunu olmadığından emin olmak veya gerekirse iş parçacıklarını eşitlemek için tüm sınıf oluşturucularını gözden geçirmeniz gerekir.
Önbelleğe Alınmış Nesnelerle Yarış Koşulları
Aşağıdaki örnekte gösterildiği gibi, güvenlik bilgilerini önbelleğe alan veya kod erişimi güvenliği Assert işlemini kullanan kod, sınıfın diğer bölümleri uygun şekilde eşitlenmemişse yarış koşullarına karşı da savunmasız olabilir.
Sub SomeSecureFunction()
If SomeDemandPasses() Then
fCallersOk = True
DoOtherWork()
fCallersOk = False
End If
End Sub
Sub DoOtherWork()
If fCallersOK Then
DoSomethingTrusted()
Else
DemandSomething()
DoSomethingTrusted()
End If
End Sub
void SomeSecureFunction()
{
if (SomeDemandPasses())
{
fCallersOk = true;
DoOtherWork();
fCallersOk = false;
}
}
void DoOtherWork()
{
if (fCallersOK)
{
DoSomethingTrusted();
}
else
{
DemandSomething();
DoSomethingTrusted();
}
}
Aynı nesneye sahip başka bir iş parçacığından çağrılabilecek başka yollar DoOtherWork
varsa, güvenilmeyen bir çağıran talebin üzerine kayabilir.
Kodunuz güvenlik bilgilerini önbelleğe alırsa, bu güvenlik açığı için bu bilgileri gözden geçirmeyi unutmayın.
Finalizer'larda Yarış Koşulları
Yarış koşulları, statik veya yönetilmeyen bir kaynağa başvuran ve ardından sonlandırıcısında serbest olan bir nesnede de oluşabilir. Bir sınıfın sonlandırıcısında manipüle edilen bir kaynağı birden çok nesne paylaşıyorsa, nesnelerin bu kaynağa tüm erişimi eşitlemesi gerekir.