פלטפורמת Android משתמשת בהגנה מבוססת-משתמש של Linux כדי לזהות ולבודד משאבי אפליקציות. כך האפליקציות מבודדות זו מזו, והאפליקציות והמערכת מוגנות מאפליקציות זדוניות. לשם כך, Android מקצה מזהה משתמש ייחודי (UID) לכל אפליקציה ל-Android ומפעיל אותו בעצמו תהליך האימות.
מערכת Android משתמשת ב-UID כדי להגדיר ארגז חול לאפליקציות ברמת הליבה. הליבה אוכפת את האבטחה בין האפליקציות למערכת ברמת התהליך באמצעות שירותים רגילים של Linux, כמו מזהי משתמשים וקבוצות שמוקצים לאפליקציות. כברירת מחדל, אפליקציות לא יכולות לתקשר זו עם זו, והן מוגבלות למערכת ההפעלה. אם אפליקציה א' תנסה לבצע פעולה זדונית, כמו לקרוא את הנתונים של אפליקציה ב' או להתקשר בטלפון ללא רשות, היא לא תוכל לעשות זאת כי אין לה את הרשאות ברירת המחדל המתאימות למשתמש. ארגז החול פשוט, ניתן לבדיקות והוא מבוסס על הפרדה של משתמשים בתהליכים ובהרשאות קבצים בסגנון UNIX שנמצאת בשימוש כבר עשרות שנים.
מכיוון שארגז החול של האפליקציות נמצא בליבה, מודל האבטחה הזה חל גם על קוד מקורי וגם על אפליקציות של מערכת ההפעלה. כל התוכנות שנמצאות מעל ליבה (kernel), למשל ספריות של מערכת הפעלה, app framework, סביבת זמן ריצה של אפליקציה ו כל האפליקציות, פועלות בתוך 'ארגז החול לאפליקציות'. בפלטפורמות מסוימות, מפתחים מוגבלים למסגרת פיתוח ספציפית, לקבוצה של ממשקי API, בשפת היעד. ב-Android אין הגבלות על האופן שבו אפשר לכתוב אפליקציה שנדרשות לאכיפת האבטחה. מבחינה זו, קוד מקורי נמצא באותה סביבה של ארגז חול כמו קוד מפורש.
הגנות
באופן כללי, כדי לפרוץ מארגז החול של האפליקציות במכשיר שהוגדר בצורה תקינה, צריך לפגוע באבטחה של ליבה של Linux. עם זאת, בדומה לתכונות אבטחה אחרות, אמצעי הגנה נפרדים לא יכולים להגן על ארגז החול של האפליקציה מפני כל התקפה, ולכן חשוב להשתמש בהגנה לעומק כדי למנוע מנקודות חולשה בודדות לגרום לפגיעה במערכת ההפעלה או באפליקציות אחרות.
מערכת Android משתמשת בכמה אמצעי הגנה כדי לאכוף את האפליקציה Sandbox. אמצעי האכיפה האלה הוטמעו לאורך זמן, והם חיזקו באופן משמעותי את ארגז החול המקורי של בקרת הגישה הדיסקרטיטיבית (DAC) שמבוססת על UID. הגרסאות הקודמות של Android כללו את הסוגים הבאים הגנות:
- ב-Android 5.0, SELinux סיפק הפרדה של בקרת גישה חובה (MAC) בין המערכת לאפליקציות. עם זאת, כל האפליקציות של צד שלישי פעלו באותו הקשר של SELinux, כך שבידוד בין אפליקציות נאכף בעיקר על ידי UID DAC.
- ב-Android 6.0, ארגז החול של SELinux הורחב כדי לבודד אפליקציות בכל
גבול פיזי למשתמש. בנוסף, Android מגדיר ברירות מחדל בטוחות יותר עבור
נתוני אפליקציה: לאפליקציות עם
targetSdkVersion >= 24
, ברירת המחדל הרשאות DAC ב-Home של האפליקציה השתנו מ-751 ל-700. הנתון הזה ברירת מחדל בטוחה יותר לנתונים פרטיים של אפליקציות (למרות שאפליקציות יכולות לעקוף את ההגדרות האלה ברירות המחדל). - ב-Android 8.0, כל האפליקציות הוגדרו לפעול עם
seccomp-bpf
מסנן שמגביל את ה-syscalls שבהם אפליקציות היו מורשות להשתמש, וכך חיזוק של גבולות האפליקציה/הליבה. - ב-Android 9, כל האפליקציות ללא הרשאות עם
targetSdkVersion >= 28
חייבות לפעול בארגזי חול נפרדים של SELinux, ולספק MAC לכל אפליקציה במצב בסיסי. ההגנה הזו משפרת את הפרדת האפליקציות ומונעת התנגשות בין אפליקציות כברירת מחדל, ו (החשוב ביותר) למנוע מאפליקציות ליצור את עולם הנתונים שלהן נגיש. - ב-Android 10, לאפליקציות יש תצוגה גולמית מוגבלת של מערכת הקבצים, ללא גישה ישירה לנתיבים כמו /sdcard/DCIM. אבל, באפליקציות לשמור את הגישה הגולמית המלאה לנתיבים הספציפיים לחבילות, כפי שהוחזר על ידי באמצעות שיטות רלוונטיות, כמו Context.getExternalFilesDir().
הנחיות לשיתוף קבצים
הגדרת נתוני האפליקציה כגלובליים היא שיטה לא טובה מבחינת אבטחה. הגישה ניתנת לכולם, ולא ניתן להגביל אותה רק לנמענים המיועדים. השיטה הזו הובילה להדלפות מידע של גילוי נאות, ולבלבול
נקודות חולשה, והיא יעד מועדף לתוכנות זדוניות שמטרגטות אפליקציות
עם מידע אישי רגיש (כמו תוכנות אימייל). ב-Android מגרסה 9 ואילך, אסור לאפליקציות עם targetSdkVersion>=28
לשתף קבצים בדרך הזו.
במקום שנתוני האפליקציה יהיו נגישים בכל העולם, כדאי לפעול לפי ההנחיות הבאות כשמשתפים קבצים:
- אם האפליקציה שלכם צריכה לשתף קבצים עם אפליקציה אחרת, צריך להשתמש בספק תוכן. ספקי תוכן משתפים נתונים ברמת הפירוט המתאימה וללא חסרונות רבים של הרשאות UNIX עם גישה לעולם פרטים נוספים, אפשר לעיין במאמר מידע בסיסי על ספקי תוכן).
- אם לאפליקציה יש קבצים שבאמת צריכים להיות נגישים לעולם (כמו תמונות), הם חייבים להיות ספציפיים למדיה (תמונות, סרטונים וקובצי אודיו) בלבד) ונשמרים באמצעות מחלקה של MediaStore. (איך מוסיפים פריט מדיה)
הרשאת הגישה בזמן הריצה לאחסון שולטת בגישה
לאוספים בהקלדה מחמירה דרך MediaStore.
כדי לגשת לקבצים עם סיווג רופף, כמו קובצי PDF והכיתה MediaStore.Downloads, אפליקציות צריכות להשתמש ב-Intents כמו ה-Intent ACTION_OPEN_DOCUMENT
.
כדי להפעיל את ההתנהגות של Android 10, צריך להשתמש במאפיין המניפסט requestLegacyExternalStorage
ולפעול בהתאם לשיטות המומלצות בנושא הרשאות לאפליקציות.
- ערך ברירת המחדל של הדגל במניפסט הוא
true
לאפליקציות שמטרגטות את Android מגרסה 9 ומטה. - ערך ברירת המחדל הוא false לאפליקציות שמטרגטות את Android 10. כדי לבטל באופן זמני את השימוש בסינון
תצוגת אחסון באפליקציות שמטרגטות את Android 10,
מגדירים את הערך של דגל המניפסט ל-
true
. - בשימוש בהרשאות מוגבלות, מנהל ההתקנה מוסיף אפליקציות לרשימת ההיתרים מותר באחסון שאינו בארגז חול. אפליקציות שאינן ברשימת ההיתרים הן שארגז חול.