Kai Ole Hartwig
6 Min. Lesezeit
Kritisch

SGLang CVE-2026-93088: Pickle-Deserialisierung im DiffusionServer erlaubt unauthentifizierte Remote Code Execution — noch kein Fix

Am 22. September 2026 wurde CVE-2026-93088 veröffentlicht (CVSS 9.8, kritisch). Der DiffusionServer im Multimodal-Runtime von SGLang bindet einen unauthentifizierten ZeroMQ-ROUTER-Socket an eine Netzwerkschnittstelle und übergibt den letzten Frame eingehender Multipart-Nachrichten ungeprüft an pickle.loads(). Betroffen sind die Versionen 0.5.11 bis 0.5.14. Ein offizieller Fix stand zum Zeitpunkt dieses Beitrags noch aus.

TL;DR — 90 Sekunden

SGLang, ein verbreitetes Open-Source-Serving-Framework für LLM- und Diffusionsmodelle, hat mit CVE-2026-93088 (CVSS 9.8, kritisch) eine unauthentifizierte Remote-Code-Execution-Lücke im DiffusionServer der Disaggregated-Diffusion-Orchestrierung. Ein ZeroMQ-ROUTER-Socket bindet ohne Authentifizierung an eine Netzwerkschnittstelle und deserialisiert eingehende Nachrichten direkt mit pickle.loads() — ein klassisches Einfallstor für beliebigen Code. Betroffen: Versionen 0.5.11 bis 0.5.14. Ein offizieller Patch war zum Redaktionsschluss (24. September 2026) noch nicht veröffentlicht. Wer SGLang im Disaggregated-Modus für Multimodal- oder Diffusion-Serving betreibt, sollte den betroffenen Port sofort vom Netz isolieren.

Was ist das Problem?

SGLang trennt bei verteiltem Inferencing die Arbeitsschritte häufig auf mehrere Prozesse oder Knoten auf: ein Encode-/Prefill-Schritt, ein Decode-Schritt und, für Multimodal- und Diffusionsmodelle, ein separater DiffusionServer-Prozess. Diese Komponenten tauschen Zwischenergebnisse über ZeroMQ-Sockets aus, statt über eine authentifizierte HTTP-API.

Der DiffusionServer öffnet dafür einen ZeroMQ-ROUTER-Socket, der an eine Netzwerkschnittstelle bindet, ohne die Herkunft eingehender Verbindungen zu prüfen. Trifft eine Multipart-Nachricht ein, übergibt der Server deren letzten Frame direkt an pickle.loads() — ohne Validierung, ohne Schema-Prüfung, ohne Authentifizierung. Python-Pickle-Daten können beliebige Objekte inklusive ausführbarem Code enthalten; ein präpariertes Payload mit einer __reduce__-Methode reicht aus, um beim Deserialisieren beliebige Shell-Kommandos auszuführen.

Das Muster ist bei SGLang kein Einzelfall: Bereits im März 2026 hatte CERT/CC unter VU#665416 zwei verwandte Lücken (CVE-2026-3059, CVE-2026-3060) in den generischen Disaggregated-Serving-Pfaden von SGLang dokumentiert (encode_receiver.py, shm_broadcast.py) — mit demselben Grundfehler: ungeprüfte pickle.loads()-Aufrufe auf Daten aus dem Netzwerk. CVE-2026-93088 zeigt, dass dasselbe Architekturmuster auch im neueren Diffusion-Pfad wiederkehrt.

Wer ist betroffen?

CVEKomponenteBetroffenFixCVSS
CVE-2026-93088DiffusionServer (Disaggregated-Diffusion-Orchestrierung)0.5.11 – 0.5.14noch kein Fix veröffentlicht (Stand 24.09.2026)9.8 (kritisch)
CVE-2026-3059 / CVE-2026-3060 (Referenz, März 2026)encode_receiver.py, shm_broadcast.py (generisches Disaggregated Serving)Hauptzweig zum Zeitpunkt der Meldungsiehe Projekt-Repository9.8 (kritisch)

Betroffen sind ausschließlich Installationen, die SGLang im Disaggregated-Modus für Multimodal- oder Diffusion-Serving einsetzen und den DiffusionServer-Prozess über ein Netzwerk erreichbar machen — etwa in Multi-Node-Clustern für Bild- oder Video-Generierung. Reine Single-Node-Deployments ohne Diffusion-Orchestrierung sind von CVE-2026-93088 nicht betroffen, sollten aber die verwandten Lücken aus dem generischen Disaggregated-Pfad prüfen.

Auswirkungen

