Kondisi Keamanan dan Balapan
Area lain yang menjadi perhatian adalah potensi lubang keamanan yang dieksploitasi oleh kondisi balapan. Ada beberapa cara saat hal ini dapat terjadi. Subtopik yang mengikuti menguraikan beberapa perangkap utama yang harus dihindari pengembang.
Kondisi Balapan dalam Metode Dispose
Jika metode Dispose kelas (untuk informasi selengkapnya, lihat Pengumpulan Sampah) tidak disinkronkan, kode pembersihan dalam Dispose memungkinkan untuk dijalankan lebih dari sekali, seperti yang ditunjukkan di contoh berikut.
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;
}
}
Karena implementasi Dispose ini tidak disinkronkan, Cleanup
memungkinkan untuk dipanggil oleh satu rangkaian pertama dan kemudian rangkaian kedua sebelum _myObj
diatur ke null. Baik jika ini adalah masalah keamanan atau tidak bergantung pada apa yang terjadi saat kode Cleanup
berjalan. Masalah utama dengan implementasi Dispose yang tidak disinkronkan melibatkan penggunaan handel sumber daya seperti file. Pembuangan yang tidak tepat dapat menyebabkan handel yang salah digunakan, yang sering menyebabkan kerentanan keamanan.
Kondisi Balapan di Konstruktor
Dalam beberapa aplikasi, mungkin saja rangkaian lain dapat mengakses anggota kelas sebelum konstruktor kelas benar-benar berjalan. Anda harus meninjau semua konstruktor kelas untuk memastikan bahwa tidak ada masalah keamanan jika ini terjadi, atau menyinkronkan rangkaian jika perlu.
Kondisi Balapan dengan Objek yang Di-Cache
Kode yang menyimpan informasi keamanan atau menggunakan operasi Assert keamanan akses kode mungkin juga rentan terhadap kondisi balapan jika bagian lain dari kelas tidak disinkronkan dengan tepat, seperti yang ditunjukkan dalam contoh berikut.
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();
}
}
Jika ada jalur lain ke DoOtherWork
yang dapat dipanggil dari rangkaian lain dengan objek yang sama, penelepon yang tidak tepercaya dapat melewati permintaan.
Jika kode menyimpan informasi keamanan, pastikan Anda meninjaunya untuk kerentanan ini.
Kondisi Balapan di Finalizer
Kondisi balapan juga dapat terjadi dalam objek yang mereferensikan sumber daya statik atau tidak terkelola yang kemudian bebas dalam finalizer-nya. Jika beberapa objek berbagi sumber daya yang dimanipulasi dalam finalizer kelas, objek harus menyinkronkan semua akses ke sumber daya tersebut.