הזרקות של ישויות XML חיצוניות (XXE)

קטגוריה של OWASP: MASVS-CODE: איכות הקוד

סקירה כללית

החדרת ישות חיצונית ב-XML‏ (XXE) היא מתקפה נגד אפליקציות שמנתחות קלט XML. מתקפת XXE מתרחשת כשמנתח XML שההגדרה שלו חלשה מעבד קלט XML לא מהימן עם הפניה לישות חיצונית. ההתקפה הזו יכולה לשמש לביצוע כמה אירועים, כולל התקפת מניעת שירות (DoS), גישה למערכת קבצים או זליגת נתונים.

השפעה

כשיישום מנתח מסמך XML, הוא יכול לעבד כל DTD (הגדרות סוג מסמך, שנקראות גם ישויות חיצוניות) שכלול במסמך. תוקף יכול לנצל את ההתנהגות הזו על ידי החדרה של קוד זדוני כ-DTDs. הקוד הזה יכול לגשת לחלקים במערכת הקבצים של המכשיר, שנגישים רק לאפליקציה ועשויים להכיל מידע אישי רגיש. בנוסף, קוד זדוני כזה יכול לשלוח בקשות מהמכשיר, ועשוי לעקוף אמצעי אבטחה היקפיים.

לבסוף, אם האפליקציה מרחיבה DTD, היא עלולה ליצור מצב עם כמה איטרציות של ישויות שמפנות אחת לשנייה, ולגרום לניצול יתר של משאבי המכשיר ולהתקפת מניעת שירות.

אמצעי צמצום סיכונים

השבתת DTD

הדרך הבטוחה ביותר למנוע XXE היא להשבית תמיד את DTD (ישויות חיצוניות) באופן מלא. בהתאם למנתח התחביר שבו משתמשים, השיטה יכולה להיות דומה לדוגמה הבאה של ספריית XML Pull Parser:

Java

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);

Kotlin

val factory = XmlPullParserFactory.newInstance()
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)

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

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

ביצוע חיטוי של קלט

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

שימוש בספרייה אחרת

אם אי אפשר להגדיר את הספרייה או השיטה שבהן נעשה שימוש בצורה מאובטחת, צריך לשקול שימוש בספרייה או בשיטה אחרת. אפשר להגדיר את XML Pull Parser ו-SAX Parser בצורה מאובטחת, כך שלא יאפשרו DTD וישויות.

משאבים