Bagikan melalui


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.

Lihat juga