CVE-2026-89407 in jackson-core
الملخص
بحسب VulDB • 22/09/2026
تقوم الدالة `NumberInput.looksLikeValidNumber()` في مكتبة FasterXML jackson-core (الإصدارات السابقة لـ 2.17.x) بالتحقق المسبق من "الأرقام المُحوَّلة إلى نصوص" باستخدام تعبيرين منتظمين: PATTERN_FLOAT ([+-]?[0-9]*[\.]?[0-9]+([eE][+-]?[0-9]+)?)، الموجود منذ الإصدار 2.17.0، وPATTERN_FLOAT_TRAILING_DOT، الذي أُضيف في الإصدار 2.17.2. يضع PATTERN_FLOAT كميات (quantifiers) متجاورة على نفس فئة الأحرف -- وهي سلسلة اختيارية من [0-9]*، تليها نقطة اختيارية، ثم سلسلة مطلوبة من [0-9]+ -- مما يؤدي إلى قيام محرك التراجع في Java بإعادة محاولة كل نقطة تقسيم ممكنة لسلسلة الأرقام عندما يفشل الإدخال النهائي في المطابقة.
وبالتالي، فإن تكلفة المطابقة تنمو مع مربع طول المدخلات.
يمكن لمهاجم قادر على تزويد التطبيق ببيانات JSON يتم فك تسلسلها (deserialization) إلى نوع رقمي مستهدف الوصول إلى هذه الطريقة من خلال التحويل الافتراضي للنصوص إلى أرقام في jackson-databind (StdDeserializer و NumberDeserializers لأنواع BigDecimal، BigInteger، Double و Float).
نظراً لأن الحد الأقصى لطول السلسلة في StreamReadConstraints.maxStringLength افتراضياً هو 20,000,000 حرف، فلا يوجد قيد يحد من المدخلات قبل وصولها إلى التعبير المنتظم.
أكدت الاختبارات التي أجراها المُبلِّغ نمو التعقيد بمعدل O(n^2) عبر خمسة تضاعفات متتالية لحجم الإدخال، حيث استهلكت سلسلة واحدة بطول 160,000 حرف حوالي 74 ثانية في استدعاء واحد؛ وبالتالي يمكن لعدد صغير من الطلبات المتزامنة ذات حجم جسم عادي أن تستنفد مجموعة خيوط معالجة الطلبات (request-handling thread pool) الخاصة بالخادم.
لا توجد الطريقة المتأثرة قبل الإصدار 2.17.0، لذا فإن إصدارات 2.16.x والإصدارات الأقدم غير متأثرة.
يستبدل الإصلاح كلا التعبيرين المنتظمين بفحص أحادي المرور مُنفَّذ يدوياً (hand-rolled single-pass scan).
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.