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.
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
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