OWASP বিভাগ: MASVS-PLATFORM: প্ল্যাটফর্ম মিথস্ক্রিয়া
সংক্ষিপ্ত বিবরণ
যখন কোনো আক্রমণকারী একটি দুর্বল অ্যাপের প্রেক্ষাপটে নতুন কোনো কম্পোনেন্ট চালু করার জন্য ব্যবহৃত ইন্টেন্টের বিষয়বস্তুকে আংশিক বা সম্পূর্ণরূপে নিয়ন্ত্রণ করতে পারে, তখন ইন্টেন্ট রিডাইরেকশন ঘটে।
নতুন কম্পোনেন্টটি চালু করার জন্য ব্যবহৃত ইন্টেন্টটি বিভিন্ন উপায়ে সরবরাহ করা যেতে পারে; সবচেয়ে প্রচলিত পদ্ধতি হলো এটিকে extras ফিল্ডে একটি সিরিয়ালাইজড ইন্টেন্ট হিসেবে অথবা একটি স্ট্রিং-এ মার্শেল করে পার্স করা। প্যারামিটারগুলোর আংশিক নিয়ন্ত্রণও একই ফলাফল দিতে পারে।
প্রভাব
এর প্রভাব বিভিন্ন রকম হতে পারে। একজন আক্রমণকারী দুর্বল অ্যাপটির অভ্যন্তরীণ ফিচারগুলো কার্যকর করতে পারে, অথবা আনএক্সপোর্টেড ContentProvider অবজেক্টের মতো প্রাইভেট কম্পোনেন্টগুলো অ্যাক্সেস করতে পারে।
প্রশমন
সাধারণত, নেস্টেড ইনটেন্ট রিডাইরেক্ট করার সাথে সম্পর্কিত ফিচারগুলো প্রকাশ করবেন না। যেখানে এটি অপরিহার্য, সেখানে নিম্নলিখিত প্রতিকার পদ্ধতিগুলো প্রয়োগ করুন:
- বান্ডেল করা তথ্য যথাযথভাবে স্যানিটাইজ করুন। ফ্ল্যাগগুলো (
FLAG_GRANT_READ_URI_PERMISSION, FLAG_GRANT_WRITE_URI_PERMISSION, FLAG_GRANT_PERSISTABLE_URI_PERMISSION, and FLAG_GRANT_PREFIX_URI_PERMISSION) চেক বা ক্লিয়ার করা এবং ইন্টেন্টটি কোথায় রিডাইরেক্ট করা হচ্ছে তা পরীক্ষা করা গুরুত্বপূর্ণ।IntentSanitizerএই প্রক্রিয়ায় সাহায্য করতে পারে। -
PendingIntentঅবজেক্ট ব্যবহার করুন। এটি আপনার কম্পোনেন্টকে এক্সপোর্ট হওয়া থেকে বিরত রাখে এবং টার্গেট অ্যাকশন ইনটেন্টকে অপরিবর্তনীয় করে তোলে।
অ্যাপগুলি ResolveActivity মতো পদ্ধতি ব্যবহার করে পরীক্ষা করতে পারে যে একটি ইন্টেন্ট কোথায় পুনঃনির্দেশিত হচ্ছে:
কোটলিন
val intent = getIntent()
// Get the component name of the nested intent.
val forward = intent.getParcelableExtra<Parcelable>("key") as Intent
val name: ComponentName = forward.resolveActivity(packageManager)
// Check that the package name and class name contain the expected values.
if (name.packagename == "safe_package" && name.className == "safe_class") {
// Redirect the nested intent.
startActivity(forward)
}
জাভা
Intent intent = getIntent()
// Get the component name of the nested intent.
Intent forward = (Intent) intent.getParcelableExtra("key");
ComponentName name = forward.resolveActivity(getPackageManager());
// Check that the package name and class name contain the expected values.
if (name.getPackageName().equals("safe_package") &&
name.getClassName().equals("safe_class")) {
// Redirect the nested intent.
startActivity(forward);
}
অ্যাপগুলি নিম্নলিখিতের অনুরূপ লজিক ব্যবহার করে IntentSanitizer ব্যবহার করতে পারে:
কোটলিন
val intent = IntentSanitizer.Builder()
.allowComponent("com.example.ActivityA")
.allowData("com.example")
.allowType("text/plain")
.build()
.sanitizeByThrowing(intent)
জাভা
Intent intent = new IntentSanitizer.Builder()
.allowComponent("com.example.ActivityA")
.allowData("com.example")
.allowType("text/plain")
.build()
.sanitizeByThrowing(intent);
ডিফল্ট সুরক্ষা
অ্যান্ড্রয়েড ১৬ Intent রিডাইরেকশন এক্সপ্লয়েট মোকাবেলার জন্য একটি ডিফল্ট নিরাপত্তা শক্তিশালীকরণ সমাধান চালু করেছে। বেশিরভাগ ক্ষেত্রে, ইন্টেন্ট ব্যবহারকারী অ্যাপগুলোতে সাধারণত কোনো সামঞ্জস্যজনিত সমস্যা দেখা যায় না।
ইনটেন্ট রিডাইরেকশন হ্যান্ডলিং থেকে অপ্ট আউট করুন
অ্যান্ড্রয়েড ১৬ একটি নতুন এপিআই চালু করেছে যা অ্যাপগুলোকে লঞ্চ নিরাপত্তা সুরক্ষা থেকে বেরিয়ে আসার সুযোগ দেয়। কিছু নির্দিষ্ট ক্ষেত্রে এটি প্রয়োজনীয় হতে পারে, যেখানে ডিফল্ট নিরাপত্তা ব্যবস্থা অ্যাপের বৈধ ব্যবহারে বাধা সৃষ্টি করে।
অ্যান্ড্রয়েড ১৬-এ, আপনি Intent অবজেক্টের removeLaunchSecurityProtection() মেথডটি ব্যবহার করে নিরাপত্তা সুরক্ষাগুলো নিষ্ক্রিয় করতে পারেন। উদাহরণস্বরূপ:
val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent")
iSublevel?.removeLaunchSecurityProtection() // Opt out from hardening
iSublevel?.let { startActivity(it) }
সাধারণ ভুল
-
getCallingActivity()একটি নন-নাল ভ্যালু রিটার্ন করে কিনা তা যাচাই করা হচ্ছে। ক্ষতিকর অ্যাপগুলো এই ফাংশনের জন্য একটি নাল ভ্যালু সরবরাহ করতে পারে। - ধরে নেওয়া হচ্ছে যে
checkCallingPermission()সব ক্ষেত্রে কাজ করে, অথবা মেথডটি যখন প্রকৃতপক্ষে একটি পূর্ণসংখ্যা রিটার্ন করে তখন একটি এক্সেপশন থ্রো করে।
ডিবাগিং বৈশিষ্ট্য
যেসব অ্যাপ অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩১) বা তার উচ্চতর সংস্করণকে টার্গেট করে, সেগুলোতে আপনি একটি ডিবাগিং ফিচার চালু করতে পারেন, যা কিছু ক্ষেত্রে আপনার অ্যাপটি কোনো ইনটেন্টের অনিরাপদ লঞ্চ করছে কিনা তা শনাক্ত করতে সাহায্য করে।
যদি আপনার অ্যাপ নিম্নলিখিত উভয় কাজই করে, তাহলে সিস্টেম একটি অনিরাপদ ইন্টেন্ট লঞ্চ শনাক্ত করে এবং একটি StrictMode লঙ্ঘন ঘটে:
- আপনার অ্যাপ একটি ডেলিভার করা ইন্টেন্টের এক্সট্রাগুলো থেকে একটি নেস্টেড ইন্টেন্টকে আনপার্সেল করে।
- আপনার অ্যাপ সেই নেস্টেড ইন্টেন্টটি ব্যবহার করে অবিলম্বে একটি অ্যাপ কম্পোনেন্ট চালু করে, যেমন
startActivity(),startService(), বাbindService()-এর মধ্যে ইন্টেন্টটি পাস করার মাধ্যমে।