
ALPN을 통해 HTTP/2를 협상하는 HTTPS 엔드포인트를 목록화하여 CVE-2023-44487 완화 검토가 필요한 시스템을 식별하는 Go CLI입니다. 비악용적이며, 인증서를 검증하고 안전한 기본값을 사용하는 TLS 검사를 수행합니다.
rapid-reset-check는 HTTP/2를 노출하므로 CVE-2023-44487 완화 검토가 필요한 HTTPS 엔드포인트를 신속하게 인벤토리화하는 작은 Go CLI 도구입니다.
이 스캐너는 의도적으로 악용을 수행하지 않습니다. 각 대상을 해석하고, 인증서가 검증된 TLS 연결을 연 다음, ALPN을 통해 h2와 http/1.1을 제안하고, 상대방(peer)이 선택한 것을 기록한 뒤 연결을 닫습니다. HTTP 요청, HTTP/2 연결 프리페이스(preface), 스트림, 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 아티팩트 증명(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 버전 및 암호, 제한된 인증서 ID/유효성 데이터, 타이밍, 정책 결정, 생략된 주소 수, 명시적 완전성 플래그 및 요약이 포함됩니다. 응답 본문, 응답 헤더, 쿠키 또는 원시 인증서는 수집하지 않습니다.
--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은 하나 이상의 대상이 유효하지 않거나, 정책에 의해 차단되었거나, 판정 불가(indeterminate)임을 의미하며, 보고서는 여전히 작성됩니다. CLI 사용법 및 구성 오류는 2를 반환합니다. h2 관찰 자체는 종료 코드를 변경하지 않습니다. 이는 취약점 판정이 아닌 인벤토리 신호이기 때문입니다.
모든 h2_observed_review_required 결과에 대해:
결과는 호스트 이름, DNS 응답, 네트워크 경로, TLS 엔드포인트 및 스캔 시점에 따라 달라집니다. CDN, 애니캐스트, split-horizon 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 표시(!) 또는 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 워크플로를 수동으로 다시 실행하세요. 대체 태그를 만들거나 푸시하지 마세요.