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.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2026-94545-nextjs-og-poc — Isoliertes Docker-Lab und nicht-destruktiver Python-Scanner zur Reproduktion von CVE-2026-94545, der Next.js next/og ImageResponse SVG-Injection, mit verwundbaren vs. gepatchten Kontrollen und PNG-Beweisen auf Pixelebene. | Kitploit
Tools/GitHubGitHub/hassham1/cve-2026-94545-nextjs-og-poc
SchwachstellenscannerSchwachstellenanalyseExploitationWebanwendungs-ExploitationWebsicherheitLabs & Praxis
GitHubhassham1/cve-2026-94545-nextjs-og-poc

CVE-2026-94545-nextjs-og-poc

Isoliertes Docker-Lab und nicht-destruktiver Python-Scanner zur Reproduktion von CVE-2026-94545, der Next.js next/og ImageResponse SVG-Injection, mit verwundbaren vs. gepatchten Kontrollen und PNG-Beweisen auf Pixelebene.

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-94545 - Next.js next/og ImageResponse SVG-Injection (GHSA-vcvr-r3jv-pc5j)

Sicherheitsforschungsmaterial zum Reproduzieren und Validieren von CVE-2026-94545, der Next.js ImageResponse SVG-Serialisierungs-Injection (Upstream: Satori GHSA-wx4j-mvgx-mqwp), in einem isolierten, nur auf Loopback beschränkten Labor.

  • Betroffen: Next.js >=16.2.0 <16.3.6 (nur Node.js ImageResponse)
  • Behoben: 16.3.6 (Satori-Härtung, Commit 26a52aff); 15.5.26 enthält verwandte Härtung, 15.x ist nicht vom RCE-Problem betroffen
  • Schweregrad: Kritisch (Advisory); unsachgemäßes Escaping in Satori -> Angreifer kontrolliert das eingebettete SVG-Dokument; RCE gemäß Advisory hängt vom nachgelagerten SVG-Parser ab
  • Upstream: vercel/satori GHSA-wx4j-mvgx-mqwp

Nur auf Systemen verwenden, die Sie besitzen oder für deren Test Sie ausdrücklich autorisiert sind. Der Scanner ist nicht-destruktiv: Er rendert ein Bild und zählt Pixel. Auf dem Ziel wird nichts geschrieben, gespeichert oder ausgeführt.

Bewertung

Status: im mitgelieferten Labor bewiesen.

Gegen das exakte Routenmuster des Advisories (Angreiferwert in <svg><title>{value}</title></svg>):

