
ابحث عن التعبيرات العادية المعرضة لـ ReDoS (هجوم رفض الخدمة عبر التعبيرات العادية)

اعثر على التعبيرات النمطية المعرضة لهجمات رفض الخدمة عبر التعبيرات النمطية (ReDoS).
المزيد من المعلومات على مدونة Doyensec
العديد من محللات التعبيرات النمطية الافتراضية لها تعقيد أسوأ حالة غير محدود. قد تكون مطابقة التعبير النمطي سريعة عند تقديم سلسلة إدخال مطابقة. ومع ذلك، يمكن لبعض سلاسل الإدخال غير المطابقة أن تجعل مُطابق التعبير النمطي يدخل في حلقات تتبع خلفي جنونية ويستغرق وقتًا طويلاً في المعالجة. يمكن أن يتسبب ذلك في رفض الخدمة، حيث ستعلق وحدة المعالجة المركزية في محاولة مطابقة التعبير النمطي.
صُممت هذه الأداة من أجل:
يعكس هذا تعقيد إجراء التتبع الخلفي لمُطابق التعبير النمطي بالنسبة لطول السلسلة المُدخلة.
تعني التعقيد التكعيبي هنا أنه إذا تم مضاعفة طول الجزء الضعيف من السلسلة، فيجب أن يكون وقت التنفيذ أطول بحوالي 8 مرات (2^3).
بالنسبة لـ ReDoS الأسي مع النجوم المتداخلة مثل (a*)*$ يتم استخدام عامل تحايل وسيكون التعقيد أكبر من 10.
للاستغلال، عادةً ما يكون التعقيد التكعيبي أو أعلى مطلوبًا ما لم يُسمح بسلاسل كبيرة حقًا كإدخال.
قم بتشغيل regexploit وأدخل التعبير النمطي v\w*_\w*_\w*$ في سطر الأوامر.
$ regexploit
v\w*_\w*_\w*$
Pattern: v\w*_\w*_\w*$
---
Worst-case complexity: 3 ⭐⭐⭐ (cubic)
Repeated character: [5f:_]
Final character to cause backtracking: [^WORD]
Example: 'v' + '_' * 3456 + '!'
الجزء \w*_\w*_\w* يحتوي على ثلاث مجموعات متكررة متداخلة (\w يطابق الحروف والأرقام والشرطات السفلية). كما هو موضح في السطر Repeated character: [5f:_]، سلسلة طويلة من _ (0x5f) ستطابق هذا القسم بعدة طرق مختلفة. التعقيد الأسوأ هو 3 حيث توجد 3 مجموعات متكررة لا نهائية. يتم تقديم مثال لإحداث ReDoS: يتكون من البادئة المطلوبة v، وسلسلة طويلة من _ ثم ! (حرف غير كلمة) لإحداث التتبع الخلفي. لا تتطلب كل هجمات ReDoS حرفًا معينًا في النهاية، ولكن في هذه الحالة، سلسلة طويلة من _ ستطابق التعبير النمطي بنجاح ولن تتراجع. يُظهر السطر Final character to cause backtracking: [^WORD] أن حرفًا غير مطابق (ليس حرف كلمة) مطلوب في النهاية لمنع المطابقة وإحداث ReDoS.
كمثال آخر، قم بتثبيت إصدار وحدة معرضة لـ ReDoS مثل pip install ua-parser==0.9.0.
لفحص وحدات بايثون المثبتة قم بتشغيل regexploit-python-env.
Importing ua_parser.user_agent_parser
Vulnerable regex in /somewhere/.env/lib/python3.9/site-packages/ua_parser/user_agent_parser.py #183
Pattern: \bSmartWatch *\( *([^;]+) *; *([^;]+) *;
Context: self.user_agent_re = re.compile(self.pattern)
---
Worst-case complexity: 3 ⭐⭐⭐
Repeated character: [20]
Example: 'SmartWatch(' + ' ' * 3456
Worst-case complexity: 3 ⭐⭐⭐
Repeated character: [20]
Example: 'SmartWatch(0;' + ' ' * 3456
Vulnerable regex in /somewhere/.env/lib/python3.9/site-packages/ua_parser/user_agent_parser.py #183
Pattern: ; *([^;/]+) Build[/ ]Huawei(MT1-U06|[A-Z]+\d+[^\);]+)[^\);]*\)
Context: self.user_agent_re = re.compile(self.pattern)
---
Worst-case complexity: 3 ⭐⭐⭐
Repeated character: [[0-9]]
Example: ';0 Build/HuaweiA' + '0' * 3456
...
لكل تعبير نمطي ضعيف، يطبع واحدًا أو أكثر من السلاسل الخبيثة لتشغيل ReDoS. قد يؤدي تعيين وكيل المستخدم الخاص بك إلى ;0 Build/HuaweiA000000000000000... وتصفح موقع ويب يستخدم إصدارًا قديمًا من ua-parser إلى استغراق الخادم وقتًا طويلاً لمعالجة طلبك، على الأرجح لينتهي بحالة 502.
Python 3.8+ مطلوب. لاستخراج التعبيرات النمطية من أكواد JavaScript / TypeScript، NodeJS 12+ مطلوب أيضًا.
اختياريًا، قم بإنشاء بيئة افتراضية
python3 -m venv .env
source .env/bin/activate
الآن قم بالتثبيت الفعلي باستخدام pip
pip install regexploit
أدخل التعبيرات النمطية عبر stdin (واحد في كل سطر) إلى regexploit.
regexploit
أو عبر ملف
cat myregexes.txt | regexploit
هناك دعم مدمج لتحليل التعبيرات النمطية من Python وJavaScript وTypeScript وC# وYAML وJSON.
يحلل كود Python (بدون تنفيذه) عبر AST للعثور على التعبيرات النمطية. ثم يتم تحليل التعبيرات النمطية للبحث عن ReDoS.
regexploit-py my-project/
regexploit-py "my-project/**/*.py" --glob
سيستخدم هذا حزمة NodeJS المضمنة في regexploit/bin/javascript التي تحلل JavaScript الخاص بك كـ AST باستخدام eslint وتطبع جميع التعبيرات النمطية.
يتم تغذية هذه التعبيرات النمطية إلى مكتشف ReDoS في بايثون.
regexploit-js my-module/my-file.js another/file.js some/folder/
regexploit-js "my-project/node_modules/**/*.js" --glob
ملاحظة: هناك اختلافات بين تحليل التعبيرات النمطية في javascript وpython لذلك قد يكون هناك بعض الأخطاء. لست متأكدًا أنني أريد كتابة AST للتعبير النمطي في JS!
ابحث عن التعبيرات النمطية في جميع وحدات python المثبتة حاليًا في مسارك / بيئتك. هذا يعني أنه يمكنك pip install أي وحدات تهتم بها وسيتم تحليلها. يتم تضمين كود Cpython.
regexploit-python-env
ملاحظة: هذا لا يحلل كود python إلى AST وسيجد فقط التعبيرات النمطية التي تم تجميعها تلقائيًا عند استيراد الوحدة. يتم استيراد الوحدات فعليًا، لذلك سيتم تنفيذ الكود في الوحدات. هذا مفيد للعثور على التعبيرات النمطية التي تم بناؤها من سلاسل أصغر عند التحميل مثل CVE-2021-25292 في Pillow
دعم Yaml يتطلب pyyaml، والذي يمكن تثبيته باستخدام pip install regexploit[yaml].
regexploit-json *.json
regexploit-yaml *.yaml
regexploit-csharp something.cs