قصد معوق

دسته OWASP: MASVS-PLATFORM: تعامل پلاتفرم

نمای کلی

PendingIntent ارجاعی به یک توکن است که توسط سیستم نگهداری می‌شود. برنامه A می‌تواند PendingIntent را به برنامه B منتقل کند تا به برنامه B اجازه دهد کنش‌های ازپیش تعریف‌شده را ازطرف برنامه A اجرا کند؛ صرف‌نظر از اینکه برنامه A هنوز فعال باشد یا نه.

خطر: قصد معوق تغییرپذیر

«هدف تعلیقی» می‌تواند تغییرپذیر باشد، یعنی هدف داخلی که کنش را مشخص می‌کند می‌تواند توسط برنامه 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);

پرچم IMMUTABLE

اگر برنامه شما Android 6 (سطح میانای برنامه‌سازی کاربردی ۲۳) یا بالاتر را هدف قرار می‌دهد، تغییرپذیری را مشخص کنید. برای مثال، این کار را می‌توان بااستفاده از 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);

در Android نسخه ۱۱ (سطح میانای برنامه‌سازی کاربردی ۳۰) و بالاتر، باید مشخص کنید کدام فیلدها تغییرپذیر باشند، که این کار آسیب‌پذیری‌های تصادفی از این نوع را کاهش می‌دهد.

منابع


خطر: بازپخش کردن «قصد معوق»

PendingIntent را می‌توان بازپخش کرد مگراینکه پرچم FLAG_ONE_SHOT تنظیم شده باشد. استفاده از FLAG_ONE_SHOT برای جلوگیری از حملات بازپخش (انجام اقداماتی که نباید تکرار شوند) مهم است.

تأثیر

تأثیر این آسیب‌پذیری بسته به پیاده‌سازی انتهای گیرنده هدف متفاوت است. برنامه مخربی که از 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);

منابع


منابع

  • توجه: وقتی جاوا اسکریپت خاموش باشد، نوشتار پیوند نمایش داده می‌شود
  • هدایت هدف