DanLevy.net

ملاحظات أمنية: التعبيرات النمطية

هل يمكن أن تكون RegEx عرضة للثغرات؟

Hero image for ملاحظات أمنية: التعبيرات النمطية. Photo by Markus Spiske on Unsplash

Photo by Markus Spiske on Unsplash

رفض الخدمة عبر التعبيرات المنتظمة: ReDOS

إحدى الثغرات الأكثر إثارة للدهشة، والتي يصعب اكتشافها، التي وجدتها تتعلق بالتعبيرات المنتظمة. إما بسبب كتابتها بشكل سيئ أو تنفيذها بشكل سيئ.

يمكن استنزاف الذاكرة/وحدة المعالجة المركزية (CPU) بإدخال مستخدم كبير أو مصمم خصيصًا.

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

علامات التحذير

  1. مُكرِّرات متداخلة، مجموعات مكررة، أو تناوب متداخل
  2. محركات تعتمد بكثافة على التراجع بدون حد زمني أو حد لطول الإدخال
  3. استخدام التعبير مع إدخال مستخدم غير مدقق
  4. تشغيل التحقق من التعبير المنتظم على مسار طلب ساخن

التخفيف / الحل

  1. التعبيرات المنتظمة صعبة.
    1. على سبيل المثال، إليك كيف يوصي الأشخاص الأذكياء حقًا في [OWASP][owasp] بالتعامل مع التحقق من عنوان IP: ^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
    2. هذا أطول من تغريدة (قديمة الطراز)، لعنوان IP بحجم 4 بايت!!!
  2. حدد طول الإدخال قبل تقييم التعبير المنتظم.
  3. أضف حدودًا زمنية، تحليلًا ثابتًا، أو محركًا بدون تراجع حيثما يدعم النظام الأساسي ذلك.
  4. هذا يؤثر على كل لغة ومنصة تقريبًا: .NET/Node/Python/PERL/Java.

مرجع