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

دسته 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>

از تماس ها و تماس ها استفاده کنید

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

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

کاتلین

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
        // ...
    }
}

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

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

منابع