असुरक्षित ब्रॉडकास्ट रिसीवर

OWASP कैटगरी: MASVS-PLATFORM: Platform Interaction

खास जानकारी

ब्रॉडकास्ट रिसीवर को गलत तरीके से लागू करने पर, हमलावर नुकसान पहुंचाने वाले इंटेंट भेज सकता है. इससे कमज़ोर ऐप्लिकेशन ऐसी कार्रवाइयां कर सकता है जो बाहरी कॉलर के लिए नहीं होती हैं.

आम तौर पर, इस जोखिम का मतलब ऐसे उदाहरणों से है जहां ब्रॉडकास्ट रिसीवर को अनजाने में एक्सपोर्ट किया जाता है. ऐसा AndroidManifest में android:exported="true" सेट करके या प्रोग्राम के हिसाब से ब्रॉडकास्ट रिसीवर बनाकर किया जाता है. इससे रिसीवर डिफ़ॉल्ट रूप से सार्वजनिक हो जाता है. अगर रिसीवर में कोई इंटेंट फ़िल्टर नहीं है, तो डिफ़ॉल्ट वैल्यू "false" होती है. हालांकि, अगर रिसीवर में कम से कम एक इंटेंट फ़िल्टर है, तो 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>

कॉल और कॉलबैक का इस्तेमाल करना

अगर आपने ऐप्लिकेशन के अंदरूनी कामों के लिए ब्रॉडकास्ट रिसीवर का इस्तेमाल किया है (जैसे, इवेंट पूरा होने की सूचना), तो अपने कोड को फिर से स्ट्रक्चर किया जा सकता है. इससे इवेंट पूरा होने के बाद, कॉलबैक पास किया जा सकेगा.

इवेंट पूरा होने का लिसनर

Kotlin

interface EventCompletionListener {
    fun onEventComplete(data: String)
}

Java

public interface EventCompletionListener {
    public void onEventComplete(String data);
}
टास्क को सुरक्षित करना

Kotlin

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

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

Java

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");
        }
    }
}
मुख्य गतिविधि

Kotlin

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

Java

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

अनुमतियों के साथ ब्रॉडकास्ट रिसीवर सुरक्षित करना

सिर्फ़ सुरक्षित ब्रॉडकास्ट (ऐसे ब्रॉडकास्ट जिन्हें सिर्फ़ सिस्टम लेवल के ऐप्लिकेशन भेज सकते हैं) या खुद के बताए गए सिग्नेचर लेवल की अनुमतियों के लिए डाइनैमिक रिसीवर रजिस्टर करें.

संसाधन