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]: >