rapid-reset-check は、HTTP/2 を公開しているため CVE-2023-44487 の緩和策レビューが必要な HTTPS エンドポイントを迅速に棚卸しするための小さな Go CLI です。
このスキャナは意図的に非悪用型です。各ターゲットを解決し、証明書を検証した TLS 接続を開き、ALPN を通じて h2 と http/1.1 を提示し、ピアが選択したものを記録して接続を閉じます。HTTP リクエスト、HTTP/2 接続プリアンブル、ストリーム、RST_STREAM フレーム、フラッドトラフィックは一切送信しません。
[!IMPORTANT]
h2のネゴシエーションは露出の観測結果であり、サービスが脆弱であるとかパッチ未適用であるという証明ではありません。リモートのハンドシェイクでは、HTTP/2 実装の Rapid Reset 制限、パッチレベル、上流オリジン、DDoS 対策を検証することはできません。
CVE-2023-44487 は、HTTP/2 ストリームの高速な生成とキャンセルを悪用するサービス拒否 (DoS) 手法です。稼働中のサービスに対してこの状態を証明しようとすると、それ自体が破壊的なトラフィックを必要とする可能性があります。このツールは代わりに、安全な最初の問いに答えます: テスト対象の TLS エンドポイントのうち、現在 HTTP/2 をネゴシエーションしており、したがって運用者が緩和策を検証する必要があるのはどれか?
TLS 上の HTTP/2 は、RFC 9113 で定義された h2 ALPN 識別子を使用してアドバタイズされます。Google は、リクエストパス上のすべての HTTP/2 対応サーバー、プロキシ、ロードバランサーを検証またはパッチ適用することを推奨しています。詳細は を参照してください。
このツールの実行に Go は必要ありません。最新の GitHub リリース からお使いのプラットフォーム用のアーカイブをダウンロードしてください:
| プラットフォーム | リリースアセット |
|---|---|
| Linux x86-64 | rapid-reset-check_<version>_linux_amd64.tar.gz |
| Linux ARM64 | rapid-reset-check_<version>_linux_arm64.tar.gz |
| macOS Intel | rapid-reset-check_<version>_darwin_amd64.tar.gz |
| macOS Apple silicon | rapid-reset-check_<version>_darwin_arm64.tar.gz |
| Windows x86-64 | rapid-reset-check_<version>_windows_amd64.zip |
| Windows ARM64 | rapid-reset-check_<version>_windows_arm64.zip |
アーカイブを展開し、rapid-reset-check --version を実行してください。Windows では、実行ファイル名は rapid-reset-check.exe です。
各リリースには SHA256SUMS が含まれています。Linux では、同じディレクトリからダウンロードしたアーカイブを次のコマンドで検証できます:
sha256sum --ignore-missing --check SHA256SUMS
macOS では、shasum -a 256 <archive> の出力を SHA256SUMS 内の対応する行と比較してください。公開されたパブリックリリースのアーカイブには GitHub のアーティファクト証明も付与され、GitHub CLI で確認できます:
gh attestation verify <archive> --repo ramonzx6/http-script-json
Node.js、cURL、nghttp2、WHOIS のインストールは必要ありません。
go test ./...
go build -o rapid-reset-check ./cmd/rapid-reset-check
ソースからのビルドは --version で dev と表示します。リリースビルドはリリースタグからバージョンを取得します。
所有している、または評価を許可されたエンドポイントのみをスキャンしてください。
1 つ以上のパブリックエンドポイントをスキャン:
./rapid-reset-check example.com api.example.com:8443
ホスト名のみの入力はポート 443 の HTTPS に正規化されます。オーソリティのみの HTTPS URL も受け付けられます:
./rapid-reset-check https://example.com https://api.example.com:8443
リポジトリの JSON ターゲットリストをスキャン:
./rapid-reset-check --input json/urls.json
自動化のために標準入力を使用:
printf '["example.com", "api.example.com"]' | ./rapid-reset-check --input -
すべての制限と出力オプションについては ./rapid-reset-check --help を実行してください。
--input は元の JSON 配列形式を受け付けます:
[
"example.com",
"api.example.com:8443",
"https://www.example.net"
]
オブジェクト形式の {"urls": [...]} と {"targets": [...]} もサポートされています。位置引数のターゲットと --input は意図的に排他的です。重複する正規化済みエンドポイントは 1 回だけスキャンされ、1 回の実行は入力ターゲット 4,096 件に制限されます。
対象となるのは HTTPS エンドポイントのみです。資格情報、ルート以外のパス、クエリ、フラグメント、未対応のスキーム、不正なポート、曖昧なホスト名は、黙って書き換えられるのではなく拒否されます。
| 評価 | 意味 |
|---|---|
h2_observed_review_required | 検証済みの TLS ピアのうち少なくとも 1 つが h2 を選択しました。そのパス上のすべての HTTP/2 コンポーネントをレビューしてください。これは脆弱性の判定ではありません。 |
h2_not_observed_on_tested_path | 選択されたすべてのアドレスが h2 を選択せずに検証済みハンドシェイクを完了しました。これは特定時点のパスの観測結果であり、安全性の保証ではありません。 |
indeterminate | DNS、接続、タイムアウト、TLS、証明書、またはアドレス数の制限により、完全な観測ができませんでした。 |
not_scanned_policy | 解決されたアドレスがスキャナのネットワーク安全性ポリシーにより除外されました。 |
invalid_target | 入力が不正な形式であるか、サポート対象の HTTPS オーソリティの範囲外でした。 |
レポートには、試行した各解決済みアドレス、ネゴシエーションされた ALPN、TLS バージョンと暗号スイート、限定された証明書の識別情報/有効性データ、タイミング、ポリシー判定、省略されたアドレス数、明示的な完全性フラグ、およびサマリーが含まれます。レスポンスボディ、レスポンスヘッダー、Cookie、生の証明書は収集しません。
--ca-file を使用してください。安全でない検証モードはありません。--allow-private は、評価を許可された内部エンドポイントにのみ使用してください。オプションの例:
./rapid-reset-check \
--format json \
--timeout 5s \
--concurrency 4 \
--max-addresses 8 \
example.com > report.json
認可されたプライベート PKI エンドポイントの場合:
./rapid-reset-check \
--allow-private \
--ca-file ./internal-root-ca.pem \
service.internal:8443
終了コード 0 は、すべてのターゲットが完全な ALPN 観測を生成したことを意味します。終了コード 1 は、少なくとも 1 つのターゲットが無効、ポリシーによるブロック、または判定不能であったことを意味します。この場合もレポートは書き出されます。CLI の使用方法と設定のエラーは 2 を返します。h2 の観測は、それ自体では終了コードを変更しません。これは脆弱性の判定ではなく棚卸しのシグナルだからです。
h2_observed_review_required の結果ごとに:
結果は、ホスト名、DNS 応答、ネットワークパス、TLS エンドポイント、スキャン時刻に固有です。CDN、エニーキャスト、スプリットホライズン DNS、ロードバランシング、代替ポート、未テストのアドレスでは異なる結果になる可能性があります。このスキャナは以下を行いません:
h2c)、QUIC/HTTP/3、リダイレクト、エッジの背後に隠されたオリジン、非 HTTPS サービスを検査すること;Server ヘッダーや CDN フィンガープリントからパッチ状態を推測すること;gofmt -w ./cmd ./internal
go vet ./...
go test ./...
go test -race ./...
go build ./...
テストスイートはローカルの TLS フィクスチャを使用し、パブリックサービスをスキャンしません。
Release Please は、Conventional Commit メッセージからリリースバージョンと vX.Y.Z タグを管理します。通常の開発ではタグの作成やプッシュは必要ありません:
main にマージされたコミットにより、Release Please がバージョンとチェンジログの変更を含むリリース PR を開くか更新します。パッチ変更には fix:、マイナー変更には feat: を使用し、メジャー変更には破壊的変更マーカー (!) または BREAKING CHANGE: フッターを使用してください。メンテナーは、Release Please が PR を管理できるように、Settings > Actions > General > Workflow permissions > Allow GitHub Actions to create and approve pull requests を一度有効にする必要があります。
Release Please がタグを作成した後にアセットの公開が失敗した場合、リリースはドラフトのまま残ります。失敗を修正した後、その既存の vX.Y.Z タグを指定して Release ワークフローを手動で再実行してください。代替タグを作成したりプッシュしたりしないでください。