ইনটেন্ট রিডাইরেকশন

OWASP বিভাগ: MASVS-PLATFORM: Platform Interaction

এক নজরে

কোনও দুর্বল অ্যাপের প্রসঙ্গে নতুন কম্পোনেন্ট লঞ্চ করার জন্য ব্যবহৃত ইনটেন্টের কন্টেন্ট আংশিক বা সম্পূর্ণভাবে কোনও অ্যাটাকার নিয়ন্ত্রণ করতে পারলে, ইনটেন্ট রিডাইরেকশন ঘটে।

নতুন কম্পোনেন্ট লঞ্চ করার জন্য ব্যবহৃত ইনটেন্ট বিভিন্ন উপায়ে সাপ্লাই করা যেতে পারে, সবচেয়ে সাধারণ উপায় হল 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:

Kotlin

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 ব্যবহার করতে পারে:

Kotlin

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);

ডিফল্ট সুরক্ষা

Android 16, Intent রিডাইরেকশন এক্সপ্লয়েটের জন্য ডিফল্ট হিসেবে নিরাপত্তা কঠোর করার সমাধান নিয়ে আসে। বেশিরভাগ ক্ষেত্রে, ইনটেন্ট ব্যবহার করে এমন অ্যাপগুলি সাধারণত কোনও কম্প্যাটিবিলিটি সংক্রান্ত সমস্যার সম্মুখীন হবে না।

ইন্টেন্ট রিডাইরেকশন হ্যান্ডলিং থেকে অপ্ট-আউট করা

Android 16 একটি নতুন API নিয়ে এসেছে যা অ্যাপগুলিকে লঞ্চ নিরাপত্তা সুরক্ষা থেকে বেরিয়ে আসতে দেয়। নির্দিষ্ট কিছু ক্ষেত্রে এটি প্রয়োজন হতে পারে, যেখানে ডিফল্ট সুরক্ষা সংক্রান্ত আচরণ বৈধ অ্যাপ ব্যবহারের ক্ষেত্রে বাধা দেয়।

Android 16-এ, আপনি Intent অবজেক্টে removeLaunchSecurityProtection() পদ্ধতি ব্যবহার করে নিরাপত্তা সুরক্ষা থেকে অপ্ট-আউট করতে পারবেন। যেমন:

val i = intent
val iSublevel: Intent? = i.getParcelableExtra("sub_intent")
iSublevel?.removeLaunchSecurityProtection() // Opt out from hardening
iSublevel?.let { startActivity(it) }

সাধারণ ভুল

  • getCallingActivity() কোনও নন-নাল ভ্যালু রিটার্ন করছে কিনা তা চেক করা হচ্ছে। ক্ষতিকর অ্যাপ এই ফাংশনের জন্য একটি নাল ভ্যালু সাপ্লাই করতে পারে।
  • ধরে নেওয়া যে checkCallingPermission() সব প্রসঙ্গে কাজ করে অথবা পদ্ধতিটি আসলে একটি পূর্ণসংখ্যা রিটার্ন করার সময় একটি ব্যতিক্রম ছুঁড়ে দেয়।

ডিবাগিং ফিচার

Android 12 (API লেভেল 31) বা এর পরের যেকোনও ভার্সনকে টার্গেট করা অ্যাপের জন্য, আপনি একটি ডিবাগিং ফিচার চালু করতে পারবেন যা কিছু ক্ষেত্রে, আপনার অ্যাপ কোনও ইনটেন্ট অনিরাপদভাবে লঞ্চ করছে কিনা তা শনাক্ত করতে সাহায্য করে।

আপনার অ্যাপ যদি নিচে উল্লেখ করা দুটি অ্যাকশনই পারফর্ম করে, তাহলে সিস্টেম একটি অনিরাপদ ইনটেন্ট লঞ্চ শনাক্ত করে এবং StrictMode লঙ্ঘন ঘটে:

  • আপনার অ্যাপ ডেলিভার করা ইনটেন্টের এক্সট্রা থেকে নেস্টেড ইনটেন্ট আনপার্সেল করে।
  • আপনার অ্যাপ অবিলম্বে সেই নেস্টেড ইনটেন্ট ব্যবহার করে একটি অ্যাপ কম্পোনেন্ট শুরু করে, যেমন startActivity(), startService() বা bindService()-এ ইনটেন্ট পাস করা।

রিসোর্স