রপ্তানিকৃত উপাদানগুলিতে অনুমতি-ভিত্তিক অ্যাক্সেস নিয়ন্ত্রণ

OWASP বিভাগ: MASVS-PLATFORM: প্ল্যাটফর্ম মিথস্ক্রিয়া

সংক্ষিপ্ত বিবরণ

অ্যান্ড্রয়েড পারমিশন হলো একটি স্ট্রিং আইডেন্টিফায়ার, যা অ্যাপের ম্যানিফেস্টে ঘোষণা করা হয় সীমাবদ্ধ ডেটা বা অ্যাকশনে অ্যাক্সেসের অনুরোধ করার জন্য এবং যা অ্যান্ড্রয়েড ফ্রেমওয়ার্ক দ্বারা রানটাইমে প্রয়োগ করা হয়।

অ্যান্ড্রয়েড পারমিশন লেভেলগুলো পারমিশনের সাথে সম্পর্কিত সম্ভাব্য ঝুঁকি নির্দেশ করে:

  • সাধারণ : কম-ঝুঁকিপূর্ণ অনুমতি, যা ইনস্টলের সময় স্বয়ংক্রিয়ভাবে প্রদান করা হয়।
  • বিপজ্জনক : উচ্চ-ঝুঁকিপূর্ণ অনুমতি যা সংবেদনশীল ব্যবহারকারীর ডেটাতে অ্যাক্সেসের সুযোগ দিতে পারে, যার জন্য রানটাইমে ব্যবহারকারীর সুস্পষ্ট অনুমোদনের প্রয়োজন হয়।
  • স্বাক্ষর : শুধুমাত্র সেইসব অ্যাপকে দেওয়া হয় যেগুলো অনুমতি ঘোষণাকারী অ্যাপের মতো একই সার্টিফিকেট দিয়ে স্বাক্ষরিত; এটি সাধারণত সিস্টেম অ্যাপ বা একই ডেভেলপারের অ্যাপগুলোর মধ্যেকার মিথস্ক্রিয়ার জন্য ব্যবহৃত হয়।

অনুমতি-ভিত্তিক অ্যাক্সেস নিয়ন্ত্রণ সম্পর্কিত দুর্বলতা তখন দেখা দেয়, যখন কোনো অ্যাপের কম্পোনেন্ট (যেমন অ্যাক্টিভিটি , রিসিভার , কন্টেন্ট প্রোভাইডার বা সার্ভিস ) নিম্নলিখিত সমস্ত শর্ত পূরণ করে:

  • কম্পোনেন্টটি Manifest কোনো android:permission এর সাথে যুক্ত নয়;
  • কম্পোনেন্টটি একটি সংবেদনশীল কাজ সম্পাদন করে, যার জন্য একটি অনুমতি বিদ্যমান এবং ব্যবহারকারী তা ইতিমধ্যেই অনুমোদন করেছেন;
  • উপাদানটি রপ্তানি করা হয়;
  • কম্পোনেন্টটি কোনো ম্যানুয়াল (ম্যানিফেস্ট বা কোড-লেভেল) অনুমতি যাচাই করে না;

যখন এমনটা ঘটে, তখন একটি ক্ষতিকারক অ্যাপ দুর্বল কম্পোনেন্টের বিশেষাধিকারের অপব্যবহার করে এবং দুর্বল অ্যাপটির বিশেষাধিকারগুলো ক্ষতিকারক অ্যাপটিতে প্রক্সি হিসেবে পাঠিয়ে সংবেদনশীল কাজ সম্পাদন করতে পারে।

প্রভাব

দুর্বল উপাদান রপ্তানি করে সংবেদনশীল সম্পদে প্রবেশাধিকার লাভ করা বা সংবেদনশীল কার্যকলাপ সম্পাদন করা যেতে পারে। এই অনাকাঙ্ক্ষিত আচরণের প্রভাব দুর্বল উপাদানটির প্রেক্ষাপট এবং এর বিশেষাধিকারের উপর নির্ভর করে।

প্রশমন

সংবেদনশীল কাজের জন্য অনুমতির প্রয়োজন

When exporting a component with sensitive permissions, require those same permissions for any incoming request. The Android Studio IDE has lint checks for receivers and services to spot this vulnerability and recommend requiring the appropriate permissions.

