অনিরাপদ সম্প্রচার রিসিভার
সেভ করা পৃষ্ঠা গুছিয়ে রাখতে 'সংগ্রহ' ব্যবহার করুন
আপনার পছন্দ অনুযায়ী কন্টেন্ট সেভ করুন ও সঠিক বিভাগে রাখুন।
OWASP বিভাগ: MASVS-প্ল্যাটফর্ম: প্ল্যাটফর্ম ইন্টারঅ্যাকশন
ওভারভিউ
অনুপযুক্তভাবে প্রয়োগ করা সম্প্রচার রিসিভারগুলি একটি আক্রমণকারীকে একটি দূষিত উদ্দেশ্য প্রেরণের অনুমতি দিতে পারে যাতে দুর্বল অ্যাপ্লিকেশনটি এমন কাজগুলি সম্পাদন করে যা বহিরাগত কলারদের উদ্দেশ্যে নয়।
দুর্বলতা বলতে সাধারণত এমন দৃষ্টান্তগুলিকে বোঝায় যেখানে সম্প্রচার রিসিভার অনিচ্ছাকৃতভাবে রপ্তানি করা হয়, হয় AndroidManifest-এ android:exported="true"
সেট করে অথবা প্রোগ্রাম্যাটিকভাবে একটি ব্রডকাস্ট রিসিভার তৈরি করে যা রিসিভারকে ডিফল্টরূপে সর্বজনীন করে তোলে। যদি রিসিভারে কোনো ইনটেন্ট ফিল্টার না থাকে তবে ডিফল্ট মান "false"
কিন্তু যদি রিসিভারে অন্তত একটি অভিপ্রায় ফিল্টার থাকে তাহলে android:exported-এর ডিফল্ট মান হল "true"
।
সঠিক অ্যাক্সেস নিয়ন্ত্রণ ছাড়াই ইচ্ছাকৃতভাবে রপ্তানি করা সম্প্রচার রিসিভার অপব্যবহার করা যেতে পারে যদি ডেভেলপার এটিকে সমস্ত অ্যাপ্লিকেশন দ্বারা কল করার ইচ্ছা না করে।
প্রভাব
অনিরাপদভাবে বাস্তবায়িত ব্রডকাস্ট রিসিভারগুলিকে আক্রমণকারী দ্বারা অপব্যবহার করা হতে পারে যাতে অ্যাপ্লিকেশনটিতে এমন আচরণ চালানোর জন্য অননুমোদিত অ্যাক্সেস পেতে পারে যা বিকাশকারী তৃতীয় পক্ষের কাছে প্রকাশ করতে চাননি।
প্রশমন
সমস্যাটি সম্পূর্ণভাবে এড়িয়ে চলুন
সম্পূর্ণরূপে দ্বিধা সমাধান করতে, false
exported
সেট:
<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
// ...
}
}
অনুমতি সহ সুরক্ষিত সম্প্রচার রিসিভার
শুধুমাত্র সুরক্ষিত সম্প্রচারের জন্য ডায়নামিক রিসিভার নিবন্ধন করুন (সম্প্রচার যা শুধুমাত্র সিস্টেম স্তরের অ্যাপ্লিকেশন পাঠাতে পারে) অথবা স্ব-ঘোষিত স্বাক্ষর স্তরের অনুমতি সহ।
সম্পদ
এই পৃষ্ঠার কন্টেন্ট ও কোডের নমুনাগুলি Content License-এ বর্ণিত লাইসেন্সের অধীনস্থ। Java এবং OpenJDK হল Oracle এবং/অথবা তার অ্যাফিলিয়েট সংস্থার রেজিস্টার্ড ট্রেডমার্ক।
2025-07-29 UTC-তে শেষবার আপডেট করা হয়েছে।
[[["সহজে বোঝা যায়","easyToUnderstand","thumb-up"],["আমার সমস্যার সমাধান হয়েছে","solvedMyProblem","thumb-up"],["অন্যান্য","otherUp","thumb-up"]],[["এতে আমার প্রয়োজনীয় তথ্য নেই","missingTheInformationINeed","thumb-down"],["খুব জটিল / অনেক ধাপ","tooComplicatedTooManySteps","thumb-down"],["পুরনো","outOfDate","thumb-down"],["অনুবাদ সংক্রান্ত সমস্যা","translationIssue","thumb-down"],["নমুনা / কোড সংক্রান্ত সমস্যা","samplesCodeIssue","thumb-down"],["অন্যান্য","otherDown","thumb-down"]],["2025-07-29 UTC-তে শেষবার আপডেট করা হয়েছে।"],[],[],null,["# Insecure broadcast receivers\n\n\u003cbr /\u003e\n\n**OWASP category:** [MASVS-PLATFORM: Platform Interaction](https://mas.owasp.org/MASVS/09-MASVS-PLATFORM)\n\nOverview\n--------\n\nImproperly implemented broadcast receivers can allow an attacker to send a\nmalicious intent to make the vulnerable application perform actions which are\nnot intended for external callers.\n\nThe vulnerability generally refers to instances where the broadcast receiver is\nunintentionally exported, either by setting [`android:exported=\"true\"`](/guide/topics/manifest/receiver-element#exported) in\nthe AndroidManifest or by creating a broadcast receiver programmatically which\nmakes the receiver public by default. If the receiver doesn't contain any intent\nfilters the default value is `\"false\"` but if the receiver contains at least one\nintent filter the default value of android:exported is `\"true\"`.\n\nIntentionally exported broadcast receivers without proper access control can be\nabused if the developer did not intend for it to be called by all applications.\n\nImpact\n------\n\nInsecurely implemented broadcast receivers can be abused by an attacker to gain\nunauthorized access to execute behavior in the application that the developer\ndid not mean to expose to third parties.\n\nMitigations\n-----------\n\n### Avoid the problem entirely\n\nTo resolve the dilemma entirely, set `exported` to `false`: \n\n \u003creceiver android:name=\".MyReceiver\" android:exported=\"false\"\u003e\n \u003cintent-filter\u003e\n \u003caction android:name=\"com.example.myapp.MY_ACTION\" /\u003e\n \u003c/intent-filter\u003e\n \u003c/receiver\u003e\n\n### Use calls and callbacks\n\nIn the case you used broadcast receivers for internal app purposes (ie. event\ncompletion notification), you can restructure your code to pass a callback that\nwould fire after event completion instead.\n\n###### Event completion listener\n\n### Kotlin\n\n interface EventCompletionListener {\n fun onEventComplete(data: String)\n }\n\n### Java\n\n public interface EventCompletionListener {\n public void onEventComplete(String data);\n }\n\n###### Secure task\n\n### Kotlin\n\n class SecureTask(private val listener: EventCompletionListener?) {\n fun executeTask() {\n // Do some work...\n\n // Notify that the event is complete\n listener?.onEventComplete(\"Some secure data\")\n }\n }\n\n### Java\n\n public class SecureTask {\n\n final private EventCompletionListener listener;\n\n public SecureTask(EventCompletionListener listener) {\n this.listener = listener;\n }\n\n public void executeTask() {\n // Do some work...\n\n // Notify that the event is complete\n if (listener != null) {\n listener.onEventComplete(\"Some secure data\");\n }\n }\n }\n\n###### Main activity\n\n### Kotlin\n\n class MainActivity : AppCompatActivity(), EventCompletionListener {\n override fun onCreate(savedInstanceState: Bundle?) {\n super.onCreate(savedInstanceState)\n setContentView(R.layout.activity_main)\n\n val secureTask = SecureTask(this)\n secureTask.executeTask()\n }\n\n override fun onEventComplete(data: String) {\n // Handle event completion securely\n // ...\n }\n }\n\n### Java\n\n public class MainActivity extends AppCompatActivity implements EventCompletionListener {\n\n @Override\n protected void onCreate(Bundle savedInstanceState) {\n super.onCreate(savedInstanceState);\n setContentView(R.layout.activity_main);\n\n SecureTask secureTask = new SecureTask(this);\n secureTask.executeTask();\n }\n\n @Override\n public void onEventComplete(String data) {\n // Handle event completion securely\n // ...\n }\n }\n\n### Secure broadcast receivers with permissions\n\nOnly register dynamic receivers for [protected broadcasts](/about/versions/12/reference/broadcast-intents-31) (broadcasts that\nonly system level applications can send) or with [self-declared signature level\npermissions](/guide/topics/manifest/permission-element#plevel).\n\nResources\n---------\n\n- [Exported Receiver Elements](/guide/topics/manifest/receiver-element#exported)\n- [Broadcast Receiver Permissions documentation](/guide/components/broadcasts#receiving-broadcasts-permissions)\n- [Protected Broadcast Intents](/about/versions/12/reference/broadcast-intents-31)"]]