
إثبات المفهوم لثغرة CVE-2026-21717، وهي ثغرة تصادم تجزئة السلاسل النصية في Node.js V8 تسبب رفض الخدمة عبر حمولات JSON مصممة خصيصًا.
ثغرة التصادم المتوقع في تجزئة السلاسل النصية في Node.js V8 المؤدية إلى رفض الخدمة
ثغرة حرجة في آلية تجزئة السلاسل النصية في V8 تسمح للمهاجمين بالتسبب في تدهور شديد في أداء تطبيقات Node.js. يتم تجزئة السلاسل النصية الشبيهة بالأعداد إلى قيمتها الرقمية، مما يجعل تصادمات التجزئة قابلة للتنبؤ بسهولة. من خلال صياغة مدخلات خبيثة تسبب العديد من التصادمات في جدول السلاسل النصية الداخلي لـ V8، يمكن للمهاجم تدهوير الأداء بشكل كبير أو التسبب في رفض الخدمة.
تنبع الثغرة من عملية تدويل السلاسل النصية في V8. عند حدوث تحليل JSON، يتم تدويل السلاسل النصية القصيرة تلقائيًا في جدول تجزئة. تتصادم السلاسل النصية الشبيهة بالأعداد بشكل متوقع لأنها تُجزأ إلى قيمها الرقمية، مما يسمح للمهاجمين بفرض سلاسل استقصاء تربيعية تدهور الأداء بشكل شديد.
المشغل الأكثر شيوعًا هو أي نقطة نهاية تستدعي JSON.parse() على مدخلات يتحكم بها المهاجم، حيث أن تحليل JSON يقوم تلقائيًا بتدويل السلاسل النصية القصيرة في جدول التجزئة المتأثر.
يحتوي هذا المستودع على إثبات مفهوم يوضح الثغرة:
# استخدم إصدار Node.js المتأثر بـ CVE-2026-21717
nvm use
npm install
node poc.js
يقوم إثبات المفهوم بإنشاء حمولة تحتوي على:
JSON.parse() واحدةJSON.parse() على المدخلات غير الموثوقة// الحد من حجم الحمولة
app.use(express.json({ limit: '100kb' }));
// إضافة مهلة زمنية للتحليل
const parseWithTimeout = (str, timeout = 1000) => {
return Promise.race([
Promise.resolve(JSON.parse(str)),
new Promise((_, reject) =>
setTimeout(() => reject(new Error('Parse timeout')), timeout)
)
]);
};
هذا المستودع مخصص لأغراض تعليمية وبحثية فقط. لا تستخدم هذا الكود لأغراض خبيثة أو ضد أنظمة لا تملكها أو ليس لديك إذن صريح لاختبارها.