DanLevy.net

הערות אבטחה: RegEx

האם RegEx עלול להיות פגיע?

Hero image for הערות אבטחה: RegEx. Photo by Markus Spiske on Unsplash

Photo by Markus Spiske on Unsplash

מניעת שירות באמצעות ביטוי רגולרי: ReDoS

אחת הפגיעויות המפתיעות ביותר, אך גם הקשות לאיתור, שמצאתי קשורה לביטויים רגולריים. בין אם כתובים גרוע או מיושמים גרוע.

ניתן למצות זיכרון/מעבד באמצעות קלט משתמש גדול או מעוצב במיוחד.

זוהי פגיעות של מניעת שירות, לא רק ריח ביצועים. אם קלט עוין יכול להעסיק את המעבד מספיק זמן כדי להרעיב משתמשים אמיתיים, זה שייך למודל האיומים האבטחתי שלך.

סימני אזהרה

  1. מכפילים מקוננים, קבוצות חוזרות, או חלופות חופפות
  2. מנועים כבדי-חזרה לאחור ללא מגבלת זמן או אורך קלט
  3. ביטוי בשימוש עם קלט משתמש לא מבוקר
  4. אימות ביטוי רגולרי רץ על נתיב בקשה חם

הפחתה / פתרון

  1. ביטויים רגולריים קשים.
    1. לדוגמה, כך האנשים החכמים באמת ב-[OWASP ממליצים לטפל באימות IP][owasp]: ^(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.

הפניה