2016-10-03 4 views
1

OpenSSLおよび/またはSSL/TLSプロトコルは、無限の再ネゴシエーションに対する何らかの保護機能を備えていますか?読み取りまたは書き込み中の無限の再ネゴシエーションによるDoS

特に、ペイロードデータを送信せずにリモート側(悪意のある可能性もある)が再ネゴシエーションを要求し続けるため、SSL_read()は永遠に実行できますか?

ポーリングメカニズムを使用して1つのスレッドから多数のSSL接続を処理し、1つの接続でのI/Oの処理が飢餓状態にならない公平な形式を確保したいので、これは心配です。他の接続のI/O

ノンブロッキングモードのソケットで普通のread()と呼ぶと、最終的にバッファがいっぱいになるので永遠に実行できないことがわかります。

しかし、SSL_read()は再交渉を透過的に処理できるため、ペイロードデータを送信せずにリモート側(悪意のある可能性があります)が再ネゴシエーションを要求し続け、基礎となるトランスポート層が、 EWOULDBLOCKで失敗すると、SSL_read()は永遠に実行され、それによって他の接続が枯渇する可能性があります。

私の質問:OpenSSLやプロトコルにはそれを回避する仕組みがありますか?ところで、質問はSSL_write()にも等しく当てはまります。

EDIT:たとえば、私は基本的な読み取り/書き込み操作がEWOULDBLOCKで失敗したことがない場合でも、SSL_read()は複数の再交渉を行う前SSL_ERROR_WANT_READ/SSL_ERROR_WANT_WRITE表示して返すことを確認することができますか?

EDIT:この質問の目的のために、私は通常のソケットBIO(BIO_s_socket())を使用していて、下にあるソケットは非ブロックモードであると仮定します。

+1

再交渉は透過的に処理できません。 NEED_WRAPが発生したときに書き込みを呼び出すことに依存します。 – EJP

+0

私はOpenSSLがそれを検出するヒューリスティックを提供していないと推測しています。スタックやファイアウォールのようなネットワークの境界で発生する必要がある修復の可能性が高い。 – jww

答えて

1

OpenSSLには組み込みの保護機能はありません。しかし、SSL_CTX_set_info_callbackなどを使用して、各ネゴシエーションで呼び出される関数を設定することができます。これにより、同じ接続内で再調整が多すぎる場合に接続を切断することができます。詳細については、Protect against client-initiated renegotiation DoS in OpenSSL/Pythonを参照してください。

関連する問題