1

OpenSSL および/または SSL/TLS プロトコルは、無限の再ネゴシエーションに対する何らかの組み込みの保護を提供しますか?

特に、SSL_read()リモート側が (おそらく悪意を持って) ペイロード データを送信せずに再ネゴシエーションを要求し続けるため、 が永久に実行し続けることは可能ですか?

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

非ブロッキング モードのソケットでregular を呼び出すとread()、バッファーが最終的にいっぱいになるため、永久に実行し続けることができないことがわかります。

ただし、SSL_read()再ネゴシエーションを透過的に処理できるため、リモート側が (おそらく悪意を持って) ペイロード データを送信せずに再ネゴシエーションを要求し続け、基になるトランスポート層が基になる読み取りと書き込みEWOULDBLOCKSSL_read().永久に実行されることになり、それによって他の接続が不足します。

したがって、私の質問: OpenSSL またはプロトコルには、それを回避するメカニズムがありますか? ちなみに、質問は同様に適用さSSL_write()れます。

編集:たとえば、基礎となる読み取り/書き込み操作が決して失敗しない場合でも、複数の再ネゴシエーションに従事する前に/指示SSL_read()で戻ることを確認できますか?SSL_ERROR_WANT_READSSL_ERROR_WANT_WRITEEWOULDBLOCK

編集: この質問の目的のために、通常のソケット BIO ( BIO_s_socket()) を使用しており、基になるソケットが非ブロック モードであると仮定します。

4

1 に答える 1

1

OpenSSL には組み込みの保護機能はありません。ただし、SSL_CTX_set_info_callbackまたは同様の機能を使用して、各ネゴシエーションで呼び出される関数を設定できます。これにより、同じ接続内で再ネゴシエーションが多すぎる場合に接続を切断できます。詳細については、「 OpenSSL/Python でクライアントが開始した再ネゴシエーション DoS から保護する」を参照してください。

于 2016-10-03T04:34:34.077 に答える