ডেভেলপাররা ইনকামিং রিকোয়েস্টের জন্য পারমিশন বাধ্যতামূলক করতে পারেন, হয় Manifest ফাইলে তা ঘোষণা করার মাধ্যমে অথবা সার্ভিসটি ইমপ্লিমেন্ট করার সময় কোড-লেভেলে, যেমনটি নিচের উদাহরণগুলোতে দেখানো হয়েছে।

এক্সএমএল

<manifest ...>
    <uses-permission android:name="android.permission.READ_CONTACTS" />

    <application ...>
        <service android:name=".MyExportService"
                 android:exported="true"
                 android:permission="android.permission.READ_CONTACTS" />

        </application>
</manifest>

কোটলিন

class MyExportService : Service() {

    private val binder = MyExportBinder()

    override fun onBind(intent: Intent): IBinder? {
        // Enforce calling app has the required permission
        enforceCallingPermission(Manifest.permission.READ_CONTACTS, "Calling app doesn't have READ_CONTACTS permission.")
        // Permission is enforced, proceed with export logic
        return binder
    }

    // Inner class for your Binder implementation
    private inner class MyExportBinder : Binder() {
        // Permission is enforced, proceed with export logic
    }
}

জাভা

public class MyExportService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        // Enforce calling app has the required permission
        enforceCallingPermission(Manifest.permission.READ_CONTACTS, "Calling app doesn't have READ_CONTACTS permission.");

        return binder;

    }

    // Inner class for your Binder implementation
    private class MyExportBinder extends Binder {
        // Permission is enforced, proceed with export logic

    }
}

কম্পোনেন্টটি রপ্তানি করবেন না।

অত্যন্ত জরুরি না হলে সংবেদনশীল রিসোর্সে অ্যাক্সেস আছে এমন কম্পোনেন্ট এক্সপোর্ট করা থেকে বিরত থাকুন। আপনার কম্পোনেন্টের জন্য Manifest ফাইলে android:exported অ্যাট্রিবিউটটিকে false সেট করার মাধ্যমে আপনি এটি করতে পারেন। API লেভেল 31 এবং তার পরবর্তী সংস্করণগুলোতে এই অ্যাট্রিবিউটটি ডিফল্টরূপে false সেট করা থাকে।

এক্সএমএল

<activity
    android:name=".MyActivity"
    android:exported="false"/>

স্বাক্ষর-ভিত্তিক অনুমতি প্রয়োগ করুন

আপনার নিয়ন্ত্রণাধীন বা মালিকানাধীন দুটি অ্যাপের মধ্যে ডেটা শেয়ার করার সময়, সিগনেচার-ভিত্তিক পারমিশন ব্যবহার করুন। এই পারমিশনগুলোর জন্য ব্যবহারকারীর নিশ্চিতকরণের প্রয়োজন হয় না এবং এর পরিবর্তে, এটি যাচাই করে যে ডেটা অ্যাক্সেসকারী অ্যাপগুলো একই সাইনিং কী ব্যবহার করে স্বাক্ষরিত হয়েছে কিনা। এই ব্যবস্থাটি আরও সুবিন্যস্ত ও নিরাপদ ব্যবহারকারীর অভিজ্ঞতা প্রদান করে। আপনি যদি কাস্টম পারমিশন ঘোষণা করেন, তবে সংশ্লিষ্ট নিরাপত্তা নির্দেশিকাগুলো অবশ্যই বিবেচনা করবেন।

এক্সএমএল

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <permission android:name="my_custom_permission_name"
                android:protectionLevel="signature" />

একক-টাস্ক এন্ডপয়েন্ট

Separation of Concerns ডিজাইন নীতি অনুসরণ করে আপনার অ্যাপটি তৈরি করুন। প্রতিটি এন্ডপয়েন্ট শুধুমাত্র নির্দিষ্ট কিছু কাজ নির্দিষ্ট প্রিভিলেজ বা অধিকারসহ সম্পাদন করবে। এই ভালো ডিজাইন পদ্ধতিটি ডেভেলপারকে প্রতিটি এন্ডপয়েন্টের জন্য সুনির্দিষ্ট পারমিশন প্রয়োগ করার সুযোগ দেয়। উদাহরণস্বরূপ, এমন একটিমাত্র এন্ডপয়েন্ট তৈরি করা থেকে বিরত থাকুন যা ক্যালেন্ডার এবং কন্টাক্টস উভয় কাজই করে।

সম্পদ