由于读取或写入期间的无限重新协商而导致的 DoS

DoS due to infinite renegotiation during read or write

OpenSSL and/or SSL/TLS 协议是否提供某种针对无限重新协商的内置保护?

特别是,SSL_read()是否有可能永远继续执行,因为远程端(可能是恶意的)不断请求重新协商而不发送有效负载数据?

我很担心这一点,因为我想使用轮询机制从单个线程为多个 SSL 连接提供服务,并确保一种公平形式,其中 I/O 在一个连接上的处理不会导致其他连接上 I/O 的饥饿。

当我以非阻塞模式在套接字上调用常规 read() 时,我知道它不能一直执行下去,因为缓冲区最终会填满。

然而,由于 SSL_read() 可以透明地处理重新协商,在我看来,如果远程端(可能是恶意的)在不发送有效负载数据的情况下不断请求重新协商,并且底层传输层足够快以使得底层读取和写入永远不会因 EWOULDBLOCK 而失败,然后 SSL_read() 可能会永远执行下去,从而使其他连接处于饥饿状态。

因此我的问题是:OpenSSL 或协议是否有避免这种情况的机制?顺便说一下,这个问题同样适用于 SSL_write()

编辑:例如,我可以确定 SSL_read() 将 return 与 SSL_ERROR_WANT_READ/SSL_ERROR_WANT_WRITE 指示在进行多次重新谈判之前,即使潜在的read/write 操作永远不会因 EWOULDBLOCK?

而失败

编辑:为了这个问题的目的,假设我使用的是常规套接字 BIO (BIO_s_socket()) 并且底层套接字处于非阻塞模式。

OpenSSL 中没有内置保护。但是您可以使用 SSL_CTX_set_info_callback 或类似设置在每次协商时调用的函数。这样,如果同一连接内发生过多的重新协商,您可以切断连接。有关详细信息,请参阅 Protect against client-initiated renegotiation DoS in OpenSSL/Python