
CVE-2023-44487に対するサーバーの脆弱性をチェックするための高度に設定可能なツール。HEADERSおよびRST_STREAMフレームを高速に送信し、サーバーの応答を記録します。
CVE-2023-44487 は、HTTP2 プロトコルそのものに対するエクスプロイトです。HTTP2 では、データリクエストは HEADERS フレームを送信することで開始されます。このフレームを受信したサーバーはリクエストの処理を開始し、その後すべてのデータが送信されるまで DATA フレームを送信します。また HTTP2 は RST_STREAM フレームを定義しており、任意の時点でストリームを閉じるために使用できます。攻撃を防ぐため、サーバーは通常、同時に開かれるストリームの最大数を制限しています(デフォルトで 100)。クライアントが実際にすべてのリソースが消費されるのを待つ場合、この制限に達することはほとんどありません。この攻撃が機能する理由は単純です。クライアントは 任意の 時点で RST_STREAM フレームを送信できます。RST_STREAM フレームはストリームを閉じ、閉じられたストリームは同時ストリームとしてカウントされません。つまり、クライアントはリクエストを送信した直後に接続を閉じるだけで、この制限に達することなくリクエストを高速に送信できます。攻撃されたサーバーは、場合によってはデータの読み込みを開始し続け、過剰な負荷を引き起こします。
このツールは、サーバーのこの攻撃に対する脆弱性を確認することを目的としています。1 つ以上の同時 HTTP2 接続を確立し、指定された数の HEADER フレームを送信し、続いて RST_STREAM フレームを送信します。
また、HEADERS と RST_STREAM フレームの間の遅延、開くストリームの数、ストリームごとに送信するフレームの数など、他の多くの設定オプションも提供します。 攻撃が完了すると、受信したフレーム数、エラー数、GOAWAY フレームの受信数を含むサマリーが出力されます。 これにより、自身のサービスが CVE-2023-44487 に対して脆弱かどうかを特定するのに役立ちます。
現時点では、このツールはソースコードのみで配布されており、go install が必要です。ツールは go run main.go <options> を実行することで実行できます。
また、monitor.log ファイルに書き込まれたレイテンシ情報をプロットするための Python スクリプトもあります。
さらに、より正確で広範な測定を行うための新しい Python ツーリングを作成しました。
tooling フォルダにある ファイルは、(詳細は を参照)で定義された値を読み取り、定義されたすべての Docker コンテナに対してすべてのテストを実行します。
次に、 配列で定義されたすべてのパスに対して、最も成功したテスト(最高の中央値 + 平均レイテンシ)を実行します。各テストのプロットとログファイルを出力します。
このツーリングはまだ開発中です。私たちの研究論文のためにこれらのテストを手動で実行するのが面倒だったので、作成しただけです。
クリーンアップしたり、私たちのユースケース以上に実際に使用可能にしたい場合は、PR を送ってください。
runner.pyconfig.pyconfig-sample.pypaths現在、以下の CLI オプションが実装されています:
| フラグ | デフォルト | 意味 |
|---|---|---|
| frames | 1 | 任意のストリームで送信する HEADERS と RST_STREAM のフレーム数 |
| connections | 1 | 攻撃を実行する TLS 接続数(同時) |
| consecutiveSends | 1 | RST_STREAM フレームを送信する前に送信する HEADERS フレーム数(フローごと) |
| connectAttempts | 1 | テストを実行する連続接続数(接続ルーチンごと) |
| delay | 0 | HEADERS と RST_STREAM フレームの送信間の待機時間(ms) |
| ignoreGoAway | false | true の場合、GOAWAY ストリームは受信ルーチンを終了させません。代わりに、10 秒以上フレームを受信しなくなるまで待機します。 |
| monitor | false | パフォーマンスモニタリングを有効にする |
| monitorDelay | 100 | 応答レイテンシをテストする間隔(ms) |
| monitorLog | ./monitor.log | モニタ遅延ログを書き込むファイル |
| routines | 1 | 攻撃するストリーム数 |
| skipValidation | true | true の場合、サーバー証明書は検証されません(これがデフォルトです。攻撃者であるためセキュリティは気にしません) |
| timeout | 1000 | 新しいフレームを待つ時間。これを超えると接続試行は無効とみなされ停止します |
| url | https://localhost:433/ | 攻撃を実行する URL |
ツールは多くのデバッグ情報とサマリーを出力します。 デバッグ情報には、接続の確立方法、現在の進捗状況、現在送信中のフレームの種類に関する情報が含まれます。
サマリーは次のようになります(設定により異なります)
####################SUMMARY####################
Packet types received:
PING: 2
HEADERS: 12
SETTINGS: 0
DATA: 11
GOAWAY: 3
RSTSTREAM: 0
WINDOWUPDATE: 0
UNKNOWN: 0
Attack ending reasons (per receiving thread):
GoAway events: 3
Timeout events: 0
Error events: 0
Summary for connection 2
PING: 1
HEADERS: 9
SETTINGS: 0
DATA: 6
GOAWAY: 1
RSTSTREAM: 0
WINDOWUPDATE: 0
UNKNOWN: 0
Reason for stopping to listen for more packets: GoAway - the server responded as expected.
Summary for connection 1
PING: 1
HEADERS: 3
SETTINGS: 0
DATA: 5
GOAWAY: 1
RSTSTREAM: 0
WINDOWUPDATE: 0
UNKNOWN: 0
Reason for stopping to listen for more packets: GoAway - the server responded as expected.
Summary for connection 0
PING: 0
HEADERS: 0
SETTINGS: 0
DATA: 0
GOAWAY: 1
RSTSTREAM: 0
WINDOWUPDATE: 0
UNKNOWN: 0
Reason for stopping to listen for more packets: GoAway - the server responded as expected.
集める必要がある他の統計があれば、遠慮なく連絡するか、Issue を作成してください!
このツールは研究目的のみを意図しています。自身が所有または管理していないサーバーに対して攻撃を実行することを意図していません。 提供される統計の正確性、ならびに攻撃とそのサーバーやサービスへの影響について、一切の責任を負いません。