2019 年 8 月、Netflix は HTTP/2 通信をサポートしているサーバに対するサービス拒否 (DoS) 攻撃を開始するのに使用できるいくつかのリソース枯渇ベクトルを発見しました。Netflix は、Google および CERT/CC と協力して、インターネット コミュニティへの開示を調整しました。これらのセキュリティ問題をカバーするために、NSX Advanced Load Balancer には 4 つの新しいパラメータが組み込まれています。
DoS アドバイザリの詳細については、「HTTP/2 サービス拒否アドバイザリ」を参照してください。
共通脆弱性識別子
HTTP/2 サービス拒否アドバイザリには、次の 8 つの共通脆弱性識別子 (CVE) が関連付けられています。
CVE-2019-9511:HTTP/2 データ ドリブル
CVE-2019-9512:HTTP/2 ping フラッド
CVE-2019-9513:HTTP/2 リソース ループ
CVE-2019-9514:HTTP/2 リセット フラッド
CVE-2019-9515:HTTP/2 設定フラッド
CVE-2019-9516:HTTP/2 長さが 0 のヘッダー リーク
CVE-2019-9517:HTTP/2 内部データ バッファリング
CVE-2019-9518:HTTP/2 空のフレーム フラッディング
CVE とエクスポージャへの対処
上記の CVE およびその他の問題は、新しい HTTP-application-profile
パラメータおよびその他のコードによって解決されます。4 つのパラメータには、NSX Advanced Load Balancer REST API と NSX Advanced Load Balancer CLI を使用してアクセスできます。
max_http2_control_frames_per_connection
クライアントが HTTP/2 接続を介して送信できる制御フレームの最大数
ping フラッド (CVE-2019-9512)、リセット フラッド (CVE-2019-9514)、設定フラッド (CVE-2019-9515)、およびリソース ループの問題 (CVE-2019-9513) の検出に使用されます
範囲:0 ~ 10,000、デフォルト値 = 1,000
0 は、クライアント側の HTTP/2 接続で制御フレームの数に制限がないと解釈されます
max_http2_queued_frames_to_client_per_connection
任意の時点でクライアント側の HTTP/2 接続を介して送信されるまでキューに入れることができるフレームの最大数
データ ドリブル (CVE-2019-9511) および内部データ バッファリング (CVE-2019-9517) の検出に使用されます
範囲:0 ~ 10,000、デフォルト値 = 10,000(キューに入れられたフレームの数に制限がないと解釈されます)
また、NGINX からの修正も組み込まれています (nginx/nginx@a987f81)
max_http2_empty_data_frames_per_connection
クライアント側の HTTP/2 接続を介した空のデータ フレームの最大数
空のデータ フレーム フラッディング (CVE-2019-9518) の検出に使用されます
-
注:
空のヘッダー フレームの場合、現在の実装では接続が終了し、エラー「HTTP2 フレーム サイズ エラー:クライアントがヘッダー ブロックが空の HEADERS フレームを送信しました」が報告されます。
範囲:0 ~ 10,000、デフォルト = 10,000(空のフレームの数に制限がないと解釈されます)
max_http2_concurrent_streams_per_connection
クライアント側の HTTP/2 接続を介した同時ストリームの最大数
任意の時点で 1 つの HTTP/2 接続で処理できる同時ストリームを制御するために使用されます
範囲:1 ~ 256、デフォルト値 = 128
-
注:
このパラメータは、上記の CVE 問題とは関係ありません。
長さが 0 のヘッダー リーク (CVE-2019-9516) は、現在のコードによって検出されます。検出されると、ストリームは終了し、NSX Advanced Load Balancer はエラー「HTTP2 プロトコル エラー:クライアントが長さがゼロのヘッダー名を送信しました」を報告します。
max_http2_requests_per_connection
この値は、クライアント側の HTTP/2 接続を介して送信できる最大数を制御します。値が 0 に設定されている場合、HTTP/2 クライアント側の接続を介して送信できる要求の数に制限がないことを意味します。
max_http2_header_field
このフィールドは、圧縮された要求ヘッダー フィールドの最大サイズ(バイト単位)を制御します。この制限は、要求ヘッダーの名前と値の両方に同様に適用されます。範囲は 1 ~ 8,192 バイトです。デフォルト値は 4,096 バイトです。
http2_initial_window_size
このフィールドは、HTTP/2 ストリームの初期フロー制御のウィンドウ サイズを制御します。このフィールドの値の範囲は 64 ~ 32,768 KB です。このフィールドのデフォルト値は 64 KB です。
CLI 構成の例
[admin:th-controller-3]: > show applicationprofile applicationprofile-22 +----------------------------------------------------+---------------------------------------------------------+ | Field | Value | +----------------------------------------------------+---------------------------------------------------------+ | uuid | applicationprofile-8cd83b63-9ef8-4ce3-b498-2d173a09ed7c | | name | applicationprofile-22 | | type | APPLICATION_PROFILE_TYPE_HTTP | | http_profile | | | connection_multiplexing_enabled | True | | xff_enabled | False | | xff_alternate_name | X-Forwarded-For | | ssl_everywhere_enabled | False | | hsts_enabled | False | | hsts_max_age | 365 | | secure_cookie_enabled | False | | httponly_enabled | False | | http_to_https | False | | server_side_redirect_to_https | False | | x_forwarded_proto_enabled | False | | spdy_enabled | False | | spdy_fwd_proxy_mode | False | | post_accept_timeout | 30000 milliseconds | | client_header_timeout | 10000 milliseconds | | client_body_timeout | 30000 milliseconds | | keepalive_timeout | 30000 milliseconds | | client_max_header_size | 12 kb | | client_max_request_size | 48 kb | | client_max_body_size | 0 kb | | max_rps_unknown_uri | 0 | | max_rps_cip | 0 | | max_rps_uri | 0 | | max_rps_cip_uri | 0 | | ssl_client_certificate_mode | SSL_CLIENT_CERTIFICATE_NONE | | websockets_enabled | True | | max_rps_unknown_cip | 0 | | max_bad_rps_cip | 0 | | max_bad_rps_uri | 0 | | max_bad_rps_cip_uri | 0 | | keepalive_header | False | | use_app_keepalive_timeout | False | | allow_dots_in_header_name | False | | disable_keepalive_posts_msie6 | True | | enable_request_body_buffering | False | | enable_fire_and_forget | False | | max_response_headers_size | 48 kb | | http2_enabled | True | | respond_with_100_continue | True | | hsts_subdomains_enabled | True | | enable_request_body_metrics | False | | fwd_close_hdr_for_bound_connections | True | | max_keepalive_requests | 100 | | disable_sni_hostname_check | False | | max_http2_control_frames_per_connection | 1000 | | max_http2_queued_frames_to_client_per_connection | 1000 | | max_http2_empty_data_frames_per_connection | 1000 | | max_http2_concurrent_streams_per_connection | 128 | | reset_conn_http_on_ssl_port | False | | preserve_client_ip | False | | preserve_client_port | False | | tenant_ref | admin | +----------------------------------------------------+---------------------------------------------------------+ [admin:th-controller-3]: > [admin:th-controller-3]: applicationprofile> configure applicationprofile applicationprofile-22 [admin:th-controller-3]: applicationprofile> http_profile [admin:th-controller-3]: applicationprofile:http_profile> max_http2_control_frames_per_connection 2000 Overwriting the previously entered value for max_http2_control_frames_per_connection [admin:th-controller-3]: applicationprofile:http_profile> max_http2_queued_frames_to_client_per_connection 2000 Overwriting the previously entered value for max_http2_queued_frames_to_client_per_connection [admin:th-controller-3]: applicationprofile:http_profile> max_http2_empty_data_frames_per_connection 2000 Overwriting the previously entered value for max_http2_empty_data_frames_per_connection [admin:th-controller-3]: applicationprofile:http_profile> max_http2_concurrent_streams_per_connection 256 Overwriting the previously entered value for max_http2_concurrent_streams_per_connection [admin:th-controller-3]: applicationprofile:http_profile> save [admin:th-controller-3]: applicationprofile> save [admin:th-controller-3]: > show applicationprofile applicationprofile-22 +----------------------------------------------------+---------------------------------------------------------+ | Field | Value | +----------------------------------------------------+---------------------------------------------------------+ | uuid | applicationprofile-8cd83b63-9ef8-4ce3-b498-2d173a09ed7c | | name | applicationprofile-22 | | type | APPLICATION_PROFILE_TYPE_HTTP | | http_profile | | | connection_multiplexing_enabled | True | | xff_enabled | False | | xff_alternate_name | X-Forwarded-For | | ssl_everywhere_enabled | False | | hsts_enabled | False | | hsts_max_age | 365 | | secure_cookie_enabled | False | | httponly_enabled | False | | http_to_https | False | | server_side_redirect_to_https | False | | x_forwarded_proto_enabled | False | | spdy_enabled | False | | spdy_fwd_proxy_mode | False | | post_accept_timeout | 30000 milliseconds | | client_header_timeout | 10000 milliseconds | | client_body_timeout | 30000 milliseconds | | keepalive_timeout | 30000 milliseconds | | client_max_header_size | 12 kb | | client_max_request_size | 48 kb | | client_max_body_size | 0 kb | | max_rps_unknown_uri | 0 | | max_rps_cip | 0 | | max_rps_uri | 0 | | max_rps_cip_uri | 0 | | ssl_client_certificate_mode | SSL_CLIENT_CERTIFICATE_NONE | | websockets_enabled | True | | max_rps_unknown_cip | 0 | | max_bad_rps_cip | 0 | | max_bad_rps_uri | 0 | | max_bad_rps_cip_uri | 0 | | keepalive_header | False | | use_app_keepalive_timeout | False | | allow_dots_in_header_name | False | | disable_keepalive_posts_msie6 | True | | enable_request_body_buffering | False | | enable_fire_and_forget | False | | max_response_headers_size | 48 kb | | http2_enabled | True | | respond_with_100_continue | True | | hsts_subdomains_enabled | True | | enable_request_body_metrics | False | | fwd_close_hdr_for_bound_connections | True | | max_keepalive_requests | 100 | | disable_sni_hostname_check | False | | max_http2_control_frames_per_connection | 2000 | | max_http2_queued_frames_to_client_per_connection | 2000 | | max_http2_empty_data_frames_per_connection | 2000 | | max_http2_concurrent_streams_per_connection | 256 | | reset_conn_http_on_ssl_port | False | | preserve_client_ip | False | | preserve_client_port | False | | tenant_ref | admin | +----------------------------------------------------+---------------------------------------------------------+ [admin:th-controller-3]: >