Beveiligings- en racevoorwaarden
Een ander aandachtspunt is het potentieel voor beveiligingsgaten die worden misbruikt door raceomstandigheden. Er zijn verschillende manieren waarop dit kan gebeuren. De subonderwerpen die volgen geven een overzicht van enkele van de belangrijkste valkuilen die de ontwikkelaar moet vermijden.
Racevoorwaarden in de verwijderingsmethode
Als de verwijderingsmethode van een klasse (voor meer informatie, zie Garbagecollection) niet is gesynchroniseerd, is het mogelijk dat opschoningscode in Verwijdering meer dan één keer kan worden uitgevoerd, zoals wordt weergegeven in het volgende voorbeeld.
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;
}
}
Omdat deze verwijderings-implementatie niet wordt gesynchroniseerd, is het mogelijk Cleanup
om te worden aangeroepen door de eerste thread en vervolgens een tweede thread voordat _myObj
deze is ingesteld op null. Of dit een beveiligingsprobleem is, is afhankelijk van wat er gebeurt wanneer de Cleanup
code wordt uitgevoerd. Een belangrijk probleem met niet-gesynchroniseerde verwijderings-implementaties omvat het gebruik van resource-ingangen, zoals bestanden. Onjuiste verwijdering kan ertoe leiden dat de verkeerde ingang wordt gebruikt, wat vaak leidt tot beveiligingsproblemen.
Raceomstandigheden in constructors
In sommige toepassingen is het mogelijk dat andere threads toegang hebben tot klasseleden voordat hun klasseconstructors volledig zijn uitgevoerd. Controleer alle klasseconstructors om er zeker van te zijn dat er geen beveiligingsproblemen zijn als dit moet gebeuren, of synchroniseer indien nodig threads.
Racevoorwaarden met objecten in cache
Code waarmee beveiligingsgegevens in de cache worden opgeslagen of de beveiligingsbewerking voor codetoegang wordt gebruikt, is mogelijk ook kwetsbaar voor racevoorwaarden als andere onderdelen van de klasse niet op de juiste wijze worden gesynchroniseerd, zoals wordt weergegeven in het volgende voorbeeld.
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();
}
}
Als er andere paden DoOtherWork
naar die kunnen worden aangeroepen vanuit een andere thread met hetzelfde object, kan een niet-vertrouwde beller voorbij een vraag lopen.
Als uw code beveiligingsgegevens in de cache opgeslagen, controleert u deze op dit beveiligingsprobleem.
Racevoorwaarden in Finalizers
Racevoorwaarden kunnen ook optreden in een object dat verwijst naar een statische of onbeheerde resource die vervolgens wordt vrijgemaakt in de finalizer. Als meerdere objecten een resource delen die wordt gemanipuleerd in de finalizer van een klasse, moeten de objecten alle toegang tot die resource synchroniseren.