
Sliver HTTP(S) C2 PNG bomb DoS exploit — GHSA-663m-7x7m-g4fw (CVE-2026-77622)
Exploit denial-of-service per il listener HTTP(S) di Sliver C2. Forza bruta il nonce di codifica PNG per-sessione e consegna una bomba di decompressione che esaurisce la memoria del server.
Pubblicato come GHSA-663m-7x7m-g4fw.
Il canale C2 HTTP(S) di Sliver avvolge i messaggi all'interno di immagini PNG. A ogni sessione viene assegnato un nonce casuale nell'intervallo [1, 65537) e il server decodifica i dati PNG solo dalle richieste il cui parametro di query ?n= corrisponde al nonce della sessione. Questo è un meccanismo di routing, non un controllo di autenticazione — lo spazio delle chiavi è di 16 bit.
Il server decodifica il PNG con image.Decode() di Go, che alloca larghezza × altezza × byte_per_pixel in memoria. Un file PNG con dimensioni dichiarate di 32767×32767 RGBA si comprime a circa 3 KB sul wire ma si decompressa a oltre 4 GB in memoria. Il server non impone alcun limite alle dimensioni decodificate.
L'exploit funziona in tre fasi:
Versioni di Sliver C2 precedenti alla correzione referenziata in GHSA-663m-7x7m-g4fw. Qualsiasi server Sliver che esegue un listener HTTP o HTTPS è esposto.
go build -o pngboomer
Nessuna dipendenza esterna. Solo libreria standard.
./pngboomer -url http://target:8080/ [options]
| Flag | Default | Descrizione |
|---|---|---|
-url | http://127.0.0.1:8080/ | URL base HTTP C2 di Sliver |
-workers | 8 | Concorrenza della scansione |
-probe-w | 2000 | Larghezza PNG di prova |
-probe-h | 2000 | Altezza PNG di prova |
-probe-color | 2 | Tipo di colore della sonda (2=RGB, 6=RGBA) |
-kill-w | 32767 | Larghezza PNG di kill |
-kill-h | 32767 | Altezza PNG di kill |
-kill-color | 6 | Tipo di colore di kill (2=RGB, 6=RGBA) |
-threshold-ms | 50 | Tempo di risposta minimo per la rilevazione del nonce |
-outlier-mult | 15.0 | Soglia adattiva = p99 di base × questo |
-calibrate | 16 | Numero di campioni di calibrazione |
-verify | 3 | Conteggio ri-sonde per nonce candidato |
-max-nonce | 65537 | Limite superiore dell'intervallo nonce (modulo Sliver) |
-probe-timeout | 5s | Timeout HTTP per singola sonda |
-kill-timeout | 180s | Timeout HTTP per richiesta di kill |
-target-cap-mb | 10240 | Limite di memoria dichiarato del target (controllo di sicurezza) |
-nonce | 0 | Salta la scansione, usa direttamente questo nonce |
-scan-only | false | Trova il nonce e stampalo senza inviare il kill |
-no-confirm | false | Salta il polling TCP per la morte del target dopo il kill |
Scansione e kill predefiniti contro un target Docker locale:
./pngboomer -url http://127.0.0.1:8080/ -target-cap-mb 10240
Solo scansione (trova il nonce senza uccidere):
./pngboomer -url https://c2.target.com/ -scan-only
Salta la scansione quando conosci già il nonce:
./pngboomer -url http://target:8080/ -nonce 41337
La bomba di kill causa una decodifica PNG multi-GB sul target. Durante i test, esegui il server Sliver all'interno di un container Docker con --memory=<N>g e passa -target-cap-mb N così lo strumento rifiuta combinazioni pericolose di worker/sonda che supererebbero la memoria del target.
Il PNG di prova è abbastanza grande che la sua decodifica richieda un tempo misurabilmente maggiore rispetto al rifiuto rapido di un nonce errato da parte del server. La scansione mescola l'intervallo di nonce e lo distribuisce tra goroutine worker. Ogni worker invia il PNG di prova con un nonce candidato e misura il tempo di risposta.
Quando una risposta supera la soglia adattiva (il maggiore tra -threshold-ms e baseline_p99 × outlier-mult), il candidato viene ri-sondato -verify volte. Se la maggioranza delle ri-sonde supera anch'essa la soglia, il nonce è confermato. In caso contrario, il candidato viene inserito nella blacklist e la scansione continua. Fino a 8 "blip" di falsi positivi vengono tollerati prima che la scansione si arrenda.
Segnalato a Bishop Fox tramite il processo di advisory privato di GitHub. CalebKingan ha scritto la patch.
-no-color| false |
| Disabilita l'output colore ANSI |
-silent | false | Stampa solo il nonce scoperto su stdout |