概要 :
HTTP/2はHTTP/1.1とは異なり、"Stream multiplexing "機能を利用しており、単一のTCPコネクション内で複数のストリームをオープン/クローズすることができます。このプロトコルで最近発見されたサービス拒否(DoS)の脆弱性CVE-2023-44487の解析をまとめました。
攻撃タイプ:
CVE-2023-44487は、HTTP/2プロトコルをサポートするすべてのウェブサービスを標的としており、主にロードバランサーやプロキシとして動作するサーバーやクラウドサービスに焦点を当てています。大量の RST_STREAM リクエストを送信することで、サーバーの過剰な処理を誘発し、サービス拒否攻撃を引き起こします。
基本的にHTTP/2では、RST_STREAMのようなストリームキャンセルリクエストを受信すると、サーバーはまずHEADER情報を読み込んでストリームをハーフクローズ状態に遷移させ、RST_STREAMを読み込んだ時点でストリームをクローズします。
ソース : https://blog.cloudflare.com/technical-breakdown-http2-rapid-reset-ddos-attack/
しかし、クライアントはRST_STREAMリクエストを制限なく、応答データを待つことなく送信し続けることができる。一方、サーバーは、キャンセルリクエストがあると、新しいストリームデータ構造を割り当て、クエリパースを実行し、ヘッダを解凍し、URLをリソースにマッピングし、重要な処理を行う必要がある。これは、サーバーとクライアントの動作の非対称性につながる。
最終的に、クライアントと比較してサーバーの作業負荷が大きいため、遅延が発生し、DoS攻撃が発生します。
この攻撃は単一のTCPリクエスト内で発生するため、CloudFlareのようなDDoS緩和サービスでさえも完全に緩和することができず、この脆弱性がもたらすリスクの高さを浮き彫りにしています。
さらに、この攻撃のバリエーションには、複数のストリームを同時にキャンセルしたり、サーバーの制限を超える数のストリームを同時に開いたりする方法などがある。
対応策:
この脆弱性の悪用を検知した場合、事後対策として、現象が発生したIPをブロックしたり、TCPコネクション全体をブロックしたりすることがある。予防策としては、接続時に許可される同時ストリーム数の制限を実施することが挙げられる。
さらに、この問題に脆弱なサービスやライブラリは、最新バージョンにアップデートする必要がある。
当社のAIWAFおよびAISWG製品では、関連するnghttp2ライブラリを更新し、HTTP/2セッションのRST_STREAM数を制限する機能を開発しました(AIWAF v5.0.2_2ビルド4126以降で利用可能)。
結論 :
CVE-2023-44487はHTTP/2プロトコルの構造的な問題に起因する脆弱性で、HTTP/2をサポートするあらゆるサービスで悪用される可能性があります。この脆弱性に対する認識と対応は極めて重要です。
当社のAIWAFやAISWG製品では、関連するサービスやライブラリをアップデートし、この脆弱性を利用したDoS攻撃に対する対応策を確立しています。