Partilhar via


Segurança e condições de corrida

Outra área de interesse é o potencial para brechas de segurança explorados por condições de corrida.Há várias maneiras em que isso pode acontecer.Os subtópicos que se seguem descrevem alguns dos principais armadilhas que o desenvolvedor deve evitar.

Condições de corrida no método Dispose

Se Descartar método (para obter mais informações, consulte Coleta de Lixo) não é sincronizados, é possível que código de limpeza dentro Descartar pode ser executado mais de uma vez, conforme mostrado no exemplo a seguir.

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;
    }
}

Porque este Descartar implementação não está sincronizada, é possível para Cleanup a ser chamado pelo primeiro um thread e, em seguida, um segundo thread antes _myObj é definido como nulo.Se esse é um problema de segurança depende do que acontece quando o Cleanup o código é executado. Uma questão importante não sincronizadas Descartar implementações envolve o uso de identificadores de recurso, sistema autônomo arquivos.Disposição inadequada pode fazer com que a alça errada ser usado, que geralmente leva a vulnerabilidades de segurança.

Condições de corrida na construtores

Em alguns aplicativos, talvez seja possível a de outros segmentos acesso membros de classe antes completamente têm executado seus construtores de classe.Verifique se todos os construtores de classe para certificar-se de que estão sem problemas de segurança se isso deve acontecer ou sincronizar segmentos, se necessário.

Condições de corrida com objetos em cache

Código que armazena em cache sistema autônomo informações de segurança ou usa o segurança de acesso do código Declarar operação também pode ser vulnerável a condições de corrida se outras partes da classe não estão sincronizados corretamente, conforme mostrado no exemplo a seguir.

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();
    }
}

Se existirem outros caminhos de DoOtherWork que pode ser chamado a partir de outro thread com o mesmo objeto, um chamador não confiável pode deixar passar após uma demanda.

Se seu código armazena em cache as informações de segurança, certifique-se de revisá-lo para essa vulnerabilidade.

Condições de corrida na Finalizers

Condições de corrida também podem ocorrer em um objeto que faz referência a um recurso estático ou não gerenciado que ele libera no seu finalizador.Se vários objetos compartilham um recurso que é manipulado no finalizador da classe, os objetos devem sincronizar todo o acesso ao recurso.

Consulte também

Outros recursos

Diretrizes para Codificação Segura