Ein Angreifer mit Netzwerkzugriff auf den ZeroMQ-Port des DiffusionServer kann ohne Authentifizierung und ohne Interaktion eines Nutzers beliebigen Code mit den Rechten des SGLang-Prozesses ausführen. Das betrifft in der Praxis oft GPU-Worker-Knoten mit Zugriff auf Modellgewichte, interne Netzwerksegmente und häufig auch Cloud-Metadaten-Endpunkte. Vertraulichkeit, Integrität und Verfügbarkeit sind vollständig kompromittiert (CVSS 9.8). Da die Portinformationen in Disaggregated-Setups teils unverschlüsselt zwischen den Knoten ausgetauscht werden, ist der verwundbare Endpunkt für einen Angreifer im selben Netzwerksegment mit einfachem Port-Scanning auffindbar.

Mitigation / Sofortmaßnahmen

Ein offizieller Fix für CVE-2026-93088 lag zum Zeitpunkt dieses Beitrags (24. September 2026) noch nicht vor. Bis ein Patch verfügbar ist, gilt: den DiffusionServer-Port ausschließlich intern erreichbar machen und niemals an 0.0.0.0 binden.

 

# DiffusionServer nur an ein internes Interface binden, nicht an alle Interfaces
python -m sglang.srt.disaggregation.diffusion_server --host 10.0.30.5 --port 5757

# Firewall: ZeroMQ-Port nur für die eigenen Inferenz-Knoten freigeben (Beispiel iptables)
iptables -A INPUT -p tcp --dport 5757 -s 10.0.30.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 5757 -j DROP

# In Kubernetes/K3s: NetworkPolicy statt offenem Service
kubectl apply -f - <<'EOF'
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: sglang-diffusionserver-restrict
spec:
  podSelector:
    matchLabels:
      app: sglang-diffusionserver
  policyTypes: [Ingress]
  ingress:
  - from:
    - podSelector:
        matchLabels:
          role: sglang-worker
    ports:
    - protocol: TCP
      port: 5757
EOF

 

Zusätzlich empfehlen sich: das Verteilen von Inferenz-Traffic ausschließlich über private Netzwerke oder VPN-Tunnel zwischen Knoten, das Deaktivieren des Diffusion-Orchestrierungspfads, sofern er nicht produktiv genutzt wird, sowie ein Downgrade auf eine Konfiguration ohne Disaggregated-Diffusion-Modus, falls betrieblich vertretbar. Ein Wechsel von pickle auf ein sicheres Serialisierungsformat wie MessagePack ist die langfristig korrekte Lösung, aber Sache des SGLang-Projekts — bis dahin bleibt Netzwerkisolation der wirksamste Hebel.

Detection / Prüfung

Prüfen Sie zunächst, ob DiffusionServer-Prozesse überhaupt an öffentlich oder breit erreichbaren Interfaces lauschen:

 

# Offene ZeroMQ-Ports auf SGLang-Knoten identifizieren
ss -tulpn | grep -i python
nmap -p 5000-6000 <interner-IP-Bereich>

# Prozessliste auf ungewöhnliche Kindprozesse von SGLang-Workern prüfen
ps --forest -C python3

 

Werten Sie Netzwerk- und Prozess-Logs auf folgende Indikatoren aus: eingehende ZeroMQ-Verbindungen von IP-Adressen außerhalb des eigenen Cluster-Netzes, unerwartete Subprozesse, die vom SGLang-Serving-Prozess gestartet wurden (insbesondere Shell-Aufrufe), sowie Abstürze oder Neustarts des DiffusionServer-Prozesses ohne erkennbaren Auslöser — ein typisches Muster bei fehlgeschlagenen Exploit-Versuchen mit inkompatiblen Payloads.

Betreiberempfehlung

Akut handeln, wenn: Sie SGLang 0.5.11 bis 0.5.14 im Disaggregated-Diffusion-Modus betreiben und der DiffusionServer-Port von außerhalb des eigenen Inferenz-Clusters erreichbar ist. Isolieren Sie den Port sofort per Firewall oder NetworkPolicy und beobachten Sie die Projekt-Repository-Advisories für einen Fix.

Beobachten genügt, wenn: Sie SGLang ausschließlich im Single-Node-Betrieb ohne Diffusion-Orchestrierung einsetzen oder Ihre Inferenz-Knoten bereits konsequent in einem isolierten, nicht von außen erreichbaren Netzwerksegment laufen. Ein Update auf eine gepatchte Version bleibt dennoch Pflicht, sobald sie erscheint.

Häufig gestellte Fragen zu CVE-2026-93088

Gibt es bereits einen Patch für CVE-2026-93088?+

