ארגז חול לאפליקציות

פלטפורמת Android משתמשת בהגנה מבוססת-משתמש של Linux כדי לזהות ולבודד משאבי אפליקציות. כך האפליקציות מבודדות זו מזו, והאפליקציות והמערכת מוגנות מאפליקציות זדוניות. כדי לעשות זאת, מערכת Android מקצה מזהה משתמש ייחודי (UID) לכל אפליקציה ל-Android ומפעילה אותה בתהליך משלה.

מערכת Android משתמשת ב-UID כדי להגדיר ארגז חול לאפליקציות ברמת הליבה. הליבה אוכפת את האבטחה בין האפליקציות למערכת ברמת התהליך באמצעות שירותים רגילים של Linux, כמו מזהי משתמשים וקבוצות שמוקצים לאפליקציות. כברירת מחדל, לאפליקציות אין אפשרות ליצור אינטראקציה אחת עם השנייה, והן מקבלות גישה מוגבלת למערכת ההפעלה. אם אפליקציה א' תנסה לבצע פעולה זדונית, כמו לקרוא את הנתונים של אפליקציה ב' או לחייג בטלפון ללא רשות, היא לא תוכל לעשות זאת כי אין לה את הרשאות ברירת המחדל המתאימות למשתמש. ארגז החול פשוט, ניתן לבדיקות והוא מבוסס על הפרדת משתמשים בתהליכים ובהרשאות של קבצים בסגנון UNIX שנמצא בשימוש כבר עשרות שנים.

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

הגנות

באופן כללי, כדי לפרוץ מארגז החול של האפליקציות במכשיר שהוגדר בצורה תקינה, צריך לפגוע באבטחה של ליבה של Linux. עם זאת, בדומה לתכונות אבטחה אחרות, אמצעי הגנה נפרדים לא יכולים להגן על ארגז החול של האפליקציה מפני כל התקפה, ולכן חשוב להשתמש בהגנה לעומק כדי למנוע מנקודות חולשה בודדות לגרום לפגיעה במערכת ההפעלה או באפליקציות אחרות.

מערכת Android מסתמכת על מספר אמצעי הגנה כדי לאכוף את ארגז החול של האפליקציה. אמצעי האכיפה האלה הוכנסו לאורך זמן, והם חיזקו באופן משמעותי את ארגז החול המקורי של בקרת הגישה הדיסקרטיטיבית (DAC) שמבוססת על מזהה משתמש ייחודי (UID). גרסאות קודמות של Android כללו את ההגנות הבאות:

  • ב-Android 5.0, SELinux סיפק הפרדה של בקרת גישה חובה (MAC) בין המערכת לאפליקציות. עם זאת, כל האפליקציות של צד שלישי רצו באותו הקשר של SELinux, כך שהבידוד בין האפליקציות יושם בעיקר על ידי UID DAC.
  • ב-Android 6.0, ארגז החול של SELinux הורחב כדי לבודד אפליקציות מעבר לגבול של כל משתמש פיזי. בנוסף, ב-Android הוגדרו גם הגדרות ברירת מחדל בטוחות יותר לנתוני האפליקציות: באפליקציות עם targetSdkVersion >= 24, הרשאות ברירת המחדל של DAC בספריית הבית של האפליקציה השתנו מ-751 ל-700. כך אפשר היה להגדיר כברירת מחדל סטטוס מאובטח יותר לנתונים פרטיים של אפליקציות (אבל אפליקציות יכולות לשנות את הגדרות ברירת המחדל האלה).
  • ב-Android 8.0, כל האפליקציות הופעלו באמצעות מסנן seccomp-bpf שמגביל את קריאות ה-syscall שבהן האפליקציות מורשות להשתמש, וכך מחזק את הגבול בין האפליקציה לבין הליבה.
  • ב-Android 9, כל האפליקציות ללא הרשאות עם targetSdkVersion >= 28 חייבות לפעול בארגזי חול נפרדים של SELinux, שמספקים MAC לכל אפליקציה. ההגנה הזו משפרת את ההפרדה בין האפליקציות, מונעת שינוי של הגדרות ברירת המחדל הבטוחות (והחשובה ביותר) מונעת מאפליקציות להפוך את הנתונים שלהן לנגישים לכולם.
  • ב-Android 10, לאפליקציות יש תצוגה גולמית מוגבלת של מערכת הקבצים, ללא גישה ישירה לנתיבים כמו ‎ /sdcard/DCIM. עם זאת, לאפליקציות נשארת גישה מלאה לנתיב הגולמי של החבילה, כפי שהוא מוחזר על ידי כל שיטות הקריאה הרלוונטיות, כמו Context.getExternalFilesDir()‎.

הנחיות לשיתוף קבצים

הגדרת נתוני האפליקציה כגלובליים היא שיטה לא טובה לאבטחה. הגישה ניתנת לכולם, ולא ניתן להגביל אותה רק לנמענים המיועדים. השיטה הזו הובילה לדליפות של חשיפת מידע ולחולשות של גורמים זמניים, והיא יעד מועדף לתוכנות זדוניות שמטרגטות אפליקציות עם מידע רגיש (כמו תוכנות אימייל). ב-Android מגרסה 9 ואילך, אסור לאפליקציות עם targetSdkVersion>=28 לשתף קבצים בדרך הזו.

במקום לאפשר גישה לכולם לנתוני האפליקציה, כדאי לפעול לפי ההנחיות הבאות כשמשתפים קבצים:

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

הרשאת זמן הריצה Storage קובעת את הגישה לאוספים עם סוג מוגדר באמצעות MediaStore. כדי לגשת לקבצים עם סיווג רופף, כמו קובצי PDF והכיתה MediaStore.Downloads, אפליקציות צריכות להשתמש ב-intents כמו ה-intent ACTION_OPEN_DOCUMENT.

כדי להפעיל את ההתנהגות של Android 10, צריך להשתמש במאפיין המניפסט requestLegacyExternalStorage ולפעול בהתאם לשיטות המומלצות בנושא הרשאות לאפליקציות.

  • ערך ברירת המחדל של הדגל במניפסט הוא true לאפליקציות שמטרגטות את Android מגרסה 9 ומטה.
  • ערך ברירת המחדל הוא false לאפליקציות שמטרגטות את Android 10. כדי לבטל באופן זמני את ההסכמה להצגת תצוגת האחסון המסוננת באפליקציות שמטרגטות את Android 10, צריך להגדיר את הערך של דגל המניפסט כ-true.
  • באמצעות הרשאות מוגבלות, מנהל ההתקנה יוצר רשימת היתרים של אפליקציות שמותר להשתמש בהן לאחסון שלא בתוך ארגז חול. אפליקציות שלא נכללות ברשימת ההיתרים מועברות לארגז חול.