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

时间:2016-10-03 01:54:59

标签: ssl openssl polling starvation

OpenSSL和/或SSL / TLS协议是否提供某种内置保护以防止无限重新协商?

特别是,read()是否可以永久执行,因为远程端(可能是恶意的)在不发送有效负载数据的情况下继续请求重新协商?

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

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

但是,由于EWOULDBLOCK可以透明地处理重新协商,因此在我看来,如果远程端(可能是恶意的)继续请求重新协商而不发送有效负载数据,并且底层传输层足够快以进行基础读取写入永远不会失败SSL_read(),然后SSL_write()可能会永远执行,从而使其他连接匮乏。

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

编辑:例如,在进行多次重新协商之前,我是否可以确保SSL_ERROR_WANT_READ将返回SSL_ERROR_WANT_WRITE / EWOULDBLOCK指示,即使基础读/写操作永远不会失败与BIO_s_socket()

编辑:出于这个问题的目的,假设我使用常规套接字BIO(ip: "192.168.10.10" memory: 2048 cpus: 1 provider: virtualbox authorize: ~/.ssh/id_rsa.pub keys: - ~/.ssh/id_rsa folders: - map: C:\Users\Lekz\development\projects\laravel to: /home/vagrant/Code sites: - map: laravel.dev to: /home/vagrant/Code/acctg_pending2/public - map: homestead.app to: /home/vagrant/Code/test/public databases: - addessa_acctg_pending - testdb # blackfire: # - id: foo # token: bar # client-id: foo # client-token: bar # ports: # - send: 50000 # to: 5000 # - send: 7777 # to: 777 # protocol: udp )并且底层套接字处于非阻塞模式。

1 个答案:

答案 0 :(得分:1)

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