המידע הזה מיועד למפתחים שהאפליקציות שלהם מכילות את פרצת האבטחה החושפת אותן להתקפה בשיטת Path Traversal.
מה קורה?
החל מ-16 בינואר 2018, Google Play החל לחסום פרסומים של אפליקציות ועדכונים חדשים עם פגיעוּת להתקפת Path Traversal. יש לעיין בהודעה שב-Play Console.לאחר המועדים האחרונים לתיקון שמוצגים ב-Play Console, אפליקציות שיכילו פרצות אבטחה לא מתוקנות יוסרו מ-Google Play.
הפעולה הנדרשת
- נכנסים לחשבון Play Console, ועוברים לקטע ההתראות כדי לבדוק אילו אפליקציות מושפעות מהבעיות ומהם המועדים האחרונים לתיקון.
- מעדכנים את האפליקציות המושפעות ומתקנים את פרצת האבטחה.
- שולחים את הגרסאות המעודכנות של האפליקציות המושפעות.
לאחר השליחה החוזרת, האפליקציה שלכם תיבדק שוב. תהליך זה עשוי להימשך כמה שעות. אם האפליקציה עוברת את הבדיקה ומתפרסמת בהצלחה, לא יהיה צורך בפעולה נוספת. אם האפליקציה תיכשל בבדיקה, גרסת האפליקציה החדשה לא תתפרסם ותקבלו התראה באימייל.
פרטים נוספים
יישומים של openFile ב-ContentProviders שעברו ייצוא עלולים להיות חשופים אם הם לא מאמתים פרמטרי URI נכנסים בצורה נכונה. אפליקציה זדונית יכולה לספק URI מיוחד (למשל, URI שמכיל את התווים ”/../“) כדי לגרום לאפליקציה שלך להחזיר ParcelFileDescriptor לקובץ שנמצא מחוץ לתיקיית היעד, ובכך לאפשר לאפליקציה הזדונית לגשת לכל קובץ שנגיש לאפליקציה שלך.
יש שתי אסטרטגיות מומלצות לטיפול בפרצת Path Traversal ב-ContentProvider.
1. אם אין צורך לחשוף את ה-ContentProvider לאפליקציות אחרות:
- אפשר לשנות את התג <provider> של ה-ContentProvider המושפע במניפסט ולהגדיר ”android:exported=“false. כך אפליקציות אחרות לא ישלחו Intents ל-ContentProvider המושפע מהפרצה.
- אפשר גם להגדיר את המאפיין android:permission כהרשאה באמצעות android:protectionLevel=“signature” כדי למנוע מאפליקציות שכתבו מפתחים אחרים לשלוח מנגנוני Intent ל-ContentProvider המושפע.
2. אם ה-ContentProvider צריך להיות חשוף לאפליקציות אחרות:
יש להבטיח שהקלטים שמגיעים ל-openFile ומכילים תווים למעבר בין תיקיות (path traversal) לא יוכלו לגרום לאפליקציה להחזיר קבצים לא צפויים. אפשר לעשות זאת על ידי בדיקת הנתיב הקנוני של הקובץ. לדוגמה:
public ParcelFileDescriptor openFile (Uri uri, String mode)
throws FileNotFoundException {
File f = new File(DIR, uri.getLastPathSegment());
if (!f.getCanonicalPath().startsWith(DIR)) {
throw new IllegalArgumentException();
}
return ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY);
}
הסתייגויות: יש לשים לב שקריאה ל-getLastPathSegment בפרמטר URI היא לא פעולה בטוחה. אפליקציה זדונית יכולה לספק נתיב URI מקודד, כמו %2F..%2F..path%2Fto%2Fsecret.txt, כדי שהתוצאה של getLastPathSegment תהיה /../../path/to/secret.txt. לדוגמה, היישום שבהמשך עדיין חשוף להתקפה.
public ParcelFileDescriptor openFile(Uri uri, String mode){
File f = new File(DIR, uri.getLastPathSegment());
return ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY);
}
אנחנו כאן כדי לעזור
אם יש לכם שאלות טכניות בנוגע לפגיעוּת זו, ניתן לפרסם פוסט באתר Stack Overflow ולהשתמש בתג “android-security”. משהו לא ברור בשלבים לפתרון הבעיה? ניתן לפנות אל צוות התמיכה שלנו למפתחים.