rapid-reset-check 是一个小巧的 Go CLI 工具,用于快速盘点那些暴露 HTTP/2、因而需要进行 CVE-2023-44487 缓解审查的 HTTPS 端点。
该扫描器刻意避免任何攻击性利用行为。它会解析每个目标,建立经过证书验证的 TLS 连接,通过 ALPN 提供 h2 与 http/1.1,记录对端的选择,然后关闭连接。它不会发送任何 HTTP 请求、HTTP/2 连接前言、数据流、RST_STREAM 帧或洪泛流量。
[!IMPORTANT] 协商出
h2只是一种暴露观测结果,并非服务存在漏洞或未打补丁的证明。远程握手无法验证某个 HTTP/2 实现在 Rapid Reset 限制、补丁级别、上游来源或 DDoS 防护方面的情况。
CVE-2023-44487 是一种滥用 HTTP/2 快速创建与取消流的拒绝服务攻击技术。要针对在线服务验证该问题的存在,本身就需要发送可能造成干扰的流量。而此工具回答的是安全的第一步问题:哪些被测 TLS 端点当前协商了 HTTP/2,因而需要运维人员核实其缓解措施?
基于 TLS 的 HTTP/2 通过 RFC 9113 定义的 h2 ALPN 标识符进行通告。Google 建议对请求路径上的每个支持 HTTP/2 的服务器、代理和负载均衡器进行核实或修补;参见其 CVE-2023-44487 指南。
运行该工具不需要安装 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 工件证明(artifact attestation),可通过 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;发布版构建则从发布标签中获取版本号。
请仅扫描您拥有或获授权评估的端点。
扫描一个或多个公开端点:
./rapid-reset-check example.com api.example.com:8443
裸主机名会被规范化为 443 端口上的 HTTPS。仅含权威(authority)的 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 被有意设计为互斥。规范化后重复的端点只会被扫描一次,且每次运行最多接受 4,096 个输入目标。
只有 HTTPS 端点属于扫描范围。凭据、非根路径、查询、片段、不支持的协议、格式错误的端口以及有歧义的主机名都会被拒绝,而不会被静默改写。
| 评估结果 | 含义 |
|---|---|
h2_observed_review_required | 至少一个通过验证的 TLS 对端选择了 h2。请审查该路径上的每个 HTTP/2 组件;这并非漏洞判定。 |
h2_not_observed_on_tested_path | 所有所选地址均完成了经验证的握手,且均未选择 h2。这是针对某一时间点的路径观测结果,并非安全保证。 |
indeterminate | DNS、连接、超时、TLS、证书或地址数量限制方面的问题导致无法完成完整观测。 |
not_scanned_policy | 解析出的地址被扫描器的网络安全策略排除。 |
invalid_target | 输入格式有误,或超出所支持的 HTTPS 权威(authority)范围。 |
报告中包含每个尝试过的解析地址、协商出的 ALPN、TLS 版本与加密套件、有限的证书身份/有效期数据、计时信息、策略决策、被省略地址的数量、明确的完整性标志以及汇总信息。它不收集响应体、响应头、Cookie 或原始证书。
--ca-file 添加私有 CA;不存在不安全验证模式。--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 表示至少有一个目标无效、被策略阻止或结果不确定;报告仍会照常写入。命令行用法与配置错误返回 2。观测到 h2 本身不会改变退出码,因为它是盘点信号,而非漏洞判定。
对于每个 h2_observed_review_required 结果:
结果取决于具体的主机名、DNS 应答、网络路径、TLS 端点与扫描时间。CDN、任播(anycast)、分流 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: 页脚。维护者需要启用一次 设置 > Actions > 常规 > 工作流权限 > 允许 GitHub Actions 创建和批准拉取请求,Release Please 才能管理其 PR。
如果 Release Please 创建标签后资产发布失败,该版本会保持为草稿。修复问题后,请使用该既有的 vX.Y.Z 标签手动重新运行 Release 工作流。请勿创建或推送替代标签。