קטגוריה ב-OWASP: MASVS-PLATFORM: Platform Interaction
סקירה כללית
הרשאה ב-Android היא מזהה מחרוזת שמוצהר במניפסט של האפליקציה כדי לבקש גישה לנתונים או לפעולות מוגבלים, והיא נאכפת בזמן הריצה על ידי מסגרת Android.
רמות ההרשאות ב-Android מציינות את הסיכון הפוטנציאלי שמשויך להרשאה:
- רגיל: הרשאות עם סיכון נמוך שניתנות אוטומטית בזמן ההתקנה
- מסוכנות: הרשאות בסיכון גבוה שיכולות לאפשר גישה לנתונים רגישים של משתמשים, שדורשות אישור מפורש מהמשתמש בזמן הריצה
- חתימה: ניתנת רק לאפליקציות שנחתמו באותו אישור כמו האפליקציה שמצהירה על ההרשאה. בדרך כלל משמשת לאפליקציות מערכת או לאינטראקציות בין אפליקציות מאותו מפתח.
פגיעויות שקשורות לאמצעי בקרה לגישה מבוססת-הרשאות מתרחשות כשמרכיב של אפליקציה (כמו פעילות, מקלט, ספק תוכן או שירות) עומד בכל הקריטריונים הבאים:
- הרכיב לא משויך לאף
android:permissionב-Manifest. - הרכיב מבצע משימה רגישה שיש לה הרשאה שהמשתמש כבר אישר;
- הרכיב מיוצא.
- הרכיב לא מבצע בדיקות הרשאות ידניות (ברמת המניפסט או הקוד);
במקרים כאלה, אפליקציה זדונית יכולה לבצע פעולות רגישות על ידי ניצול לרעה של ההרשאות של הרכיב הפגיע, והעברת ההרשאות של האפליקציה הפגיעה לאפליקציה הזדונית.
השפעה
אפשר להשתמש בייצוא של רכיבים פגיעים כדי לקבל גישה למשאבים רגישים או כדי לבצע פעולות רגישות. ההשפעה של ההתנהגות הלא רצויה הזו תלויה בהקשר של הרכיב הפגיע ובהרשאות שלו.
אמצעי צמצום סיכונים
דרישת הרשאות למשימות רגישות
כשמייצאים רכיב עם הרשאות רגישות, צריך לדרוש את אותן הרשאות לכל בקשה נכנסת. בסביבת הפיתוח המשולבת (IDE) של Android Studio יש בדיקות lint למקבלים ולשירותים, כדי לזהות את נקודת החולשה הזו ולהמליץ על דרישת ההרשאות המתאימות.
מפתחים יכולים לדרוש הרשאות לבקשות נכנסות על ידי הצהרה עליהן בקובץ Manifest או ברמת הקוד בזמן הטמעת השירות, כמו בדוגמאות הבאות.
Xml
<manifest ...>
<uses-permission android:name="android.permission.READ_CONTACTS" />
<application ...>
<service android:name=".MyExportService"
android:exported="true"
android:permission="android.permission.READ_CONTACTS" />
</application>
</manifest>
Kotlin
class MyExportService : Service() {
private val binder = MyExportBinder()
override fun onBind(intent: Intent): IBinder? {
// Enforce calling app has the required permission
enforceCallingPermission(Manifest.permission.READ_CONTACTS, "Calling app doesn't have READ_CONTACTS permission.")
// Permission is enforced, proceed with export logic
return binder
}
// Inner class for your Binder implementation
private inner class MyExportBinder : Binder() {
// Permission is enforced, proceed with export logic
}
}
Java
public class MyExportService extends Service {
@Override
public IBinder onBind(Intent intent) {
// Enforce calling app has the required permission
enforceCallingPermission(Manifest.permission.READ_CONTACTS, "Calling app doesn't have READ_CONTACTS permission.");
return binder;
}
// Inner class for your Binder implementation
private class MyExportBinder extends Binder {
// Permission is enforced, proceed with export logic
}
}
לא לייצא את הרכיב
מומלץ להימנע מייצוא רכיבים עם גישה למשאבים רגישים, אלא אם הדבר נחוץ לחלוטין. כדי לעשות את זה, צריך להגדיר את android:exported בקובץ Manifest כ-false עבור הרכיב. מ-רמת API 31 ואילך, המאפיין הזה מוגדר כ-falseכברירת מחדל.
Xml
<activity
android:name=".MyActivity"
android:exported="false"/>
החלת הרשאות מבוססות-חתימה
כשמשתפים נתונים בין שתי אפליקציות שאתם שולטים בהן או שהן בבעלותכם, צריך להשתמש בהרשאות מבוססות חתימה. ההרשאות האלה לא דורשות אישור מהמשתמש. במקום זאת, המערכת בודקת שהאפליקציות שניגשות לנתונים חתומות באמצעות אותו מפתח חתימה. ההגדרה הזו מאפשרת חוויית משתמש יעילה ומאובטחת יותר. אם אתם מצהירים על הרשאות מותאמות אישית, כדאי לעיין בהנחיות האבטחה המתאימות.
Xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<permission android:name="my_custom_permission_name"
android:protectionLevel="signature" />
נקודות קצה למשימה יחידה
מטמיעים את האפליקציה בהתאם לעיקרון התכנון של הפרדת נושאים. כל נקודת קצה צריכה לבצע רק קבוצה קטנה של משימות ספציפיות עם הרשאות ספציפיות. בנוסף, שיטת העיצוב הטובה הזו מאפשרת למפתח להחיל הרשאות ברמת גרנולריות גבוהה לכל נקודת קצה. לדוגמה, לא מומלץ ליצור נקודת קצה אחת שמשמשת גם ליומן וגם לאנשי קשר.
משאבים
- גישה ל-Android לרכיבים מוגנים באפליקציה מהבלוג של Oversecured
- שיטות מומלצות לספקי תוכן
- הרשאות בזמן ריצה (מסוכנות)
- עקרון התכנון של הפרדת דאגות (Separation of Concerns)
- מסמכי ההנחיות בנושא הרשאות ב-Android
- טיפים לאבטחה של מקלטי שידור ב-Android
- טיפים לאבטחת שירותי Android
- ב-Android 12 (API 31) ערך ברירת המחדל של הייצוא מוגדר כ-false
- בדיקת Lint: לא אמור להיות ייצוא של PreferenceActivity
- בדיקת Lint: אין צורך בהרשאה עבור הנמען המיוצא
- בדיקת Lint: אין צורך בהרשאה כדי לייצא שירות