دسته OWASP: MASVS-PLATFORM: تعامل پلاتفرم
نمای کلی
اجازه Android شناسهای رشتهای است که در مانیفست برنامه برای درخواست دسترسی به دادهها یا کنشهای محدودشده اعلام میشود و در زمان اجرا توسط چارچوب Android اعمال میشود.
سطوح اجازه Android نشاندهنده خطر احتمالی مرتبط با اجازه است:
- عادی: اجازههای کمخطر، که بهطور خودکار در زمان نصب اعطا میشوند
- خطرناک: اجازههای پرخطر که میتوانند دسترسی به دادههای حساس کاربر را ممکن کنند و به تأیید صریح کاربر در زمان اجرا نیاز دارند
- امضا: فقط به برنامههایی اعطا میشود که با همان گواهی برنامه اعلامکننده اجازه امضا شده باشند، معمولاً برای برنامههای سیستم یا تعاملات بین برنامههای یک توسعهدهنده استفاده میشود
آسیبپذیریهای مربوط به کنترلهای دسترسی مبتنی بر اجازه زمانی رخ میدهد که مؤلفه برنامه (مثل فعالیت، گیرنده، ارائهدهنده محتوا، یا سرویس) همه معیارهای زیر را داشته باشد:
- این مؤلفه با هیچ
android:permissionدرManifestمرتبط نیست؛ - این مؤلفه تکلیف حساسی را انجام میدهد که برای آن اجازهای وجود دارد که کاربر ازقبل آن را تأیید کرده است؛
- عنصر صادر شده است؛
- این مؤلفه هیچگونه بررسی دستی (در سطح مانیفست یا کد) برای مجوزها انجام نمیدهد؛
وقتی این اتفاق میافتد، برنامه مخرب میتواند با سوءاستفاده از امتیازات مؤلفه آسیبپذیر، کنشهای حساسی انجام دهد و امتیازات برنامه آسیبپذیر را به برنامه مخرب پروکسی کند.
تأثیر
از صادر کردن مؤلفههای آسیبپذیر میتوان برای دسترسی به منابع حساس یا انجام کنشهای حساس استفاده کرد. تأثیر این رفتار ناخواسته به بافت مؤلفه آسیبپذیر و امتیازات آن بستگی دارد.
کاهش
الزامی کردن اجازهها برای کارهای حساس
هنگام صادر کردن مؤلفهای با اجازههای حساس، همان اجازهها را برای هر درخواست ورودی الزامی کنید. محیط توسعه یکپارچه Android Studio دارای بررسیهای lint برای گیرندهها و سرویسها است تا این آسیبپذیری را شناسایی کند و درخواست اجازههای مناسب را توصیه کند.
توسعهدهندگان میتوانند برای درخواستهای ورودی اجازههایی را الزامی کنند، چه با اعلام کردن
آنها در فایل Manifest یا در سطح کد هنگام پیادهسازی سرویس، مانند
مثالهای زیر.
Xml
<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
}
}
عنصر صادر نشود
از صادر کردن مؤلفههایی که به منابع حساس دسترسی دارند خودداری کنید، مگراینکه کاملاً ضروری باشد. میتوانید این کار را با تنظیم android:exported در فایل Manifest روی false برای مؤلفهتان انجام دهید. از سطح میانای برنامهسازی کاربردی ۳۱ و
بالاتر، این مشخصه بهطور پیشفرض روی false تنظیم شده است.
Xml
<activity
android:name=".MyActivity"
android:exported="false"/>
اعمال اجازههای مبتنی بر امضا
هنگام همرسانی دادهها بین دو برنامه که تحت کنترل یا مالکیت شما هستند، از اجازههای مبتنی بر امضا استفاده کنید. این اجازهها به تأیید کاربر نیاز ندارند و درعوض، بررسی میکنند که برنامههایی که به دادهها دسترسی دارند بااستفاده از همان کلید امضا امضا شده باشند. این راهاندازی تجربه کاربری سادهتر و ایمنتری ارائه میدهد. اگر اجازههای سفارشی را اعلام میکنید، حتماً دستورالعملهای امنیتی مربوطه را درنظر بگیرید.
Xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<permission android:name="my_custom_permission_name"
android:protectionLevel="signature" />
نقطههای پایانی تکتکلیفی
برنامهتان را با پیروی از اصل طراحی جداسازی نگرانیها پیادهسازی کنید. هر نقطه پایانی باید فقط مجموعه کوچکی از وظایف خاص را با امتیازات خاص انجام دهد. این روال مطلوب طراحی همچنین به توسعهدهنده اجازه میدهد اجازههای با اطلاعات جزءبهجزء را برای هر نقطه پایانی اعمال کند. برای مثال، از ایجاد یک نقطه پایانی واحد که هم تقویم و هم مخاطبین را ارائه میدهد، خودداری کنید.
منابع
- دسترسی Android به مؤلفههای محافظتشده برنامه از وبلاگ Oversecured
- روالهای مطلوب ارائهدهنده محتوا
- اجازههای زمان اجرا (خطرناک)
- اصل طراحی «جداسازی دغدغهها»
- اسناد اجازههای Android
- نکات امنیتی گیرندههای رویداد ثبتشده Android
- نکات امنیتی سرویسهای Android
- پیشفرض صادرشده Android 12 (API 31) روی «false» (نادرست) تنظیم شده است
- بررسی Lint: نباید PreferenceActivity صادرشده را صادر کرد
- بررسی Lint: «گیرنده صادرشده» به اجازه نیاز ندارد
- بررسی Lint: سرویس صادرشده به اجازه نیاز ندارد