مستغلة: 178
الأحدثCVE-2026-115732 — تجاوز تفويض اسم الشهادة
VulnFeed.org
AREN
7.5
CVE-2026-115887يتوفر تصحيح

مقياس PhoneNumber في graphql-scalars معرض لثغرة حجب الخدمة عبر التعبير النمطي

graphql-scalarsقراءة 2 داقرأ بلغة

ترجمة آلية لم تُراجَع بعد. النص الإنجليزي هو المرجع في حال الاختلاف.

الملخص

## الملخص التعبير النمطي الحاكم لـ `GraphQLPhoneNumber` منذ الإصدار 1.24.1 يتراجع أسياً (backtracks exponentially). سلسلة نصية مكونة من سلسلة من الأرقام تليها حرف واحد يجعل التطابق يفشل (على سبيل المثال `"1".repeat(30) + "x"`) تحجب خيط JavaScript لعدة ثوانٍ، وكل رقم إضافي يضاعف الوقت. يستدعي graphql-js دالة `parseLiteral` أثناء *التحقق من صحة* المستند ودالة `parseValue` أثناء فرض أنواع المتغيرات، لذا يعمل التعبير النمطي لكل طلب يحتوي ببساطة على مثل هذه القيمة في موضع `PhoneNumber`، قبل التنفيذ وقبل أي خطوة مصادقة أو تفويض للخادم. يكفي طلب واحد صغير دون مصادقة لتجميع عملية الخادم وتوقفها. ## الإصدارات المتأثرة - `graphql-scalars` >= 1.24.1, <= 2.0.0 (2.0.0 هو الإصدار `latest` الحالي؛ الفرع الافتراضي لا يزال يحتوي على النمط نفسه). - غير متأثر: 1.24.0 والإصدارات السابقة التي فحصتها (1.22.4, 1.23.0)، والتي تستخدم النمط الخطي `/^\+[1-9]\d{6,14}$/`. - تم إدخالها عبر #2719 (c7f58da16، "PhoneNumber scalar is not fully compatible with E.164 format so updated regex to support phone number with extension")، وصدرت كإصدار 1.24.1 في 2025-01-29. تم تشغيل الحمولة مقابل 1.22.4 و 1.23.0 و 1.24.0 و 1.24.1 و 1.24.2 و 1.25.0 و 1.26.0 و 2.0.0: رفضت الإصدارات الثلاثة الأولى ذلك فوراً، بينما أظهرت الإصدارات الخمسة الأخرى نمواً أسياً. ## السبب الرئيسي `src/scalars/PhoneNumber.ts`: ```js const PHONE_NUMBER_REGEX = /^\+?\d{1,3}(\-|\x20)?\(?\d+\)?((\-|\x20)?\d+)+$/; ``` في `\d+\)?((\-|\x20)?\d+)+$` الفاصل اختياري، لذا يمكن تقسيم سلسلة من n من الأرقام عبر `\d+` الداخلي و `+` الخارجي بطرق متعددة تتزايد أسياً مع n. عندما يفشل التطابق الإجمالي، على سبيل المثال على رقم غير خانة في النهاية، يحاول المحرك جميع هذه الطرق. ## إثبات المفهوم 1. المقياس بمفرده (`npm i graphql [email protected]`): ```js import { GraphQLPhoneNumber } from 'graphql-scalars'; for (const ok of ['+41791234567', '079 123 45 67', '+1 (123) 456-7890', 'nope']) { try { GraphQLPhoneNumber.parseValue(ok); } catch {} } for (cons...

المعالجة

المراجع

Esc