このブログ記事では、HTTP/2プロトコルに関連して最近発見された脆弱性を取り上げます。特定の条件下では、この脆弱性が悪用され、HTTP/2仕様のサーバー側部分を実装するNGINX Open Source、NGINX Plus、および関連製品に対してサービス拒否攻撃が実行される可能性があります。この攻撃からシステムを保護するため、NGINXの設定を直ちに更新することを推奨します。
HTTP/2ストリームのリセットに関する問題
サーバーとの接続が確立されると、HTTP/2プロトコルでは、クライアントがデータ交換用の複数のストリームを同時に開始できます。以前のバージョンのプロトコルとは異なり、エンドユーザーが別のページに移動する場合や、その他の理由でデータ交換を停止する場合、HTTP/2ではストリームをキャンセルできます。サーバーにRST_STREAMフレームを送信することで、サーバーが不要な処理を実行せずに済むようにします。
この脆弱性は、確立済みの接続上で多数のHTTP/2ストリームを開始して即座にキャンセルし、サーバーの同時ストリーム数の上限を回避することで悪用されます。これは、後続のストリームが到着するよりも速く受信ストリームがリセットされるためです。その結果、クライアントは設定されたしきい値に達することなく、サーバーに過剰な負荷をかけることができます。
NGINXへの影響
パフォーマンスとリソース消費を考慮し、NGINXでは同時ストリーム数のデフォルト上限を128に設定しています(http2_max_concurrent_streamsを参照)。また、ネットワークとサーバーのパフォーマンスを最適なバランスに保つため、NGINXではHTTPキープアライブを使用して、クライアントがデフォルトで最大1,000件のリクエストまでHTTP接続を維持できるようにしています(keepalive_requestsを参照)。
デフォルトのkeepalive上限を利用することで、NGINXはこの種の攻撃を防ぎます。この上限を回避するために追加の接続を確立すると、標準的なレイヤー4の監視・アラートツールによって悪意のある攻撃者が検出されます。
ただし、NGINXのkeepaliveがデフォルト値および推奨値を大幅に上回るように設定されている場合、この攻撃によってシステムリソースが枯渇する可能性があります。ストリームがリセットされると、HTTP/2プロトコルでは、そのストリームで以降のデータをクライアントに返さないことが求められます。通常、リセットによって発生するサーバーのオーバーヘッドは、キャンセルを適切に処理するタスクによるごくわずかなものです。しかし、NGINXのストリームしきい値を回避すると、クライアントはこのオーバーヘッドを悪用し、数千ものストリームを短時間に開始することで増幅できます。その結果、サーバーのCPU使用率が急上昇し、正規のクライアントに対するサービスが妨害されます。

攻撃にさらされるリスクを軽減する手順
フル機能のサーバーおよびプロキシであるNGINXは、サービス拒否攻撃を緩和するための強力なツールを管理者に提供します。これらの機能を活用し、サーバーの攻撃対象領域を最小限に抑えるには、NGINXの設定ファイルに以下の変更を加えることが不可欠です。
- keepalive_requestsは、デフォルト設定の1,000リクエストのままにしてください。
- http2_max_concurrent_streamsは、デフォルト設定の128ストリームのままにしてください。
また、ベストプラクティスとして、以下の安全対策を追加することを推奨します。
- limit_connは、単一のクライアントから許可される接続数に上限を適用します。このディレクティブは、アプリケーションのパフォーマンスとセキュリティのバランスを考慮した適切な設定で追加することを推奨します。
- limit_reqは、単一のクライアントから一定時間内に処理されるリクエスト数を制限します。このディレクティブは、アプリケーションのパフォーマンスとセキュリティのバランスを考慮し、適切な値を設定して追加する必要があります。
F5の対応
複数の緩和策を検証したことで、この攻撃が幅広いお客さまやユーザーに及ぼし得る影響について理解を深めることができました。この調査により、NGINXにはこの攻撃を回避するために必要なツールがすでにすべて備わっていることを確認しましたが、推奨仕様を超えてNGINXを構成する必要があるユーザーも確実に対応できるよう、追加の対策を講じることにしました。
調査の結果、HTTP/2プロトコル上で理論的に発生し得るさまざまなフラッド攻撃に対し、サーバーのレジリエンスを向上させる方法が明らかになりました。これを受け、こうした状況下でシステムの安定性を高めるパッチをリリースしました。このような脅威から保護するため、NGINX Open Sourceのユーザーは最新のコードベースからバイナリを再ビルドし、NGINX Plusのお客さまは直ちに最新のパッケージ(R29p1またはR30p1)へ更新することを推奨します。
パッチの仕組み
NGINXに対するフラッド攻撃を早期に検出できるよう、このパッチでは、1回のイベントループ内で新たに開始できるストリーム数に上限を設けています。この上限は、http2_max_concurrent_streamsディレクティブで設定した値の2倍です。この攻撃のように、リクエストの送信直後にストリームがリセットされ、最大しきい値に達しない場合でも、この上限が適用されます。
影響を受ける製品
この脆弱性は、NGINX HTTP/2モジュール(ngx_http_v2_module)に影響します。影響を受ける可能性がある特定のNGINX製品またはF5製品については、次のページをご覧ください:https://my.f5.com/manage/s/article/K000137106
CVE-2023-44487(HTTP/2 Rapid Reset攻撃)の詳細については、以下をご覧ください:https://www.cve.org/CVERecord?id=CVE-2023-44487
謝辞
この脆弱性の発見、特定、緩和におけるCloudflare、Amazon、Googleの貢献と協力に感謝いたします。
このブログ記事は、初回公開後に、修復に関する詳細情報を追加し、内容をより明確にするため更新されました。
著者について
関連するブログ記事

F5 Application Study Tool:OpenTelemetryによるF5 BIG-IP環境の監視
F5の新しいオープンソースツールは、BIG-IP環境を詳細に可視化し、データを追跡するとともに、強力でカスタマイズ可能なインサイトを得るための基盤を提供します。
F5 BIG-IPでAI防御を実現
F5 BIG-IP Advanced WAF、BIG-IP APM、BIG-IP SSL Orchestratorが、生成AIアプリ向けに包括的なセキュリティソリューションを提供する仕組みをご覧ください。
F5 Advanced WAFによるGraphQL APIの保護
ここ数年、多くの組織がデジタルトランスフォーメーションを進めており、COVID-19のパンデミックによってその動きは加速しています。
アプリケーションサービスの現状 通信業界版:リーダーとしての台頭
通信ネットワークが進化し、さまざまな業界の幅広いユースケースに対応するなか、通信業界の回答者がテクノロジーリーダーとしての存在感を高めていることがわかります。
デジタルトランスフォーメーションは、単なるペーパーレス化ではない
デジタルトランスフォーメーションは、単なるペーパーレス化ではありません。真のモダナイゼーションにアプリケーションアーキテクチャとセキュリティの再構築が必要な理由を、F5ブログでご覧ください。
やめましょう。もう本当にやめましょう。HTTPSはHTTPより高速ではありません。
もうやめましょう。HTTPSはHTTPより高速ではありません。プロトコルのパフォーマンスに関する微妙な違いと、暗号化トラフィックを適切に最適化する方法については、F5ブログをご覧ください。