دسته OWASP: MASVS-PLATFORM: پلتفرم تعامل
نمای کلی
PendingIntent
اشاره ای به توکنی است که توسط سیستم نگهداری می شود. برنامه A می تواند یک PendingIntent را به برنامه B ارسال کند تا به برنامه B اجازه دهد تا اقدامات از پیش تعریف شده را از طرف برنامه A انجام دهد. صرف نظر از اینکه برنامه A هنوز زنده است یا خیر.
ریسک: اهداف معلق قابل تغییر
یک PendingIntent میتواند تغییرپذیر باشد، به این معنی که هدف داخلی که عمل را مشخص میکند، میتواند توسط برنامه B به دنبال منطق توضیح داده شده در مستندات fillIn()
بهروزرسانی شود. به عبارت دیگر، فیلدهای پر نشده یک PendingIntent را می توان توسط یک برنامه مخرب تغییر داد و اجازه دسترسی به اجزای غیرصادرات نشده برنامه آسیب پذیر را می دهد.
تاثیر
تأثیر این آسیب پذیری بسته به اجرای عملکرد هدفمند صادر نشده برنامه متفاوت است.
اقدامات کاهشی
ژنرال
مطمئن شوید که عملکرد، مؤلفه و بسته برای جلوگیری از بدترین آسیبپذیریها تنظیم شدهاند:
کاتلین
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
)
جاوا
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);
پرچم تغییرناپذیر
اگر برنامه شما Android 6 (سطح API 23) یا بالاتر را هدف قرار میدهد، قابلیت تغییرپذیری را مشخص کنید . به عنوان مثال، این کار را می توان با استفاده از FLAG_IMMUTABLE
برای جلوگیری از پر شدن فیلدهای پر نشده توسط یک برنامه مخرب انجام داد:
کاتلین
val pendingIntent =
PendingIntent.getActivity(
context,
/* requestCode = */ 0,
Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE)
جاوا
PendingIntent pendingIntent =
PendingIntent.getActivity(
getContext(),
/* requestCode= */ 0,
new Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE);
در اندروید 11 (سطح API 30) و بالاتر، باید مشخص کنید که کدام فیلدها را تغییر دهید، که آسیبپذیریهای تصادفی از این نوع را کاهش میدهد.
منابع
ریسک: بازپخش اهداف معلق
یک PendingIntent میتواند دوباره پخش شود مگر اینکه پرچم FLAG_ONE_SHOT تنظیم شده باشد. استفاده از FLAG_ONE_SHOT برای جلوگیری از حملات مجدد (انجام اقداماتی که نباید تکرار شوند) مهم است.
تاثیر
تاثیر این آسیب پذیری بسته به اجرای انتهای دریافت کننده intent متفاوت است. یک برنامه مخرب که از یک PendingIntent که بدون تنظیم پرچم FLAG_ONE_SHOT ایجاد شده است سوء استفاده میکند، میتواند این قصد را برای تکرار اقداماتی که فقط یک بار میتوان انجام داد، ضبط کرده و دوباره استفاده کرد.
اقدامات کاهشی
اهداف معلق که قرار نیست چندین بار اجرا شوند باید از پرچم FLAG_ONE_SHOT استفاده کنند تا از حملات مجدد جلوگیری شود.
کاتلین
val pendingIntent =
PendingIntent.getActivity(
context,
/* requestCode = */ 0,
Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_ONE_SHOT)
جاوا
PendingIntent pendingIntent =
PendingIntent.getActivity(
getContext(),
/* requestCode= */ 0,
new Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_ONE_SHOT);
منابع
منابع
{% کلمه به کلمه %}برای شما توصیه می شود
- توجه: وقتی جاوا اسکریپت خاموش است، متن پیوند نمایش داده می شود
- تغییر مسیر قصد