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

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

סקירה כללית

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

השפעה

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

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

מיטיגציות

השבתת 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 גם מגינה על המנתח מפני התקפות מניעת שירות (DoS). אם אי אפשר להשבית DTDs לחלוטין, צריך להשבית ישויות חיצוניות והצהרות חיצוניות על סוג המסמך באופן ספציפי לכל מנתח.

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

ביצוע ניקיון לקלט

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

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

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

משאבים