ביצוע קוד מרחוק עם XStream

1. סקירה כללית

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

נלמד מתי XStream חשוף להתקפה זו, כיצד פועלת ההתקפה וכיצד ניתן למנוע התקפות כאלה.

2. יסודות XStream

לפני שנתאר את ההתקפה, בואו נסקור כמה יסודות XStream. XStream היא ספריית סדרת XML המתורגמת בין סוגי Java ל- XML. שקול פשוט אדם מעמד:

אדם ממעמד ציבורי {פרטי מחרוזת ראשונה; מחרוזת פרטית אחרונה; // סטרים וקובעים סטנדרטיים}

בואו נראה איך XStream יכול לכתוב כמה אדם מופע ל- XML:

XStream xstream = XStream חדש (); מחרוזת xml = xstream.toXML (אדם);

כמו כן, XStream יכול לקרוא XML למופע של אדם:

XStream xstream = XStream חדש (); xstream.alias ("אדם", Person.class); מחרוזת xml = "JohnSmith"; אדם אדם = (אדם) xstream.fromXML (xml);

בשני המקרים, XStream משתמש בהשתקפות Java לתרגום ה- אדם הקלד מ- XML ​​וממנו. ההתקפה מתרחשת במהלך קריאת ה- XML. בעת קריאת XML, XStream מיידית שיעורי Java באמצעות השתקפות.

הכיתות המיידיות של XStream נקבעות על ידי שמות רכיבי ה- XML ​​שהיא מנתחת.

מכיוון שהגדרנו את XStream להיות מודע ל אדם סוג, XStream מיישר חדש אדם כאשר הוא מנתח רכיבי XML בשם "אדם".

בנוסף לסוגים המוגדרים על ידי המשתמש כמו אדם, XStream מזהה סוגי ליבה של Java מחוץ לקופסה. לדוגמה, XStream יכול לקרוא א מַפָּה מ- XML:

מחרוזת xml = "" + "" + "" + "foo" + "10" + "" + ""; XStream xStream = XStream חדש (); מפת מפה = (מפה) xStream.fromXML (xml); 

נראה כיצד היכולת של XStream לקרוא XML המייצגת סוגי Java מרכזיים תועיל לניצול ביצוע קוד מרחוק.

3. איך פועלת ההתקפה

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

עם הרכב נכון של שיעורים, XStream מריץ בסופו של דבר את קוד ההתקפה באמצעות השתקפות Java.

בואו לבנות התקפה לדוגמא.

3.1. כלול קוד התקפה ב- ProcessBuilder

המתקפה שלנו שואפת להתחיל תהליך מחשבון שולחני חדש. ב- macOS, זהו "/Applications/Calculator.app". ב- Windows, זהו "calc.exe". לשם כך, נוליך שולל את XStream להפעלת תהליך חדש באמצעות ProcessBuilder. זכור את קוד Java כדי להתחיל בתהליך חדש:

ProcessBuilder חדש (). פקודה ("שם הפעלה כאן"). התחל ();

בעת קריאת XML, XStream רק קורא לבונים ומגדיר שדות. לכן, לתוקף אין דרך פשוטה להפעיל את ProcessBuilder.start () שיטה.

עם זאת, תוקפים חכמים יכולים להשתמש בהרכב הנכון של שיעורים בכדי להוציא לפועל את ProcessBuilderשל הַתחָלָה() שיטה.

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

3.2. ליצור ניתן להשוות פרוקסי דינמי

נזכיר שהתוקף צריך ליצור ProcessBuilder ולהפעיל את שלה הַתחָלָה() שיטה. על מנת לעשות זאת, ניצור מופע של ניתן להשוות של מי לְהַשְׁווֹת השיטה קוראת ל ProcessBuilderשל הַתחָלָה() שיטה.

למרבה המזל, Java Proxy Proxys מאפשרים לנו ליצור מופע של ניתן להשוות באופן דינמי.

יתר על כן, Java מנהל אירועים class מספק לתוקף הגדרה InvocationHandler יישום. התוקף מגדיר את התצורה מנהל אירועים להפעיל את ProcessBuilderשל הַתחָלָה() שיטה.

אם מרכיבים רכיבים אלה, יש לנו ייצוג XStream XML עבור ה- ניתן להשוות פרוקסי:

 java.lang.Comparable open /Applications/Calculator.app start 

3.3. כפה השוואה באמצעות ניתן להשוות פרוקסי דינמי

לאלץ השוואה עם שלנו ניתן להשוות proxy, אנו בונים אוסף ממוין. בואו לבנות a TreeSet אוסף שמשווה בין שניים ניתן להשוות מקרים: א חוּט והפרוקסי שלנו.

נשתמש TreeSetבונה העתקות לבניית אוסף זה. לבסוף, יש לנו את ייצוג ה- XML ​​של XStream עבור חדש TreeSet המכיל את ה- proxy שלנו ו- חוּט:

 foo java.lang.Comparable open /Applications/Calculator.app start 

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

מחרוזת sortedSortAttack = // XML מלמעלה XStream xstream = XStream חדש (); אדם אדם = (אדם) xstream.fromXML (sortedSortAttack);

3.4. סיכום התקפה

בואו נסכם את השיחות הרפלקטיביות שעושה XStream כאשר הוא מבטל את עריכת ה- XML ​​הזה

  1. XStream קוראת ל- TreeSet בונה העתקות עם אוסף המכיל a חוּט "Foo" ושלנו ניתן להשוות פרוקסי.
  2. ה TreeSet בונה קורא שלנו ניתן להשוות פרוקסי בהשוואה ל שיטה על מנת לקבוע את סדר הפריטים בערכה הממוינת.
  3. שֶׁלָנוּ ניתן להשוות proxy דינמי מאציל את כל שיחות השיטה אל מנהל אירועים.
  4. ה מנהל אירועים מוגדר להפעיל את הַתחָלָה() שיטת ה- ProcessBuilder זה מלחין.
  5. ה ProcessBuilder מזלג תהליך חדש שמריץ את הפקודה שהתוקף מעוניין לבצע.

4. מתי XStream פגיע?

XStream יכול להיות פגיע להתקפת ביצוע קוד מרחוק זו כאשר התוקף שולט ב- XML ​​שהוא קורא.

לדוגמה, שקול REST API המקבל קלט XML. אם ה- REST API הזה משתמש ב- XStream כדי לקרוא גופי בקשות XML, ייתכן שהוא חשוף להתקפה של ביצוע קוד מרחוק מכיוון שתוקפים שולטים בתוכן ה- XML ​​שנשלח ל- API.

מצד שני, יישום שמשתמש רק ב- XStream לקריאת XML מהימן הוא בעל משטח התקפה קטן בהרבה.

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

5. התקשות XStream נגד התקפות ביצוע קוד מרחוק

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

רשימה זו תכלול רק סוגים בסיסיים ושלנו אדם מעמד:

XStream xstream = XStream חדש (); xstream.addPermission (NoTypePermission.NONE); xstream.addPermission (NullPermission.NULL); xstream.addPermission (PrimitiveTypePermission.PRIMITIVES); xstream.allowTypes (מחלקה חדשה [] {Person.class});

בנוסף, משתמשי XStream עשויים לשקול להקשיח את מערכותיהם באמצעות סוכן Runtime Application Self-Protection (RASP). סוכני RASP משתמשים במכשור bytecode בזמן הריצה כדי לזהות ולחסום התקפות באופן אוטומטי. טכניקה זו פחות נוטה לשגיאות מאשר בנייה ידנית של רשימת היתרים מסוגים.

6. מסקנה

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

הניצול קיים מכיוון ש- XStream משתמש בהשתקפות כדי לייצר שיעורי Java המזוהים על ידי ה- XML ​​של התוקף.

כמו תמיד, ניתן למצוא את הקוד לדוגמאות ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found