HTTP/2 で発見された新たな脆弱性:CONTINUATION Flood の仕組みについて解説する

New HTTP/2 Vulnerability Exposes Web Servers to DoS Attacks

2024/04/04 TheHackerNews — HTTP/2 プロトコルの CONTINUATION フレームを悪用することで、サービス拒否 (DoS) 攻撃が可能なことが、新たな研究で判明した。セキュリティ研究者の Bartek Nowotarski により、このテクニックは “HTTP/2 CONTINUATION Flood” というコードネームで呼ばれている。2024年1月25日に彼は、この問題を CERT Coordination Center (CERT/CC) に報告している。


CERT/CC は 2024年4月3日のアドバイザリで、「数多くの HTTP/2 実装は、単一のストリーム内で送信される CONTINUATION フレームの量を、適切に制限/サニタイズしていない。ターゲット・サーバにパケットを送信できる攻撃者は、メモリ内のヘッダー・リストに追加されない CONTINUATION フレームのストリームを送信できる。しかし、それらは、サーバによる処理/デコードが行われる場合と、ヘッダー・リストに追加される場合があるため、OOM (Out of Memory) クラッシュへといたる」と述べている。

HTTP/1 と同様に、HTTP/2 もリクエスト/レスポンスにヘッダー・フィールドを使用する。これらのヘッダー・フィールドはヘッダー・リストを構成し、ヘッダー・リストはシリアライズされ、ヘッダー・ブロックに分割される。ヘッダー・ブロックはブロック・フラグメントに分割され、HEADER または CONTINUATION フレームを介して送信される。CONTINUATION フレーム (type=0x9) は、ヘッダー・ブロック・フラグメントの シーケンスを継続するために使用されると、RFC 7540 では文書化されている。

したがって、同じストリーム上にある直前のフレームが、END_HEADERS フラグが設定されていない HEADERS/PUSH_PROMISE/CONTINUATION フレームのいずれか場合には、いくつでも CONTINUATION フレームを送信できることになる。ヘッダを含む最後のフレームには、END_HEADERS フラグが設定され、リモート・エンドポイントにヘッダ・ブロックの終了を知らせる。

Nowotarski によると、CONTINUATION Flood は、いくつかの HTTP/2 プロトコル実装の脆弱性として分類され、2023年10月に判明した Rapid Reset 攻撃との比較において、より深刻な脅威をもたらすという。

彼は、「1台のマシン (特定のケースでは、単なる1つの TCP 接続または一握りのフレーム) が大幅なパフォーマンス低下やクラッシュを引き起こし、サーバの可用性を中断させる可能性が生じる。驚くべきことに、攻撃を構成するリクエストは、HTTP アクセスログでは見ることができない」と述べている。

この脆弱性の核心は、DoS 状態に道を開く HEADERS と、複数の CONTINUATION フレームの不正な処理に関係する。言い換えるなら、攻撃者は脆弱な実装を使用して、ターゲット・サーバに対して新しい HTTP/2 ストリームを開始し、END_HEADERS フラグが設定されていない HEADERS と CONTINUATION フレームを送信できる。

正確な結果は、実装により異なるものとなるが、HTTP/2 フレームを数回送信しただけで、メモリ不足によるクラッシュなどが生じ、サーバの可用性に CPU 疲弊の影響が発生する。

Bartek Nowotarski は、「RFC 9113 で言及されるのは、CONTINUATION フレームが正しく処理されない場合に発生する、複数のセキュリティ問題である。しかし、CONTINUATION フレームが、END_HEADERS フラグなしで送信され、サーバに影響を与える可能性がある特定のケースについては言及していない」と指摘している。

この問題が影響を与えるものには、amphp/http (CVE-2024-2653)/Apache HTTP Server (CVE-2024-27316)/Apache Tomcat (CVE-2024-24549)/Apache Traffic Server (CVE-2024-31309)/Envoy proxy (CVE-2024-27919 and CVE-2024-30255)/Golang (CVE-2023-45288)/h2 Rust crate/nghttp2 (CVE-2024-28182)/Node. js (CVE-2024-27983)/Tempesta FW (CVE-2024-2758) などがある。

ユーザーに対して推奨されるのは、潜在的な脅威を軽減するために、影響を受けるソフトウェアを最新バージョンにアップグレードすることだ。修正プログラムが存在しない場合には、サーバ上の HTTP/2 を一時的に無効化することも検討すべきである。