অভিপ্রায় পুনর্নির্দেশ

OWASP বিভাগ: MASVS-প্ল্যাটফর্ম: প্ল্যাটফর্ম ইন্টারঅ্যাকশন

ওভারভিউ

একটি অভিপ্রায় পুনঃনির্দেশ ঘটে যখন একটি আক্রমণকারী একটি দুর্বল অ্যাপের প্রেক্ষাপটে একটি নতুন উপাদান চালু করতে ব্যবহৃত একটি অভিপ্রায়ের বিষয়বস্তু আংশিক বা সম্পূর্ণরূপে নিয়ন্ত্রণ করতে পারে।

নতুন উপাদান চালু করতে ব্যবহৃত অভিপ্রায় বিভিন্ন উপায়ে সরবরাহ করা যেতে পারে, সাধারণত হয় একটি extras ক্ষেত্রে একটি ক্রমিক অভিপ্রায় হিসাবে, অথবা একটি স্ট্রিং এবং পার্স করা হয়। পরামিতিগুলির আংশিক নিয়ন্ত্রণও একই ফলাফলের দিকে নিয়ে যেতে পারে।

প্রভাব

প্রভাব পরিবর্তিত হতে পারে। একজন আক্রমণকারী দুর্বল অ্যাপে অভ্যন্তরীণ বৈশিষ্ট্যগুলি চালাতে পারে বা এটি অরপ্তানি করা সামগ্রী সরবরাহকারী বস্তুর মতো ব্যক্তিগত উপাদানগুলিতে অ্যাক্সেস করতে পারে।

প্রশমন

সাধারণভাবে, নেস্টেড ইন্টেন্ট পুনঃনির্দেশিত করার সাথে সম্পর্কিত বৈশিষ্ট্যগুলি প্রকাশ করবেন না। যে ক্ষেত্রে এটি অনিবার্য, নিম্নলিখিত প্রশমন পদ্ধতিগুলি প্রয়োগ করুন:

  • বান্ডিল করা তথ্য সঠিকভাবে স্যানিটাইজ করুন। ফ্ল্যাগগুলি চেক করা বা সাফ করা মনে রাখা গুরুত্বপূর্ণ ( 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);

সাধারণ ভুল

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

ডিবাগিং বৈশিষ্ট্য

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

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

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

সম্পদ