Nein, zum Zeitpunkt dieses Beitrags (24. September 2026) war kein offizieller Fix veröffentlicht. Die einzig wirksame Gegenmaßnahme ist, den betroffenen Netzwerk-Port zu isolieren.

Is there a patch for CVE-2026-93088 yet?+

No. As of this writing (September 24, 2026) no official fix had been published. The only effective countermeasure is to isolate the affected network port.

Is every SGLang installation affected?+

No. Only installations running disaggregated-diffusion mode with a network-reachable DiffusionServer process, on versions 0.5.11 through 0.5.14, are affected.

How does CVE-2026-93088 differ from CVE-2026-3059/3060?+

All three share the same root cause: unchecked pickle.loads() calls on network data. They affect different components. CVE-2026-3059/3060 hit the generic disaggregated-serving path (encode_receiver.py, shm_broadcast.py); CVE-2026-93088 hits the DiffusionServer used for multimodal and diffusion workloads specifically.

Is a firewall rule a permanent fix?+

As an immediate measure, yes. As a permanent one, no. Network isolation shrinks the attack surface but does not fix the insecure deserialization in the code itself. Apply the patch promptly once one ships.

What systems are at risk from a successful exploit?+

In practice, usually GPU worker nodes with access to model weights and internal network segments. An attacker gains code execution with the privileges of the SGLang process, which can serve as a foothold for lateral movement in the cluster.

Why use ZeroMQ instead of an authenticated API?+

ZeroMQ offers low latency for exchanging large tensor and intermediate data between inference nodes. That performance advantage comes at the cost of built-in security, since ZeroMQ itself does not enforce authentication — that has to be implemented explicitly, for example via CurveZMQ.

Ist jede SGLang-Installation betroffen?+

Nein. Betroffen sind nur Installationen, die den Disaggregated-Diffusion-Modus mit einem netzwerkseitig erreichbaren DiffusionServer-Prozess einsetzen, in den Versionen 0.5.11 bis 0.5.14.

Wie unterscheidet sich CVE-2026-93088 von CVE-2026-3059/3060?+

Alle drei Lücken teilen denselben Grundfehler — ungeprüfte pickle.loads()-Aufrufe auf Netzwerkdaten —, betreffen aber unterschiedliche Komponenten: CVE-2026-3059/3060 den generischen Disaggregated-Serving-Pfad (encode_receiver.py, shm_broadcast.py), CVE-2026-93088 speziell den DiffusionServer für Multimodal-/Diffusion-Workloads.

Reicht eine Firewall-Regel als dauerhafte Lösung?+

Als Sofortmaßnahme ja, als Dauerlösung nein. Netzwerkisolation reduziert die Angriffsfläche, behebt aber nicht die unsichere Deserialisierung im Code. Sobald ein Patch verfügbar ist, sollte er zeitnah eingespielt werden.

Welche Systeme sind durch eine erfolgreiche Ausnutzung gefährdet?+

In der Praxis meist GPU-Worker-Knoten mit Zugriff auf Modellgewichte und interne Netzwerksegmente. Ein Angreifer erhält Codeausführung mit den Rechten des SGLang-Prozesses und damit potenziell einen Ausgangspunkt für laterale Bewegung im Cluster.

Warum wird ZeroMQ statt einer authentifizierten API verwendet?+

ZeroMQ bietet niedrige Latenz für den Austausch großer Tensor- und Zwischendaten zwischen Inferenz-Knoten. Der Performance-Vorteil geht hier auf Kosten der Absicherung, da ZeroMQ selbst keine Authentifizierung erzwingt — diese muss explizit implementiert werden (z. B. via CurveZMQ).

Fazit

CVE-2026-93088 reiht sich in ein wiederkehrendes Muster bei SGLang ein: verteilte Serving-Architekturen tauschen Daten über ZeroMQ aus und deserialisieren sie ungeprüft mit pickle. Für Betreiber von selbst gehosteten LLM- und Diffusion-Serving-Stacks bedeutet das, Inferenz-Cluster grundsätzlich wie internes, nicht vertrauenswürdiges Netzwerk zu behandeln und niemals ungeprüft ans offene Netz zu binden — unabhängig davon, ob gerade ein CVE aktiv ist oder nicht.

Quellen

Ich härte selbst gehostete LLM- und Diffusion-Serving-Stacks für Kunden ab, von der Netzwerksegmentierung bis zur laufenden CVE-Beobachtung.

Absicherung von Inferenz-Clustern, Netzwerkisolation für verteilte Serving-Komponenten, laufendes Vulnerability-Monitoring für AI-Infrastruktur.

Plattform-Betrieb statt Beratung auf Papier: Ich prüfe, patche und härte Ihre Infrastruktur laufend.

Über den Autor