
Sliver HTTP(S) C2 PNG-Bomben-DoS-Exploit — GHSA-663m-7x7m-g4fw (CVE-2026-77622)
Denial-of-Service-Exploit für den HTTP(S)-Listener von Sliver C2. Er brute-forct den PNG-Encoding-Nonce pro Session und liefert eine Dekompressionsbombe aus, die den Serverspeicher erschöpft.
Veröffentlicht als GHSA-663m-7x7m-g4fw.
Der HTTP(S)-C2-Kanal von Sliver verpackt Nachrichten in PNG-Bildern. Jeder Session wird ein zufälliger Nonce im Bereich [1, 65537) zugewiesen, und der Server dekodiert PNG-Daten nur aus Anfragen, deren ?n=-Query-Parameter mit dem Nonce der Session übereinstimmt. Dies ist ein Routing-Mechanismus, keine Authentifizierungsprüfung — der Schlüsselraum beträgt 16 Bit.
Der Server dekodiert das PNG mit Go's image.Decode(), das width × height × bytes_per_pixel im Speicher allokiert. Eine PNG-Datei mit deklarierten Abmessungen von 32767×32767 RGBA komprimiert auf etwa 3 KB in der Übertragung, dekomprimiert aber auf über 4 GB im Speicher. Der Server legt keine Begrenzung für dekodierte Abmessungen fest.
Der Exploit funktioniert in drei Phasen:
Sliver-C2-Versionen vor dem Fix, auf den in GHSA-663m-7x7m-g4fw verwiesen wird. Jeder Sliver-Server mit einem HTTP- oder HTTPS-Listener ist exponiert.
go build -o pngboomer
Keine externen Abhängigkeiten. Nur Standardbibliothek.
./pngboomer -url http://target:8080/ [Optionen]
| Flag | Standard | Beschreibung |
|---|---|---|
-url | http://127.0.0.1:8080/ | Sliver-HTTP-C2-Basis-URL |
-workers | 8 | Scan-Konkurrenz |
-probe-w | 2000 | Probe-PNG-Breite |
-probe-h | 2000 | Probe-PNG-Höhe |
-probe-color | 2 | Probe-Farbtyp (2=RGB, 6=RGBA) |
-kill-w | 32767 | Kill-PNG-Breite |
-kill-h | 32767 | Kill-PNG-Höhe |
-kill-color | 6 | Kill-Farbtyp (2=RGB, 6=RGBA) |
-threshold-ms | 50 | Mindest-Antwortzeit-Untergrenze für die Nonce-Erkennung |
-outlier-mult | 15.0 | Adaptiver Schwellenwert = Basis-p99 × dies |
-calibrate | 16 | Anzahl der Kalibrierungsproben |
-verify | 3 | Anzahl der erneuten Probes pro Kandidaten-Nonce |
-max-nonce | 65537 | Obergrenze des Nonce-Bereichs (Sliver-Modul) |
-probe-timeout | 5s | HTTP-Timeout pro Probe |
-kill-timeout | 180s | HTTP-Timeout für die Kill-Anfrage |
-target-cap-mb | 10240 | Deklarierte Speicherobergrenze des Ziels (Sicherheitsprüfung) |
-nonce | 0 | Scan überspringen, diesen Nonce direkt verwenden |
-scan-only | false | Nonce finden und ausgeben, ohne den Kill zu senden |
-no-confirm | false | TCP-Polling auf Zielausfall nach dem Kill überspringen |
-no-color | false | ANSI-Farbausgabe deaktivieren |
Standard-Scan und Kill gegen ein lokales Docker-Ziel:
./pngboomer -url http://127.0.0.1:8080/ -target-cap-mb 10240
Nur scannen (Nonce finden, ohne zu killen):
./pngboomer -url https://c2.target.com/ -scan-only
Scan überspringen, wenn der Nonce bereits bekannt ist:
./pngboomer -url http://target:8080/ -nonce 41337
Die Kill-Bombe verursacht eine Multi-GB-PNG-Dekodierung auf dem Ziel. Beim Testen den Sliver-Server in einem Docker-Container mit --memory=<N>g ausführen und -target-cap-mb N übergeben, damit das Tool gefährliche Worker-/Probe-Kombinationen ablehnt, die den Speicher des Ziels überschreiten würden.
Das Probe-PNG ist groß genug, dass die Dekodierung messbar länger dauert als die Fast-Path-Ablehnung eines falschen Nonces durch den Server. Der Scan mischt den Nonce-Bereich und verteilt ihn auf Worker-Goroutinen. Jeder Worker sendet das Probe-PNG mit einem Kandidaten-Nonce und misst die Antwortzeit.
Wenn eine Antwort den adaptiven Schwellenwert überschreitet (das Maximum aus -threshold-ms und baseline_p99 × outlier-mult), wird der Kandidat -verify-mal erneut geprobt. Wenn eine Mehrheit der erneuten Probes ebenfalls den Schwellenwert überschreitet, ist der Nonce bestätigt. Wenn nicht, wird der Kandidat auf die Blacklist gesetzt und der Scan fortgesetzt. Bis zu 8 Fehlalarm-"Blips" werden toleriert, bevor der Scan aufgibt.
Bishop Fox über den privaten Advisory-Prozess von GitHub gemeldet. CalebKingan hat den Patch geschrieben.
-silent | false | Nur den entdeckten Nonce auf stdout ausgeben |