DoS из-за бесконечного пересмотра во время чтения или записи
Предоставляет ли OpenSSL и / или протокол SSL/TLS какую-то встроенную защиту от бесконечного повторного согласования?
В частности, возможно ли SSL_read()
продолжить выполнение навсегда, потому что удаленная сторона (возможно, злонамеренно) продолжает запрашивать повторные переговоры без отправки данных полезной нагрузки?
Меня это беспокоит, потому что я хочу обслуживать несколько соединений SSL из одного потока, используя механизм опроса, а также обеспечить форму справедливости, когда обработка ввода-вывода в одном соединении не приводит к прекращению ввода-вывода в другие соединения.
Когда я звоню регулярно read()
на сокете в неблокирующем режиме я знаю, что он не может продолжаться вечно, потому что буфер заполнится в конце концов.
Тем не менее, так как SSL_read()
может прозрачно обрабатывать повторные переговоры, мне кажется, что если удаленная сторона (возможно, злонамеренно) продолжает запрашивать повторные переговоры без отправки данных полезной нагрузки, а базовый транспортный уровень достаточно быстр, чтобы базовые операции чтения и записи никогда не заканчивались с EWOULDBLOCK
, затем SSL_read()
может закончиться выполнением навсегда, и тем самым истощать другие связи.
Поэтому мой вопрос: есть ли у OpenSSL или протоколов механизмы, позволяющие этого избежать? Вопрос в равной степени относится к SSL_write()
Кстати.
РЕДАКТИРОВАТЬ: Например, могу ли я быть уверен, что SSL_read()
вернется с SSL_ERROR_WANT_READ
/SSL_ERROR_WANT_WRITE
индикация перед выполнением нескольких повторных переговоров, даже если основные операции чтения / записи никогда не завершаются с EWOULDBLOCK
?
РЕДАКТИРОВАТЬ: Для целей этого вопроса предположим, что я использую обычный сокет BIO (BIO_s_socket()
) и что основной сокет находится в неблокирующем режиме.
1 ответ
В OpenSSL нет встроенной защиты. Но вы можете использовать SSL_CTX_set_info_callback
или аналогично для установки функции, которая вызывается при каждом согласовании. Таким образом, вы можете разорвать соединение, если внутри одного соединения происходит слишком много повторных переговоров. См. Защита от инициируемого клиентом повторного согласования DoS в OpenSSL/Python для получения дополнительной информации.