root@kitploit:~
next 16.3.5 (verwundbar): injiziertes 500x150 rotes Rechteck in das PNG gerendert
                          (75.000 #FF0000 Pixel in der Antwort gemessen)
next 16.3.6 (gepatcht)   : Wert escaped, 0 rote Pixel
satori 0.25.0 (verwundbar): Payload roh im serialisierten SVG-String vorhanden
satori 0.33.5 (behoben)  : Payload zu &lt;/title&gt; escaped

Dies beweist das Injection-Primitiv Ende-zu-Ende (Serializer -> eingebettetes SVG -> gerasterte Ausgabe). Es demonstriert keine Remote-Code-Ausführung: Das Advisory verknüpft RCE mit dem nachgelagerten SVG-Parser, dessen verwundbare Details zum Zeitpunkt des Schreibens nicht öffentlich sind. Es wird kein Dateilesen, SSRF oder Codeausführung beansprucht.

Ursache (verifiziert gegen den Fix-Commit)

Satori serialisiert <svg>-Knoten mit translateSVGNodeToSVGString() (src/handler/preprocess.ts), das ohne Escaping in die Ausgabe-XML interpolierte:

  1. Textknoten, die über String(node) zurückgegeben wurden - unescaped (jetzt escapeXMLText).
  2. Attributwerte roh innerhalb von Anführungszeichen interpoliert - " bricht aus.
  3. Attributnamen roh interpoliert - Leerzeichen/Anführungszeichen injiziert neue Attribute.
  4. style-Werte roh interpoliert.
  5. Der Encoder für eingebettete SVG-Daten-URLs kodierte & nicht, sodass innere XML- Entities den äußeren SVG-Parse überlebten.
  6. expand.ts übergab interne Style-Eigenschaften (Präfix _) in serialisierte Styles - jetzt abgelehnt.

Der Fix (satori@26a52aff) leitet alles durch ein härtendes buildXMLString(), das Werte escaped und XML-Namen validiert. Dieses Labor verifiziert all dies verhaltensbasiert; die exakte Anfrage und die Pixel-Beweise befinden sich in poc/.

Schnellstart

Voraussetzungen: Docker mit Compose v2, Python 3.10+ auf dem Host (für den Scanner), Netzwerkzugriff auf npm beim ersten Lauf.

root@kitploit:~
./lab verify

Baut die verwundbare App (gebündeltes next/og aus [email protected]), verlangt, dass das Marker-Rechteck in der HTTP-Antwort gerendert wird, dann die gepatchte App ([email protected]) und verlangt dessen Abwesenheit.

Erwartete Beweise

Verwundbare Kontrolle:

root@kitploit:~
[*] #FF0000 pixels: 75000 (threshold 10000)
[!!!] INJECTION CONFIRMED: the attacker value escaped <title> and
      became a rendered SVG element in the generated image.
RESULT: VULNERABLE CONTROL CONFIRMED

Gepatchte Kontrolle:

root@kitploit:~
[*] #FF0000 pixels: 0 (threshold 10000)
[=] no injection observed
RESULT: PATCHED CONTROL CONFIRMED

Manueller Labor-Lebenszyklus

root@kitploit:~
./lab start vulnerable   # 16.3.5 app on http://127.0.0.1:9481/og
./lab test               # assert injection renders
./lab start patched      # 16.3.6 app
./lab test               # assert absence
./lab status
./lab reset

Scanner manuell ausführen (Loopback-Standard; autorisierte externe Ziele benötigen die explizite Überschreibung):

root@kitploit:~
python3 poc/scan.py http://127.0.0.1:9481/og
python3 poc/scan.py https://host.example/og --param value \
  --allow-authorized-non-loopback [--insecure]

Wie die Erkennung funktioniert (und warum sie sicher ist)

Die Payload ist balanciertes XML, das ein 500x150 reinrotes <rect> trägt. Auf einem verwundbaren Endpunkt entkommt der Wert aus <title> und das Rechteck wird ein echtes Element im eingebetteten SVG-Dokument; der Scanner zählt exakte #FF0000- Pixel im zurückgegebenen PNG (75.000 erwartet; Schwelle 10.000). Auf einem gepatchten Endpunkt ist der Wert escapter Text und es wird kein Rot gerendert. Die Probe ändert nichts am Ziel: eine GET-Anfrage, ein Bild-Render.

Beachten Sie, dass der Träger absichtlich ein <rect> ist, kein Text: Text innerhalb des eingebetteten SVG hat im Renderer keine ladbare Schriftart und wäre selbst bei Injektion unsichtbar.

Warum es kein nuclei-Template gibt

Der Beweis dieser Schwachstelle ist der Pixelinhalt eines gerasterten Bildes, und nuclei-Matcher können PNGs nicht dekodieren. Ein Größen-Differenz-Template wurde erstellt und verworfen: Bei einer gepatchten App wird die escapte Payload weiterhin gerendert (als wörtlicher inerter Text), sodass sich die Größen von harmlos vs. Payload auch auf gepatchten Systemen unterscheiden, und die Trennung zwischen verwundbaren und gepatchten Deltas app-spezifisches Kompressionsrauschen ist. Einen Matcher auszuliefern, der auf gepatchten Systemen anschlägt, ist schlimmer, als keinen auszuliefern. Verwenden Sie poc/scan.py; es wertet das Antwortbild exakt aus.

Betroffene und getestete Versionen

VersionBewertung
Next.js 16.3.5 (gebündeltes @vercel/og)Injection Ende-zu-Ende über HTTP reproduziert
Next.js 16.3.6 (gebündeltes @vercel/og)Gepatchte Negativkontrolle reproduziert
satori 0.25.0 (npm)Rohe Injection im serialisierten SVG (Quellcode-Ebene)
satori 0.33.5 (npm, 22. Sep. 2026)Escaped (Quellcode-Ebene)
Next.js 16.2.0-16.3.4Betroffen gemäß Advisory; nicht einzeln getestet
Next.js 15.xNicht vom RCE-Problem betroffen gemäß Hersteller-Blog

Repository-Struktur

root@kitploit:~
.
├── .gitignore
├── LICENSE
├── README.md
├── SECURITY.md
├── docker-compose.yml
├── lab
├── app/
│   └── server.mjs        # advisory route pattern over loopback HTTP
└── poc/
    └── scan.py           # non-destructive scanner (Python stdlib: urllib + zlib)

Nicht committet: assets/ (npm-gepackte next-Tarballs + extrahierte Bundles), node_modules/, .lab-state.

Validierungsgrenzen

BehauptungStatus
SVG-Serialisierungs-Injection in satori < FixBewiesen (Quellcode + Verhalten)
Ende-zu-Ende-Rendering von injiziertem Markup via next/og 16.3.5Bewiesen
Gepatchte Negativkontrolle (16.3.6 / satori 0.33.5)Bewiesen
Attribut-/Style-Träger (gleiche Ursache)Ursache im Fix-Diff bestätigt; Text-Träger bewiesen
SSRF / Dateilesen über injizierte RessourcenreferenzenNicht getestet
Remote-Code-AusführungNicht beansprucht (hängt von nicht offengelegten Details des nachgelagerten Parsers ab)

Referenzen

  • GHSA-vcvr-r3jv-pc5j (Next.js)
  • GHSA-wx4j-mvgx-mqwp (Satori)
  • Next.js security update, 22 Sep 2026
  • Satori fix commit 26a52aff
  • Netlify customer advisory (CVE-2026-94545)

Sicherheitsgrenze

Führen Sie dieses Repository nur auf Systemen aus, die Sie besitzen oder für deren Test Sie ausdrücklich autorisiert sind. Der Labor-Treiber lehnt andere Varianten als vulnerable/patched ab, der Scanner lehnt Nicht-Loopback-Ziele ab, es sei denn --allow-authorized-non-loopback wird angegeben, und der Compose-Port ist an 127.0.0.1 gebunden.

Siehe SECURITY.md für den Umgang mit Offenlegungen. Dieses Repository enthält keine Produktionsziele, Kundendaten, Zugriffstoken oder Beweise aus realen Systemen.

Lizenz

MIT - siehe LICENSE.

Tool herunterladen