Como: habilitar a detecção de reprodução de mensagem
Um ataque de reprodução ocorre quando um invasor copia um fluxo de mensagens entre duas partes e reproduz o fluxo para uma ou mais das partes. A menos que seja mitigado, os computadores sujeitos ao ataque processarão o fluxo como mensagens legítimas, resultando em uma série de consequências ruins, como ordens redundantes de um item.
Para obter mais informações sobre a detecção de reprodução de mensagens, consulte Detecção de Reprodução de Mensagens.
O procedimento a seguir demonstra várias propriedades que você pode usar para controlar a detecção de reprodução usando o Windows Communication Foundation (WCF).
Para controlar a detecção de reprodução no cliente usando código
Criar um SecurityBindingElement para usar em um CustomBinding. Para obter mais informações, consulte Como criar uma associação personalizada utilizando o SecurityBindingElement. O exemplo a seguir usa um SymmetricSecurityBindingElement criado com o CreateKerberosBindingElement da classe SecurityBindingElement.
Use a propriedade LocalClientSettings para retornar uma referência à classe LocalClientSecuritySettings e definir qualquer uma das seguintes propriedades, conforme apropriado:
DetectReplay
. Um valor booliano. Isso determina se o cliente deve detectar reproduções do servidor. O padrão étrue
.MaxClockSkew
. Um valor TimeSpan. Controla quanto tempo de distorção o mecanismo de reprodução pode tolerar entre o cliente e o servidor. O mecanismo de segurança examina o carimbo de data/hora enviado e determina se ele foi enviado muito longe no passado. O padrão é 5 minutos.ReplayWindow
. Um valorTimeSpan
. Isso determina quanto tempo uma mensagem pode viver na rede depois que o servidor a envia (por meio de intermediários) antes de chegar ao cliente. O cliente rastreia as assinaturas das mensagens enviadas noReplayWindow
mais recente para fins de detecção de reprodução.ReplayCacheSize
. Um valor inteiro. O cliente armazena as assinaturas da mensagem em um cache. Essa configuração especifica quantas assinaturas o cache pode armazenar. Se o número de mensagens enviadas na última janela de reprodução atingir o limite de cache, novas mensagens serão rejeitadas até que as assinaturas mais antigas armazenadas em cache atinjam o limite de tempo. O padrão é 500000.
Para controlar a detecção de reprodução no serviço usando código
Criar um SecurityBindingElement para usar em um CustomBinding.
Use a propriedade LocalServiceSettings para retornar uma referência à classe LocalServiceSecuritySettings e defina as propriedades conforme descrito anteriormente.
Para controlar a detecção de reprodução na configuração do cliente ou serviço
Crie um <customBinding>.
Crie um elemento
<security>
.Crie um <localClientSettings> ou <localServiceSettings>.
Defina os seguintes valores de atributo, conforme apropriado:
detectReplays
,maxClockSkew
,replayWindow
ereplayCacheSize
. O exemplo a seguir define os atributos de um elemento<localServiceSettings>
e<localClientSettings>
:<customBinding> <binding name="NewBinding0"> <textMessageEncoding /> <security> <localClientSettings replayCacheSize="800000" maxClockSkew="00:03:00" replayWindow="00:03:00" /> <localServiceSettings replayCacheSize="800000" maxClockSkew="00:03:00" replayWindow="00:03:00" /> <secureConversationBootstrap /> </security> <httpTransport /> </binding> </customBinding>
Exemplo
O exemplo a seguir cria um SymmetricSecurityBindingElement usando o método CreateKerberosBindingElement e define as propriedades de reprodução da associação.
private SecurityBindingElement CreateSymmetricBindingForClient()
{
SymmetricSecurityBindingElement b = SecurityBindingElement.CreateKerberosBindingElement();
b.LocalClientSettings.DetectReplays = true;
b.LocalClientSettings.MaxClockSkew = new TimeSpan(0, 3, 0);
b.LocalClientSettings.ReplayWindow = new TimeSpan(0, 2, 0);
b.LocalClientSettings.ReplayCacheSize = 10000;
return b;
}
Private Function CreateSymmetricBindingForClient() As SecurityBindingElement
Dim b = SecurityBindingElement.CreateKerberosBindingElement()
With b.LocalClientSettings
.DetectReplays = True
.MaxClockSkew = New TimeSpan(0, 3, 0)
.ReplayWindow = New TimeSpan(0, 2, 0)
.ReplayCacheSize = 10000
End With
Return b
End Function
Escopo de Reprodução: Somente Segurança de Mensagem
Observe que os procedimentos a seguir se aplicam somente ao modo de segurança de Mensagem. Para os modos de Transporte e Transporte com Credencial de Mensagem, os mecanismos de transporte detectam reproduções.
Observações de Conversa Segura
Para associações que permitem conversas seguras, você pode ajustar essas configurações tanto para o canal do aplicativo quanto para a associação de inicialização de conversa segura. Por exemplo, você pode desativar as reproduções para o canal do aplicativo, mas habilitá-las para o canal de inicialização que estabelece a conversa segura.
Se você não usar sessões de conversa seguras, a detecção de reprodução não garante a detecção de reproduções em cenários de farm de servidores e quando o processo é reciclado. Isso se aplica às seguintes associações fornecidas pelo sistema:
WSHttpBinding com a propriedade EstablishSecurityContext definida como
false
.
Compilando o código
Os namespaces a seguir são necessários para compilar o código: