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

OWASP कैटगरी: MASVS-PLATFORM: प्लैटफ़ॉर्म इंटरैक्शन

खास जानकारी

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

आम तौर पर, इस तरह की समस्या तब होती है, जब ब्रॉडकास्ट रिसीवर को अनजाने में एक्सपोर्ट कर दिया जाता है. ऐसा, 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
        // ...
    }
}

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

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

संसाधन