دسته OWASP: MASVS-PLATFORM: تعامل پلتفرم
نمای کلی
یک PendingIntent ارجاعی به یک توکن است که توسط سیستم نگهداری میشود. برنامه A میتواند یک PendingIntent را به برنامه B منتقل کند تا به برنامه B اجازه دهد اقدامات از پیش تعریف شده را از طرف برنامه A اجرا کند؛ صرف نظر از اینکه برنامه A هنوز فعال باشد یا خیر.
ریسک: اهداف در حال انتظار قابل تغییر
یک PendingIntent میتواند تغییرپذیر باشد، به این معنی که intent درونی که عمل را مشخص میکند، میتواند توسط برنامه B و با پیروی از منطق شرح داده شده در مستندات fillIn() بهروزرسانی شود. به عبارت دیگر، فیلدهای پر نشده یک PendingIntent میتوانند توسط یک برنامه مخرب تغییر داده شوند و به اجزای صادر نشده برنامه آسیبپذیر دسترسی پیدا کنند.
تأثیر
تأثیر این آسیبپذیری بسته به پیادهسازی عملکرد هدفگیریشدهی صادرنشدهی برنامه، متفاوت است.
کاهشها
عمومی
مطمئن شوید که action، component و package برای جلوگیری از بدترین آسیبپذیریها تنظیم شدهاند:
کاتلین
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);
پرچم تغییرناپذیر
اگر برنامه شما اندروید ۶ (سطح API ۲۳) یا بالاتر را هدف قرار میدهد، قابلیت تغییرپذیری را مشخص کنید . برای مثال، این کار را میتوان با استفاده از 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);
در اندروید ۱۱ (سطح API 30) و بالاتر، باید مشخص کنید کدام فیلدها قابل تغییر هستند، که این امر آسیبپذیریهای تصادفی از این نوع را کاهش میدهد.
منابع
ریسک: اجرای مجدد اهداف در انتظار
یک PendingIntent میتواند دوباره اجرا شود مگر اینکه پرچم FLAG_ONE_SHOT تنظیم شده باشد. استفاده از FLAG_ONE_SHOT برای جلوگیری از حملات دوباره اجرا (انجام اقداماتی که نباید تکرار شوند) مهم است.
تأثیر
تأثیر این آسیبپذیری بسته به پیادهسازی سمت گیرندهی intent متفاوت است. یک برنامهی مخرب که از یک PendingIntent که بدون تنظیم پرچم FLAG_ONE_SHOT ایجاد شده است، سوءاستفاده میکند، میتواند intent را ضبط کرده و مجدداً از آن برای تکرار اقداماتی که فقط باید یک بار انجام شوند، استفاده کند.
کاهشها
Intentهای در حال انتظار که قرار نیست چندین بار اجرا شوند، باید از پرچم 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);
منابع
منابع
{% کلمه به کلمه %}برای شما توصیه میشود
- توجه: متن لینک زمانی نمایش داده میشود که جاوا اسکریپت غیرفعال باشد.
- تغییر مسیر هدف