OWASP বিভাগ: MASVS-PLATFORM: প্ল্যাটফর্ম মিথস্ক্রিয়া
সংক্ষিপ্ত বিবরণ
একটি PendingIntent হলো সিস্টেম দ্বারা সংরক্ষিত একটি টোকেনের রেফারেন্স। অ্যাপ্লিকেশন A, অ্যাপ্লিকেশন B-কে একটি পেন্ডিংইন্টেন্ট পাঠাতে পারে, যাতে অ্যাপ্লিকেশন B, অ্যাপ্লিকেশন A-এর পক্ষ থেকে পূর্বনির্ধারিত কাজগুলো সম্পাদন করতে পারে; এক্ষেত্রে অ্যাপ্লিকেশন A সচল আছে কি না, তা বিবেচ্য নয়।
ঝুঁকি: পরিবর্তনযোগ্য বিচারাধীন অভিপ্রায়
একটি PendingIntent পরিবর্তনযোগ্য হতে পারে, যার অর্থ হলো, fillIn() ডকুমেন্টেশনে বর্ণিত লজিক অনুসরণ করে অ্যাপ্লিকেশন B সেই অভ্যন্তরীণ ইন্টেন্টটি আপডেট করতে পারে যা অ্যাকশনটি নির্দিষ্ট করে। অন্য কথায়, একটি PendingIntent-এর অপূর্ণ ফিল্ডগুলো কোনো ক্ষতিকারক অ্যাপ দ্বারা পরিবর্তন করা যেতে পারে এবং এর ফলে ঝুঁকিপূর্ণ অ্যাপ্লিকেশনটির এমন কম্পোনেন্টগুলোতে অ্যাক্সেস পাওয়া যায় যা অন্যথায় এক্সপোর্ট করা হয় না।
প্রভাব
এই দুর্বলতার প্রভাব অ্যাপটির লক্ষ্যবস্তুকৃত অপ্রকাশিত কার্যকারিতার বাস্তবায়নের উপর নির্ভর করে ভিন্ন ভিন্ন হয়।
প্রশমন
সাধারণ
সবচেয়ে মারাত্মক দুর্বলতাগুলো এড়ানোর জন্য অ্যাকশন, কম্পোনেন্ট এবং প্যাকেজ সঠিকভাবে সেট করা আছে কিনা তা নিশ্চিত করুন:
কোটলিন
val intent = Intent(intentAction)
// Or other component setting APIs e.g. setComponent, setClass
intent.setClassName(packageName, className)
PendingIntent pendingIntent =
PendingIntent.getActivity(
context,
/* requestCode = */ 0,
intent, /* flags = */ PendingIntent.FLAG_IMMUTABLE
)
জাভা
Intent intent = new Intent(intentAction);
// Or other component setting APIs e.g. setComponent, setClass
intent.setClassName(packageName, className);
PendingIntent pendingIntent =
PendingIntent.getActivity(
getContext(),
/* requestCode= */ 0,
intent, /* flags= */ 0);
পতাকা অপরিবর্তনীয়
আপনার অ্যাপটি যদি অ্যান্ড্রয়েড ৬ (এপিআই লেভেল ২৩) বা তার উচ্চতর সংস্করণকে টার্গেট করে, তাহলে মিউটেবিলিটি (mutability) নির্দিষ্ট করে দিন । উদাহরণস্বরূপ, কোনো ক্ষতিকারক অ্যাপ্লিকেশন যাতে অপূর্ণ ফিল্ডগুলো পূরণ করতে না পারে, তা প্রতিরোধ করার জন্য FLAG_IMMUTABLE ব্যবহার করে এটি করা যেতে পারে:
কোটলিন
val pendingIntent =
PendingIntent.getActivity(
context,
/* requestCode = */ 0,
Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE)
জাভা
PendingIntent pendingIntent =
PendingIntent.getActivity(
getContext(),
/* requestCode= */ 0,
new Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE);
অ্যান্ড্রয়েড ১১ (এপিআই লেভেল ৩০) এবং এর পরবর্তী সংস্করণগুলোতে, কোন ফিল্ডগুলোকে পরিবর্তনযোগ্য (mutable) করা হবে তা নির্দিষ্ট করে দিতে হয়, যা এই ধরনের অনিচ্ছাকৃত দুর্বলতা প্রশমিত করে।
সম্পদ
ঝুঁকি: মুলতুবি থাকা অভিপ্রায়গুলি পুনরায় চালানো
FLAG_ONE_SHOT ফ্ল্যাগটি সেট করা না থাকলে একটি PendingIntent পুনরায় চালানো যেতে পারে। রিপ্লে অ্যাটাক (এমন কাজ করা যা পুনরাবৃত্তিযোগ্য নয়) এড়ানোর জন্য FLAG_ONE_SHOT ব্যবহার করা গুরুত্বপূর্ণ।
প্রভাব
এই দুর্বলতার প্রভাব ইনটেন্ট গ্রহণকারী প্রান্তের বাস্তবায়নের উপর নির্ভর করে। FLAG_ONE_SHOT ফ্ল্যাগ সেট না করে তৈরি করা একটি PendingIntent-কে কাজে লাগিয়ে কোনো ক্ষতিকারক অ্যাপ সেই ইনটেন্টটি ক্যাপচার করে পুনরায় ব্যবহার করতে পারে, এবং এমন সব কাজ বারবার করতে পারে যা কেবল একবারই করা সম্ভব।
প্রশমন
যেসব পেন্ডিং ইন্টেন্ট একাধিকবার ফায়ার করার উদ্দেশ্যে তৈরি নয়, সেগুলোর রিপ্লে অ্যাটাক এড়ানোর জন্য FLAG_ONE_SHOT ফ্ল্যাগ ব্যবহার করা উচিত।
কোটলিন
val pendingIntent =
PendingIntent.getActivity(
context,
/* requestCode = */ 0,
Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_ONE_SHOT)
জাভা
PendingIntent pendingIntent =
PendingIntent.getActivity(
getContext(),
/* requestCode= */ 0,
new Intent(intentAction),
PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_ONE_SHOT);
সম্পদ
সম্পদ
{% হুবহু %}আপনার জন্য প্রস্তাবিত
- দ্রষ্টব্য: জাভাস্ক্রিপ্ট বন্ধ থাকলেও লিঙ্কের লেখা প্রদর্শিত হয়।
- অভিপ্রায় পুনর্নির্দেশ