گیرنده های پخش ناامن

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

نمای کلی

گیرنده‌های پخش نادرست پیاده‌سازی شده می‌توانند به مهاجم اجازه دهند تا یک هدف مخرب ارسال کند تا برنامه آسیب‌پذیر اقداماتی را انجام دهد که برای تماس‌گیرندگان خارجی در نظر گرفته نشده است.

این آسیب‌پذیری عموماً به مواردی اشاره دارد که گیرنده‌ی پخش به طور ناخواسته صادر می‌شود، یا با تنظیم android:exported="true" در AndroidManifest یا با ایجاد یک گیرنده‌ی پخش به صورت برنامه‌نویسی که گیرنده را به طور پیش‌فرض عمومی می‌کند. اگر گیرنده حاوی هیچ فیلتر intent نباشد، مقدار پیش‌فرض "false" است، اما اگر گیرنده حداقل یک فیلتر intent داشته باشد، مقدار پیش‌فرض android:exported "true" است.

گیرنده‌های پخش عمداً صادر شده بدون کنترل دسترسی مناسب، در صورتی که توسعه‌دهنده قصد نداشته باشد که توسط همه برنامه‌ها فراخوانی شوند، می‌توانند مورد سوءاستفاده قرار گیرند.

تأثیر

گیرنده‌های پخش ناامن می‌توانند توسط یک مهاجم مورد سوءاستفاده قرار گیرند تا به دسترسی غیرمجاز برای اجرای رفتاری در برنامه دست یابند که توسعه‌دهنده قصد افشای آن به اشخاص ثالث را نداشته است.

کاهش‌ها

از مشکل کاملاً اجتناب کنید

برای حل کامل این معضل، exported روی false تنظیم کنید:

<receiver android:name=".MyReceiver" android:exported="false">
    <intent-filter>
        <action android:name="com.example.myapp.MY_ACTION" />
    </intent-filter>
</receiver>

از تماس‌ها و تماس‌های برگشتی استفاده کنید

در صورتی که از گیرنده‌های پخش برای اهداف داخلی برنامه (مثلاً اعلان تکمیل رویداد) استفاده کرده‌اید، می‌توانید کد خود را طوری تغییر دهید که یک تابع فراخوانی (callback) ارسال کند که پس از تکمیل رویداد اجرا شود.

شنونده‌ی تکمیل رویداد

کاتلین

interface EventCompletionListener {
    fun onEventComplete(data: String)
}

جاوا

public interface EventCompletionListener {
    public void onEventComplete(String data);
}
وظیفه امن

کاتلین

class SecureTask(private val listener: EventCompletionListener?) {
    fun executeTask() {
        // Do some work...

        // Notify that the event is complete
        listener?.onEventComplete("Some secure data")
    }
}

جاوا

public class SecureTask {

    final private EventCompletionListener listener;

    public SecureTask(EventCompletionListener listener) {
        this.listener = listener;
    }

    public void executeTask() {
        // Do some work...

        // Notify that the event is complete
        if (listener != null) {
            listener.onEventComplete("Some secure data");
        }
    }
}
فعالیت اصلی

کاتلین

class MainActivity : AppCompatActivity(), EventCompletionListener {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val secureTask = SecureTask(this)
        secureTask.executeTask()
    }

    override fun onEventComplete(data: String) {
        // Handle event completion securely
        // ...
    }
}

جاوا

public class MainActivity extends AppCompatActivity implements EventCompletionListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        SecureTask secureTask = new SecureTask(this);
        secureTask.executeTask();
    }

    @Override
    public void onEventComplete(String data) {
        // Handle event completion securely
        // ...
    }
}

گیرنده‌های پخش امن با مجوزها

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

منابع