
CLI em Go que inventaria endpoints HTTPS que negociam HTTP/2 via ALPN para identificar sistemas que exigem revisão de mitigação da CVE-2023-44487. Verificações TLS não exploratórias, com verificação de certificado e padrões seguros.
rapid-reset-check é um pequeno CLI em Go para inventariar rapidamente endpoints HTTPS que expõem HTTP/2 e, portanto, precisam de uma revisão de mitigação para CVE-2023-44487.
O scanner é deliberadamente não exploratório. Ele resolve cada alvo, abre uma conexão TLS com verificação de certificado, oferece h2 e http/1.1 via ALPN, registra o que o par seleciona e fecha a conexão. Ele não envia nenhuma requisição HTTP, prefácio de conexão HTTP/2, stream, frame RST_STREAM ou tráfego de inundação.
[!IMPORTANT] Negociar
h2é uma observação de exposição, não uma prova de que um serviço está vulnerável ou sem correção. Um handshake remoto não pode verificar os limites de Rapid Reset de uma implementação HTTP/2, o nível de correção, a origem upstream ou os controles de DDoS.
CVE-2023-44487 é uma técnica de negação de serviço que abusa da criação e do cancelamento rápidos de streams HTTP/2. Tentar comprovar a condição contra um serviço ativo exigiria, por si só, tráfego potencialmente disruptivo. Em vez disso, esta ferramenta responde à primeira pergunta segura:
HTTP/2 sobre TLS é anunciado usando o identificador ALPN h2, definido pelo RFC 9113. O Google recomenda verificar ou corrigir todos os servidores, proxies e balanceadores de carga compatíveis com HTTP/2 no caminho da requisição; consulte as orientações sobre CVE-2023-44487.
Go não é necessário para executar a ferramenta. Baixe o arquivo para sua plataforma na última release do GitHub:
| Plataforma | Asset da release |
|---|---|
| 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 |
Extraia o arquivo e execute rapid-reset-check --version. No Windows, o executável é nomeado rapid-reset-check.exe.
Cada release inclui SHA256SUMS. No Linux, verifique um arquivo baixado a partir do mesmo diretório com:
sha256sum --ignore-missing --check SHA256SUMS
No macOS, compare shasum -a 256 <arquivo> com a linha correspondente em SHA256SUMS. Os arquivos de release pública também recebem uma atestação de artefato (artifact attestation) do GitHub, que pode ser verificada com a GitHub CLI:
gh attestation verify <archive> --repo ramonzx6/http-script-json
Não é necessária nenhuma instalação de Node.js, cURL, nghttp2 ou WHOIS.
go test ./...
go build -o rapid-reset-check ./cmd/rapid-reset-check
Builds a partir do código-fonte relatam dev em --version; builds de release recebem sua versão pela tag da release.
Varra apenas endpoints que você possui ou está autorizado a avaliar.
Varra um ou mais endpoints públicos:
./rapid-reset-check example.com api.example.com:8443
Nomes de host simples são normalizados para HTTPS na porta 443. URLs HTTPS somente com autoridade também são aceitas:
./rapid-reset-check https://example.com https://api.example.com:8443
Varra a lista de alvos JSON do repositório:
./rapid-reset-check --input json/urls.json
Use a entrada padrão para automação:
printf '["example.com", "api.example.com"]' | ./rapid-reset-check --input -
Execute ./rapid-reset-check --help para ver todos os limites e opções de saída.
--input aceita o formato original de array JSON:
[
"example.com",
"api.example.com:8443",
"https://www.example.net"
]
As formas de objeto {"urls": [...]} e {"targets": [...]} também são suportadas. Alvos posicionais e --input são intencionalmente mutuamente exclusivos. Endpoints normalizados duplicados são varridos uma única vez, e cada execução é limitada a 4.096 alvos de entrada.
Apenas endpoints HTTPS estão no escopo. Credenciais, caminhos não raiz, consultas, fragmentos, esquemas não suportados, portas malformadas e nomes de host ambíguos são rejeitados em vez de serem reescritos silenciosamente.
| Avaliação | Significado |
|---|---|
h2_observed_review_required | Pelo menos um peer TLS verificado selecionou h2. Revise todos os componentes HTTP/2 nesse caminho; isto não é um veredito de vulnerabilidade. |
h2_not_observed_on_tested_path | Cada endereço selecionado concluiu um handshake verificado sem selecionar h2. Esta é uma observação pontual do caminho, não uma garantia de segurança. |
indeterminate | Um problema de DNS, conexão, tempo limite, TLS, certificado ou limite de endereços impediu uma observação completa. |
not_scanned_policy | Os endereços resolvidos foram excluídos pela política de segurança de rede do scanner. |
invalid_target | A entrada estava malformada ou fora do escopo de autoridade HTTPS suportado. |
O relatório inclui cada endereço resolvido tentado, ALPN negociado, versão e cifra TLS, dados limitados de identidade/validade do certificado, tempo, decisões de política, contagens de endereços omitidos, uma flag explícita de completude e um resumo. Ele não coleta corpos de resposta, cabeçalhos de resposta, cookies ou certificados brutos.
--ca-file para adicionar uma CA privada; não há modo de verificação inseguro.--allow-private somente para endpoints internos que você está autorizado a avaliar.Exemplo de opções:
./rapid-reset-check \
--format json \
--timeout 5s \
--concurrency 4 \
--max-addresses 8 \
example.com > report.json
Para um endpoint autorizado com PKI privada:
./rapid-reset-check \
--allow-private \
--ca-file ./internal-root-ca.pem \
service.internal:8443
O código de saída 0 significa que cada alvo produziu uma observação ALPN completa. O código de saída 1 significa que pelo menos um alvo foi inválido, bloqueado por política ou indeterminado; o relatório ainda é gravado. Erros de uso da CLI e de configuração retornam 2. Observar h2 não muda por si só o código de saída, pois é um sinal de inventário, não um veredito de vulnerabilidade.
Para cada resultado h2_observed_review_required:
Os resultados são específicos ao nome de host, às respostas de DNS, ao caminho de rede, ao endpoint TLS e ao momento da varredura. CDNs, anycast, DNS split-horizon, balanceamento de carga, portas alternativas e endereços não testados podem produzir resultados diferentes. O scanner não:
h2c), QUIC/HTTP/3, redirecionamentos, origens ocultas atrás de uma borda ou serviços não HTTPS;Server falsificáveis ou impressões digitais de CDN;gofmt -w ./cmd ./internal
go vet ./...
go test ./...
go test -race ./...
go build ./...
A suíte de testes usa fixtures TLS locais e não varre serviços públicos.
O Release Please gerencia as versões de release e as tags vX.Y.Z a partir de mensagens de Conventional Commit. O desenvolvimento normal não exige criar ou enviar tags:
main fazem o Release Please abrir ou atualizar um PR de release contendo a versão e as alterações de changelog.Use fix: para alterações de correção, feat: para alterações menores e um marcador de mudança incompatível (!) ou rodapé BREAKING CHANGE: para alterações principais. Os mantenedores devem habilitar Settings > Actions > General > Workflow permissions > Allow GitHub Actions to create and approve pull requests uma vez para que o Release Please gerencie seu PR.
Se a publicação de assets falhar depois que o Release Please criar uma tag, a release permanece como draft. Execute novamente o workflow Release manualmente com essa tag vX.Y.Z existente após corrigir a falha. Não crie nem envie uma tag substituta.