2016-10-03 2 views
1

OpenSSL et/ou le protocole SSL/TLS fournissent-ils une sorte de protection intégrée contre la renégociation infinie?DoS dû à une renégociation infinie pendant la lecture ou l'écriture

En particulier, est-il possible que SSL_read() continue de s'exécuter pour toujours parce que le côté distant (peut-être avec malveillance) continue de demander des renégociations sans envoyer de données utiles? Cela m'inquiète parce que je veux traiter un certain nombre de connexions SSL à partir d'un seul thread en utilisant un mécanisme d'interrogation et également assurer une forme d'équité où le traitement des E/S sur une connexion ne mène pas à la famine de E/S sur les autres connexions.

Lorsque j'appelle le read() régulier sur une socket en mode non bloquant, je sais qu'il ne peut pas continuer à s'exécuter indéfiniment, car le tampon se remplira finalement. Cependant, puisque SSL_read() peut gérer les renégociations de façon transparente, il me semble que si le côté distant (peut-être malicieusement) continue de demander des renégociations sans envoyer de données utiles, et que la couche de transport sous-jacente est assez rapide pour que les lectures et écritures sous-jacentes ne échouer avec EWOULDBLOCK, puis SSL_read() pourrait finir par s'exécuter pour toujours, et ainsi affamer les autres connexions.

Donc ma question: OpenSSL ou les protocoles ont-ils des mécanismes pour éviter cela? La question s'applique également à SSL_write() en passant.

EDIT: Par exemple, puis-je être sûr que SSL_read() retournera avec un SSL_ERROR_WANT_READ/indication SSL_ERROR_WANT_WRITE avant de se livrer à plusieurs renégociations, même si les opérations de lecture/écriture sous-jacentes ne manquent jamais avec EWOULDBLOCK?

EDIT: Pour les besoins de cette question, supposons que j'utilise une socket standard BIO (BIO_s_socket()) et que le socket sous-jacent est en mode non bloquant.

+1

Il ne peut pas gérer les renégociations de façon transparente. Il repose sur l'appel que vous appelez write lorsque NEED_WRAP se produit. – EJP

+0

Je suppose qu'OpenSSL ne fournit pas d'heuristique pour le détecter. C'est probablement une correction qui doit se produire plus haut dans la pile et aux limites d'un réseau, comme un pare-feu. – jww

Répondre

1

Il n'y a pas de protection intégrée dans OpenSSL. Mais vous pouvez utiliser SSL_CTX_set_info_callback ou similaire pour définir une fonction qui est appelée à chaque négociation. De cette façon, vous pouvez couper la connexion si trop de renégociations se produisent à l'intérieur de la même connexion. Voir Protect against client-initiated renegotiation DoS in OpenSSL/Python pour plus d'informations.