קטגוריה ב-OWASP: MASVS-PLATFORM: Platform Interaction
סקירה כללית
PendingIntent
הוא הפניה לאסימון שמתוחזק על ידי המערכת. אפליקציה א' יכולה להעביר PendingIntent לאפליקציה ב' כדי לאפשר לאפליקציה ב' לבצע פעולות מוגדרות מראש בשם אפליקציה א', גם אם אפליקציה א' עדיין פעילה.
סיכון: Mutable Pending Intents
אובייקט PendingIntent יכול להיות ניתן לשינוי, כלומר אפליקציה ב' יכולה לעדכן את ה-Intent הפנימי שמציין את הפעולה לפי הלוגיקה שמתוארת במסמכי העזרה של fillIn()
. במילים אחרות, אפליקציה זדונית יכולה לשנות את השדות הלא מלאים של PendingIntent ולאפשר גישה לרכיבים של האפליקציה הפגיעה שלא מיוצאים בדרך אחרת.
השפעה
ההשפעה של נקודת החולשה הזו משתנה בהתאם להטמעה של הפונקציונליות המטורגטת שלא מיוצאת מהאפליקציה.
פעולות מיטיגציה
כללי
מוודאים שהפעולה, הרכיב והחבילה מוגדרים כדי למנוע את נקודות החולשה החמורות ביותר:
Kotlin
val intent = Intent(intentAction)
// Or other component setting APIs e.g. setComponent, setClass
intent.setClassName(packageName, className)
PendingIntent pendingIntent =
PendingIntent.getActivity(
context,
/* requestCode = */ 0,
intent, /* flags = */ PendingIntent.FLAG_IMMUTABLE
)
Java
Intent intent = new Intent(intentAction);
// Or other component setting APIs e.g. setComponent, setClass
intent.setClassName(packageName, className);
PendingIntent pendingIntent =
PendingIntent.getActivity(
getContext(),
/* requestCode= */ 0,
intent, /* flags= */ 0);
סימון IMMUTABLE
אם האפליקציה שלכם מטרגטת ל-Android 6 (רמת API 23) ואילך, צריך לציין את יכולת השינוי. לדוגמה, אפשר לעשות זאת באמצעות FLAG_IMMUTABLE
כדי למנוע מאפליקציה זדונית למלא שדות לא מלאים:
Kotlin
val pendingIntent =
PendingIntent.getActivity(
context,
/* requestCode = */ 0,
Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE)
Java
PendingIntent pendingIntent =
PendingIntent.getActivity(
getContext(),
/* requestCode= */ 0,
new Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE);
ב-Android 11 (רמת API 30) ואילך, צריך לציין אילו שדות יהיו משתנים. כך ניתן לצמצם נקודות חולשה מקריות מסוג זה.
משאבים
סיכון: הפעלה חוזרת של כוונות בהמתנה
אפשר להפעיל מחדש PendingIntent אלא אם מוגדר הדגל FLAG_ONE_SHOT. חשוב להשתמש ב-FLAG_ONE_SHOT כדי למנוע התקפות שחזור (ביצוע פעולות שאסור לחזור עליהן).
השפעה
ההשפעה של נקודת החולשה הזו משתנה בהתאם להטמעה של הקצה המקבל של הכוונה. אפליקציה זדונית שמנצלת PendingIntent שנוצר בלי להגדיר את הדגל FLAG_ONE_SHOT עלולה לתעד את ה-intent ולהשתמש בו שוב כדי לחזור על פעולות שצריך לבצע רק פעם אחת.
פעולות מיטיגציה
כדי למנוע התקפות של הפעלה חוזרת, צריך להשתמש בדגל FLAG_ONE_SHOT ב-Intents בהמתנה שלא נועדו להפעיל פעמים רבות.
Kotlin
val pendingIntent =
PendingIntent.getActivity(
context,
/* requestCode = */ 0,
Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_ONE_SHOT)
Java
PendingIntent pendingIntent =
PendingIntent.getActivity(
getContext(),
/* requestCode= */ 0,
new Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_ONE_SHOT);
משאבים
משאבים
מומלץ עבורך
- הערה: טקסט הקישור מוצג כש-JavaScript מושבת
- הפניה אוטומטית של כוונה