הערות אבטחה: RegEx
האם RegEx עלול להיות פגיע?
Photo by Markus Spiske on Unsplash
מניעת שירות באמצעות ביטוי רגולרי: ReDoS
אחת הפגיעויות המפתיעות ביותר, אך גם הקשות לאיתור, שמצאתי קשורה לביטויים רגולריים. בין אם כתובים גרוע או מיושמים גרוע.
ניתן למצות זיכרון/מעבד באמצעות קלט משתמש גדול או מעוצב במיוחד.
זוהי פגיעות של מניעת שירות, לא רק ריח ביצועים. אם קלט עוין יכול להעסיק את המעבד מספיק זמן כדי להרעיב משתמשים אמיתיים, זה שייך למודל האיומים האבטחתי שלך.
סימני אזהרה
- מכפילים מקוננים, קבוצות חוזרות, או חלופות חופפות
- מנועים כבדי-חזרה לאחור ללא מגבלת זמן או אורך קלט
- ביטוי בשימוש עם קלט משתמש לא מבוקר
- אימות ביטוי רגולרי רץ על נתיב בקשה חם
הפחתה / פתרון
- ביטויים רגולריים קשים.
- לדוגמה, כך האנשים החכמים באמת ב-[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]?)$ - זה ארוך יותר מציוץ (של פעם), עבור כתובת IP בת 4 בתים!!!
- לדוגמה, כך האנשים החכמים באמת ב-[OWASP ממליצים לטפל באימות IP][owasp]:
- הגבל אורך קלט לפני הערכת הביטוי הרגולרי.
- הוסף מגבלות זמן, ניתוח סטטי, או מנוע ללא חזרה לאחור היכן שהפלטפורמה תומכת בכך.
- זה משפיע על כמעט כל שפה ופלטפורמה: .NET/Node/Python/PERL/Java.