
Sliver HTTP(S) C2 PNG bomb DoS exploit — GHSA-663m-7x7m-g4fw (CVE-2026-77622)
Exploit de déni de service pour l'écouteur HTTP(S) de Sliver C2. Force brute le nonce d'encodage PNG par session et envoie une bombe de décompression qui épuise la mémoire du serveur.
Publié sous GHSA-663m-7x7m-g4fw.
Le canal C2 HTTP(S) de Sliver encapsule les messages dans des images PNG. Chaque session se voit attribuer un nonce aléatoire dans la plage [1, 65537), et le serveur ne décode les données PNG que des requêtes dont le paramètre de requête ?n= correspond au nonce de la session. Il s'agit d'un mécanisme de routage, pas d'un contrôle d'authentification — l'espace de clés est de 16 bits.
Le serveur décode le PNG avec image.Decode() de Go, qui alloue largeur × hauteur × octets_par_pixel en mémoire. Un fichier PNG avec des dimensions déclarées de 32767×32767 en RGBA se compresse à environ 3 Ko sur le fil mais se décompresse à plus de 4 Go en mémoire. Le serveur n'impose aucune limite sur les dimensions décodées.
L'exploit fonctionne en trois phases :
Versions de Sliver C2 antérieures au correctif référencé dans GHSA-663m-7x7m-g4fw. Tout serveur Sliver exécutant un écouteur HTTP ou HTTPS est exposé.
go build -o pngboomer
Aucune dépendance externe. Bibliothèque standard uniquement.
./pngboomer -url http://cible:8080/ [options]
| Indicateur | Défaut | Description |
|---|---|---|
-url | http://127.0.0.1:8080/ | URL de base C2 HTTP de Sliver |
-workers | 8 | Concurrence du scan |
-probe-w | 2000 | Largeur du PNG sonde |
-probe-h | 2000 | Hauteur du PNG sonde |
-probe-color | 2 | Type de couleur de la sonde (2=RGB, 6=RGBA) |
-kill-w | 32767 | Largeur du PNG de destruction |
-kill-h | 32767 | Hauteur du PNG de destruction |
-kill-color | 6 | Type de couleur de destruction (2=RGB, 6=RGBA) |
-threshold-ms | 50 | Plancher de temps de réponse minimum pour la détection du nonce |
-outlier-mult | 15.0 | Seuil adaptatif = p99 de référence × ceci |
-calibrate | 16 | Nombre d'échantillons de calibration |
-verify | 3 | Nombre de re-sondages par nonce candidat |
-max-nonce | 65537 | Sommet de la plage de nonces (modulo Sliver) |
-probe-timeout | 5s | Délai d'expiration HTTP par sonde |
-kill-timeout | 180s | Délai d'expiration HTTP de la requête de destruction |
-target-cap-mb | 10240 | Plafond mémoire cible déclaré (contrôle de sécurité) |
-nonce | 0 | Ignorer le scan, utiliser ce nonce directement |
-scan-only | false | Trouver le nonce et l'afficher sans envoyer la destruction |
-no-confirm | false | Ignorer le sondage TCP pour la mort de la cible après la destruction |
Scan et destruction par défaut contre une cible Docker locale :
./pngboomer -url http://127.0.0.1:8080/ -target-cap-mb 10240
Scan uniquement (trouver le nonce sans tuer) :
./pngboomer -url https://c2.cible.com/ -scan-only
Ignorer le scan lorsque vous connaissez déjà le nonce :
./pngboomer -url http://cible:8080/ -nonce 41337
La bombe de destruction provoque un décodage PNG de plusieurs Go sur la cible. Lors des tests, exécutez le serveur Sliver dans un conteneur Docker avec --memory=<N>g et passez -target-cap-mb N afin que l'outil refuse les combinaisons dangereuses de workers/sondes qui dépasseraient la mémoire de la cible.
Le PNG sonde est suffisamment grand pour que son décodage prenne nettement plus de temps que le rejet rapide d'un mauvais nonce par le serveur. Le scan mélange la plage de nonces et la répartit entre les goroutines de travail. Chaque travailleur envoie le PNG sonde avec un nonce candidat et mesure le temps de réponse.
Lorsqu'une réponse dépasse le seuil adaptatif (le plus élevé entre -threshold-ms et p99_de_référence × outlier-mult), le candidat est re-sondé -verify fois. Si une majorité de re-sondages dépasse également le seuil, le nonce est confirmé. Sinon, le candidat est mis sur liste noire et le scan continue. Jusqu'à 8 « blips » de faux positifs sont tolérés avant que le scan n'abandonne.
Signalé à Bishop Fox via le processus d'avis privé de GitHub. CalebKingan a écrit le correctif.
-no-color | false | Désactiver la sortie couleur ANSI |
-silent | false | Afficher uniquement le nonce découvert sur stdout |