これは、Bartek Nowotarski 氏により発見・文書化された CONTINUATION flood 脆弱性の概念実証コードです。技術的な詳細は、彼のブログ記事 こちら で非常によく説明されています。私は研究者が文書化した Go のバグに焦点を当てましたが、このコードはこの問題に関連する他の CVE のテストにも役立ちます。
このコードは以下のものから着想を得ています:
私の最初の目標は、この脆弱性を詳細に理解することに加えて、業務でこの問題をテストするためのツールを開発することでした。これはまた、http2 の内部動作を詳細に理解する作業にも非常に役立ちました。その他に役立った情報源は以下の通りです:
脆弱性のあるバージョンの golang.org/x/net (0.20.0) 上で動作する server.go ファイルを実行できます。
$ go run server.go
サーバーはポート 8443 で動作し、クライアントはデフォルトでこのポートを指します。
脆弱なサーバーに対して実行すると、クライアントは wait フラグで指定した秒数だけ CONTINUATION フレームを送信し続けることができます。サーバーは 2 秒ごとに CPU 使用率を表示し、クライアントの実行に伴って CPU 使用率が急激に上昇するのを確認できます。パッチ適用済みのバージョン(0.23.0 以降)では、ヘッダーサイズ制限に達するとサーバーが接続を閉じます。
クライアントを実行し、6 つの同時接続を作成して https://localhost:8443 を呼び出し、各接続に対して 200 秒間 CONTINUATION フレームを送信します:
$ go run client.go -time-limit 200 -connections 6 -url https://localhost:8443