由于读取或写入期间的无限重新协商而导致的 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。
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。