
CLI in Go che censisce gli endpoint HTTPS che negoziano HTTP/2 tramite ALPN per identificare i sistemi che richiedono una revisione delle mitigazioni per CVE-2023-44487. Controlli TLS non exploitativi, con verifica dei certificati e impostazioni predefinite sicure.
rapid-reset-check è una piccola CLI in Go per inventariare rapidamente gli endpoint HTTPS che espongono HTTP/2 e pertanto richiedono una revisione delle mitigazioni per CVE-2023-44487.
Lo scanner è volutamente inoffensivo: risolve ogni target, apre una connessione TLS con verifica del certificato, offre h2 e http/1.1 tramite ALPN, registra ciò che il peer seleziona e chiude la connessione. Non invia alcuna richiesta HTTP, prefazione di connessione HTTP/2, stream, frame RST_STREAM o traffico flood.
[!IMPORTANT] La negoziazione di
h2è un'osservazione di esposizione, non una prova che un servizio sia vulnerabile o non patchato. Un handshake remoto non può verificare i limiti Rapid Reset di un'implementazione HTTP/2, il livello di patch, l'origine a monte o i controlli DDoS.
CVE-2023-44487 è una tecnica di denial-of-service che abusa della rapida creazione e cancellazione di stream HTTP/2. Tentare di dimostrare la condizione contro un servizio live richiederebbe a sua volta traffico potenzialmente dirompente. Questo strumento risponde invece alla prima domanda sicura:
HTTP/2 su TLS viene pubblicizzato utilizzando l'identificatore ALPN h2 definito da RFC 9113. Google consiglia di verificare o applicare patch a ogni server, proxy e load balancer compatibile con HTTP/2 nel percorso della richiesta; consulta la guida su CVE-2023-44487.
Go non è necessario per eseguire lo strumento. Scarica l'archivio per la tua piattaforma dall'ultima release GitHub:
| Piattaforma | Asset della 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 |
Estrai l'archivio, quindi esegui rapid-reset-check --version. Su Windows, l'eseguibile si chiama rapid-reset-check.exe.
Ogni release include SHA256SUMS. Su Linux, verifica un archivio scaricato dalla stessa directory con:
sha256sum --ignore-missing --check SHA256SUMS
Su macOS, confronta shasum -a 256 <archive> con la riga corrispondente in SHA256SUMS. Gli archivi pubblicati nelle release pubbliche ricevono anche un'attestazione dell'artefatto GitHub, che può essere verificata con la GitHub CLI:
gh attestation verify <archive> --repo ramonzx6/http-script-json
Non è richiesta alcuna installazione di Node.js, cURL, nghttp2 o WHOIS.
go test ./...
go build -o rapid-reset-check ./cmd/rapid-reset-check
Le build dal sorgente riportano dev con --version; le build di release ricevono la loro versione dal tag della release.
Scansiona solo endpoint che possiedi o che sei autorizzato a valutare.
Scansiona uno o più endpoint pubblici:
./rapid-reset-check example.com api.example.com:8443
I nomi host senza schema vengono normalizzati su HTTPS sulla porta 443. Sono accettati anche URL HTTPS con la sola authority:
./rapid-reset-check https://example.com https://api.example.com:8443
Scansiona l'elenco di target JSON del repository:
./rapid-reset-check --input json/urls.json
Usa l'input standard per l'automazione:
printf '["example.com", "api.example.com"]' | ./rapid-reset-check --input -
Esegui ./rapid-reset-check --help per tutti i limiti e le opzioni di output.
--input accetta il formato originale di array JSON:
[
"example.com",
"api.example.com:8443",
"https://www.example.net"
]
Sono supportate anche le forme a oggetto {"urls": [...]} e {"targets": [...]}. I target posizionali e --input sono intenzionalmente mutuamente esclusivi. Gli endpoint normalizzati duplicati vengono scansionati una sola volta e ogni esecuzione è limitata a 4.096 target di input.
Solo gli endpoint HTTPS sono in scope. Credenziali, percorsi non root, query, frammenti, schemi non supportati, porte malformate e nomi host ambigui vengono rifiutati invece di essere riscritti silenziosamente.
| Valutazione | Significato |
|---|---|
h2_observed_review_required | Almeno un peer TLS verificato ha selezionato h2. Esamina ogni componente HTTP/2 in quel percorso; questo non è un verdetto di vulnerabilità. |
h2_not_observed_on_tested_path | Ogni indirizzo selezionato ha completato un handshake verificato senza selezionare h2. Questa è un'osservazione del percorso in un dato momento, non una garanzia di sicurezza. |
indeterminate | Un problema di DNS, connessione, timeout, TLS, certificato o limite di indirizzi ha impedito un'osservazione completa. |
not_scanned_policy | Gli indirizzi risolti sono stati esclusi dalla policy di sicurezza di rete dello scanner. |
invalid_target | L'input era malformato o al di fuori dell'ambito delle authority HTTPS supportate. |
Il report include ogni indirizzo risolto tentato, ALPN negoziato, versione TLS e cipher, dati limitati di identità/validità del certificato, tempistiche, decisioni di policy, conteggi degli indirizzi omessi, un flag esplicito di completezza e un riepilogo. Non raccoglie body di risposta, header di risposta, cookie o certificati grezzi.
--ca-file per aggiungere una CA privata; non esiste una modalità di verifica non sicura.--allow-private solo per endpoint interni che sei autorizzato a valutare.Opzioni di esempio:
./rapid-reset-check \
--format json \
--timeout 5s \
--concurrency 4 \
--max-addresses 8 \
example.com > report.json
Per un endpoint autorizzato con PKI privata:
./rapid-reset-check \
--allow-private \
--ca-file ./internal-root-ca.pem \
service.internal:8443
Il codice di uscita 0 significa che ogni target ha prodotto un'osservazione ALPN completa. Il codice di uscita 1 significa che almeno un target non era valido, è stato bloccato dalla policy o è indeterminato; il report viene comunque scritto. Gli errori di utilizzo della CLI e di configurazione restituiscono 2. Osservare h2 non modifica di per sé il codice di uscita, perché è un segnale di inventario, non un verdetto di vulnerabilità.
Per ogni risultato h2_observed_review_required:
I risultati sono specifici del nome host, delle risposte DNS, del percorso di rete, dell'endpoint TLS e del momento della scansione. CDN, anycast, DNS split-horizon, load balancing, porte alternative e indirizzi non testati possono produrre risultati diversi. Lo scanner non:
h2c), QUIC/HTTP/3, redirect, origini nascoste dietro un edge o servizi non HTTPS;Server falsificabili o fingerprint CDN;gofmt -w ./cmd ./internal
go vet ./...
go test ./...
go test -race ./...
go build ./...
La suite di test utilizza fixture TLS locali e non scansiona servizi pubblici.
Release Please gestisce le versioni delle release e i tag vX.Y.Z dai messaggi dei Conventional Commit. Lo sviluppo normale non richiede la creazione o il push di tag:
main fanno sì che Release Please apra o aggiorni una PR di release contenente la versione e le modifiche al changelog.Usa fix: per le modifiche patch, feat: per le modifiche minori e un indicatore di breaking change (!) o il footer BREAKING CHANGE: per le modifiche maggiori. I maintainer devono abilitare una volta Settings > Actions > General > Workflow permissions > Allow GitHub Actions to create and approve pull requests affinché Release Please possa gestire la sua PR.
Se la pubblicazione degli asset fallisce dopo che Release Please ha creato un tag, la release rimane una bozza. Esegui di nuovo manualmente il workflow Release con quel tag vX.Y.Z esistente dopo aver corretto il problema. Non creare né pushare un tag sostitutivo.