
CLI en Go qui inventorie les points de terminaison HTTPS négociant HTTP/2 via ALPN afin d'identifier les systèmes nécessitant une revue d'atténuation de CVE-2023-44487. Vérifications TLS non exploitantes, avec vérification de certificat et des paramètres par défaut sûrs.
rapid-reset-check est un petit outil CLI en Go permettant d'inventorier rapidement les points de terminaison HTTPS qui exposent HTTP/2 et nécessitent donc une revue de l'atténuation de la CVE-2023-44487.
Le scanner n'exploite délibérément pas la vulnérabilité. Il résout chaque cible, ouvre une connexion TLS dont le certificat est vérifié, propose h2 et http/1.1 via ALPN, enregistre ce que le pair sélectionne, puis ferme la connexion. Il n'envoie aucune requête HTTP, préface de connexion HTTP/2, flux, trame RST_STREAM ni trafic d'inondation.
[!IMPORTANT] La négociation de
h2est une observation d'exposition, pas une preuve qu'un service est vulnérable ou non corrigé. Une poignée de main distante ne peut pas vérifier les limites Rapid Reset d'une implémentation HTTP/2, son niveau de correctifs, son origine en amont ou ses contrôles anti-DDoS.
La CVE-2023-44487 est une technique de déni de service qui abuse de la création et de l'annulation rapides de flux HTTP/2. Tenter de prouver la condition contre un service en production nécessiterait lui-même un trafic potentiellement perturbateur. Cet outil répond plutôt à la première question sûre :
HTTP/2 sur TLS est annoncé à l'aide de l'identifiant ALPN h2 défini par la RFC 9113. Google recommande de vérifier ou de corriger chaque serveur, proxy et équilibreur de charge compatible HTTP/2 dans le chemin de la requête ; voir ses recommandations sur la CVE-2023-44487.
Go n'est pas requis pour exécuter l'outil. Téléchargez l'archive pour votre plateforme depuis la dernière release GitHub :
| Plateforme | Asset de 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 |
Extrayez l'archive, puis exécutez rapid-reset-check --version. Sur Windows, l'exécutable s'appelle rapid-reset-check.exe.
Chaque release inclut SHA256SUMS. Sous Linux, vérifiez une archive téléchargée depuis le même répertoire avec :
sha256sum --ignore-missing --check SHA256SUMS
Sous macOS, comparez shasum -a 256 <archive> avec la ligne correspondante dans SHA256SUMS. Les archives publiées d'une release publique reçoivent également une attestation d'artefact GitHub, vérifiable avec la GitHub CLI :
gh attestation verify <archive> --repo ramonzx6/http-script-json
Aucune installation de Node.js, cURL, nghttp2 ou WHOIS n'est requise.
go test ./...
go build -o rapid-reset-check ./cmd/rapid-reset-check
Les compilations depuis les sources indiquent dev via --version ; les compilations de release reçoivent leur version du tag de release.
Ne scannez que des points de terminaison dont vous êtes propriétaire ou que vous êtes autorisé à évaluer.
Scannez un ou plusieurs points de terminaison publics :
./rapid-reset-check example.com api.example.com:8443
Les noms d'hôtes nus sont normalisés en HTTPS sur le port 443. Les URL HTTPS ne contenant que l'autorité sont également acceptées :
./rapid-reset-check https://example.com https://api.example.com:8443
Scannez la liste de cibles JSON du dépôt :
./rapid-reset-check --input json/urls.json
Utilisez l'entrée standard pour l'automatisation :
printf '["example.com", "api.example.com"]' | ./rapid-reset-check --input -
Exécutez ./rapid-reset-check --help pour connaître toutes les limites et options de sortie.
--input accepte le format original de tableau JSON :
[
"example.com",
"api.example.com:8443",
"https://www.example.net"
]
Les formes objet {"urls": [...]} et {"targets": [...]} sont également prises en charge. Les cibles positionnelles et --input sont intentionnellement mutuellement exclusifs. Les points de terminaison normalisés en double sont scannés une seule fois, et chaque exécution est limitée à 4 096 cibles en entrée.
Seuls les points de terminaison HTTPS sont dans le périmètre. Les identifiants, chemins non racines, requêtes, fragments, schémas non pris en charge, ports malformés et noms d'hôtes ambigus sont rejetés plutôt que réécrits silencieusement.
| Évaluation | Signification |
|---|---|
h2_observed_review_required | Au moins un pair TLS vérifié a sélectionné h2. Examinez chaque composant HTTP/2 de ce chemin ; il ne s'agit pas d'un verdict de vulnérabilité. |
h2_not_observed_on_tested_path | Chaque adresse sélectionnée a effectué une poignée de main vérifiée sans sélectionner h2. Il s'agit d'une observation de chemin à un instant donné, pas d'une garantie de sécurité. |
indeterminate | Un problème de DNS, de connexion, de délai d'attente, de TLS, de certificat ou de limite d'adresses a empêché une observation complète. |
not_scanned_policy | Les adresses résolues ont été exclues par la politique de sécurité réseau du scanner. |
invalid_target | L'entrée était malformée ou hors du périmètre d'autorité HTTPS pris en charge. |
Le rapport inclut chaque adresse résolue testée, l'ALPN négocié, la version et la suite de chiffrement TLS, des données limitées d'identité/validité du certificat, les durées, les décisions de politique, les compteurs d'adresses omises, un indicateur explicite d'exhaustivité et un résumé. Il ne collecte pas les corps de réponse, les en-têtes de réponse, les cookies ni les certificats bruts.
--ca-file pour ajouter une autorité de certification privée ; il n'existe aucun mode de vérification non sécurisé.--allow-private uniquement pour les points de terminaison internes que vous êtes autorisé à évaluer.Exemple d'options :
./rapid-reset-check \
--format json \
--timeout 5s \
--concurrency 4 \
--max-addresses 8 \
example.com > report.json
Pour un point de terminaison à PKI privée autorisé :
./rapid-reset-check \
--allow-private \
--ca-file ./internal-root-ca.pem \
service.internal:8443
Le code de sortie 0 signifie que chaque cible a produit une observation ALPN complète. Le code de sortie 1 signifie qu'au moins une cible était invalide, bloquée par la politique ou indéterminée ; le rapport est tout de même écrit. Les erreurs d'utilisation et de configuration de la CLI retournent 2. Observer h2 ne change pas en soi le code de sortie car il s'agit d'un signal d'inventaire, pas d'un verdict de vulnérabilité.
Pour chaque résultat h2_observed_review_required :
Les résultats sont spécifiques au nom d'hôte, aux réponses DNS, au chemin réseau, au point de terminaison TLS et au moment du scan. Les CDN, l'anycast, le DNS à horizon partagé, l'équilibrage de charge, les ports alternatifs et les adresses non testées peuvent produire des résultats différents. Le scanner ne peut pas :
h2c), QUIC/HTTP/3, les redirections, les origines cachées derrière un edge, ou les services non-HTTPS ;Server usurpables ou d'empreintes CDN ;gofmt -w ./cmd ./internal
go vet ./...
go test ./...
go test -race ./...
go build ./...
La suite de tests utilise des fixtures TLS locales et ne scanne pas de services publics.
Release Please gère les versions de release et les tags vX.Y.Z à partir des messages de Conventional Commit. Le développement normal ne nécessite pas de créer ou de pousser des tags :
main amènent Release Please à ouvrir ou mettre à jour une PR de release contenant la version et les modifications du journal des changements.Utilisez fix: pour les changements correctifs, feat: pour les changements mineurs, et un marqueur de rupture (!) ou un pied de page BREAKING CHANGE: pour les changements majeurs. Les mainteneurs doivent activer une fois Settings > Actions > General > Workflow permissions > Allow GitHub Actions to create and approve pull requests pour permettre à Release Please de gérer sa PR.
Si la publication des assets échoue après que Release Please a créé un tag, la release reste un brouillon. Relancez manuellement le workflow Release avec ce tag vX.Y.Z existant après avoir corrigé le problème. Ne créez pas et ne poussez pas de tag de remplacement.