
CLI en Go que inventaría endpoints HTTPS que negocian HTTP/2 mediante ALPN para identificar sistemas que requieren revisión de mitigación de CVE-2023-44487. Comprobaciones TLS no explotables, con verificación de certificados y valores predeterminados seguros.
rapid-reset-check es un pequeño CLI en Go para inventariar rápidamente endpoints HTTPS que exponen HTTP/2 y, por lo tanto, necesitan una revisión de mitigación para CVE-2023-44487.
El escáner es deliberadamente no explotativo. Resuelve cada objetivo, abre una conexión TLS verificada por certificado, ofrece h2 y http/1.1 mediante ALPN, registra lo que selecciona el peer y cierra la conexión. No envía ninguna petición HTTP, prefacio de conexión HTTP/2, stream, frame RST_STREAM ni tráfico de inundación.
[!IMPORTANT] Negociar
h2es una observación de exposición, no una prueba de que un servicio sea vulnerable o no esté parcheado. Un handshake remoto no puede verificar los límites de Rapid Reset de una implementación de HTTP/2, su nivel de parche, el origin aguas arriba ni los controles anti-DDoS.
CVE-2023-44487 es una técnica de denegación de servicio que abusa de la creación y cancelación rápida de streams HTTP/2. Intentar demostrar la condición contra un servicio en vivo requeriría por sí mismo tráfico potencialmente disruptivo. Esta herramienta, en cambio, responde a la primera pregunta segura:
HTTP/2 sobre TLS se anuncia mediante el identificador ALPN h2 definido por RFC 9113. Google recomienda verificar o parchear todo servidor, proxy y balanceador de carga compatible con HTTP/2 en la ruta de la petición; consulte su guía sobre CVE-2023-44487.
No se necesita Go para ejecutar la herramienta. Descargue el archivo comprimido para su plataforma desde la última versión de GitHub:
| Plataforma | Recurso de la versión |
|---|---|
| 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 |
Extraiga el archivo y, a continuación, ejecute rapid-reset-check --version. En Windows, el ejecutable se llama rapid-reset-check.exe.
Cada versión incluye SHA256SUMS. En Linux, verifique un archivo descargado desde el mismo directorio con:
sha256sum --ignore-missing --check SHA256SUMS
En macOS, compare shasum -a 256 <archive> con la línea correspondiente en SHA256SUMS. Los archivos publicados en versiones públicas también reciben una attestation de artefacto de GitHub, que puede comprobarse con la GitHub CLI:
gh attestation verify <archive> --repo ramonzx6/http-script-json
No se requiere instalación de Node.js, cURL, nghttp2 ni WHOIS.
go test ./...
go build -o rapid-reset-check ./cmd/rapid-reset-check
Las compilaciones desde el código fuente muestran dev en --version; las compilaciones de lanzamiento reciben su versión de la etiqueta de la versión.
Escaneé únicamente endpoints que usted posee o está autorizado a evaluar.
Escaneé uno o más endpoints públicos:
./rapid-reset-check example.com api.example.com:8443
Los nombres de host simples se normalizan a HTTPS en el puerto 443. También se aceptan URLs HTTPS únicamente con autoridad:
./rapid-reset-check https://example.com https://api.example.com:8443
Escaneé la lista de objetivos JSON del repositorio:
./rapid-reset-check --input json/urls.json
Use la entrada estándar para automatización:
printf '["example.com", "api.example.com"]' | ./rapid-reset-check --input -
Ejecute ./rapid-reset-check --help para ver todos los límites y opciones de salida.
--input acepta el formato original de array JSON:
[
"example.com",
"api.example.com:8443",
"https://www.example.net"
]
También se admiten las formas de objeto {"urls": [...]} y {"targets": [...]}. Los objetivos posicionales y --input son intencionadamente mutuamente excluyentes. Los endpoints normalizados duplicados se escanean una sola vez, y cada ejecución está limitada a 4.096 objetivos de entrada.
Solo los endpoints HTTPS están dentro del alcance. Las credenciales, rutas no raíz, consultas, fragmentos, esquemas no admitidos, puertos malformados y nombres de host ambiguos se rechazan en lugar de reescribirse silenciosamente.
| Evaluación | Significado |
|---|---|
h2_observed_review_required | Al menos un peer TLS verificado seleccionó h2. Revise cada componente HTTP/2 en esa ruta; esto no es un veredicto de vulnerabilidad. |
h2_not_observed_on_tested_path | Cada dirección seleccionada completó un handshake verificado sin seleccionar h2. Esta es una observación puntual de la ruta, no una garantía de seguridad. |
indeterminate | Un problema de DNS, conexión, tiempo de espera, TLS, certificado o límite de direcciones impidió una observación completa. |
not_scanned_policy | Las direcciones resueltas fueron excluidas por la política de seguridad de red del escáner. |
invalid_target | La entrada estaba malformada o fuera del alcance de autoridad HTTPS admitido. |
El informe incluye cada dirección resuelta probada, ALPN negociado, versión y cifrado TLS, datos limitados de identidad/validez del certificado, tiempos, decisiones de política, conteos de direcciones omitidas, un indicador explícito de completitud y un resumen. No recopila cuerpos de respuesta, cabeceras de respuesta, cookies ni certificados sin procesar.
--ca-file para agregar una CA privada; no existe un modo de verificación inseguro.--allow-private solo para endpoints internos que esté autorizado a evaluar.Opciones de ejemplo:
./rapid-reset-check \
--format json \
--timeout 5s \
--concurrency 4 \
--max-addresses 8 \
example.com > report.json
Para un endpoint autorizado con PKI privada:
./rapid-reset-check \
--allow-private \
--ca-file ./internal-root-ca.pem \
service.internal:8443
El código de salida 0 significa que cada objetivo produjo una observación ALPN completa. El código de salida 1 significa que al menos un objetivo fue inválido, bloqueado por política o indeterminado; el informe aún se escribe. Los errores de uso y configuración de CLI devuelven 2. Observar h2 no cambia por sí solo el código de salida porque es una señal de inventario, no un veredicto de vulnerabilidad.
Para cada resultado h2_observed_review_required:
Los resultados son específicos del nombre de host, las respuestas DNS, la ruta de red, el endpoint TLS y el momento del escaneo. Las CDN, el anycast, el DNS split-horizon, el balanceo de carga, los puertos alternativos y las direcciones no probadas pueden producir resultados diferentes. El escáner no:
h2c), QUIC/HTTP/3, redirecciones, origins ocultos detrás de un borde ni servicios no HTTPS;Server falsificables ni huellas de CDN;gofmt -w ./cmd ./internal
go vet ./...
go test ./...
go test -race ./...
go build ./...
La suite de pruebas utiliza fixtures TLS locales y no escanea servicios públicos.
Release Please gestiona las versiones de lanzamiento y las etiquetas vX.Y.Z a partir de los mensajes de Conventional Commits. El desarrollo normal no requiere crear ni enviar etiquetas:
main hacen que Release Please abra o actualice un PR de lanzamiento que contiene los cambios de versión y changelog.Use fix: para cambios de parche, feat: para cambios menores y un marcador de cambio disruptivo (!) o un pie de página BREAKING CHANGE: para cambios mayores. Los mantenedores deben habilitar Settings > Actions > General > Workflow permissions > Allow GitHub Actions to create and approve pull requests una vez para que Release Please gestione su PR.
Si la publicación de recursos falla después de que Release Please cree una etiqueta, el lanzamiento permanece como draft. Vuelva a ejecutar manualmente el flujo de trabajo Release con esa etiqueta vX.Y.Z existente después de corregir el fallo. No cree ni envíe una etiqueta de reemplazo.