دسته OWASP: MASVS-PLATFORM: پلتفرم تعامل
نمای کلی
مجوز Android یک شناسه رشته ای است که در مانیفست برنامه برای درخواست دسترسی به داده ها یا اقدامات محدود اعلام شده است که در زمان اجرا توسط چارچوب Android اعمال می شود.
سطوح مجوز Android نشان دهنده خطر بالقوه مرتبط با مجوز است:
- عادی : مجوزهای کم خطر، به طور خودکار در زمان نصب اعطا می شوند
- خطرناک : مجوزهای پرخطری که میتوانند به دادههای حساس کاربر دسترسی داشته باشند و نیاز به تأیید صریح کاربر در زمان اجرا دارند.
- امضا : فقط به برنامههایی اعطا میشود که با همان گواهینامه امضا شده برنامه مجوز را اعلام میکند، که معمولاً برای برنامههای سیستمی یا تعامل بین برنامههای یک برنامهنویس استفاده میشود.
آسیبپذیریهای مربوط به کنترلهای دسترسی مبتنی بر مجوز زمانی رخ میدهند که مؤلفه برنامه (مانند فعالیت ، گیرنده ، ارائهدهنده محتوا یا سرویس ) همه معیارهای زیر را داشته باشد:
- این مؤلفه با هیچ
android:permission
درManifest
; - مؤلفه یک کار حساس را انجام می دهد که مجوزی برای آن وجود دارد که کاربر قبلاً تأیید کرده است.
- جزء صادر می شود.
- مؤلفه هیچ گونه بررسی مجوز دستی (مانیفست یا سطح کد) را انجام نمی دهد.
هنگامی که این اتفاق می افتد، یک برنامه مخرب می تواند با سوء استفاده از امتیازات جزء آسیب پذیر، اقدامات حساس را انجام دهد، و امتیازات برنامه آسیب پذیر را به برنامه مخرب پروکسی کند.
تاثیر
صادرات اجزای آسیب پذیر می تواند برای دسترسی به منابع حساس یا انجام اقدامات حساس مورد استفاده قرار گیرد. تأثیر این رفتار ناخواسته به زمینه مولفه آسیب پذیر و امتیازات آن بستگی دارد.
اقدامات کاهشی
نیاز به مجوز برای کارهای حساس
هنگام صادرات یک مؤلفه با مجوزهای حساس، برای هر درخواست ورودی به همان مجوزها نیاز دارید. Android Studio IDE دارای بررسیهای لینت برای گیرندهها و سرویسها برای شناسایی این آسیبپذیری است و نیاز به مجوزهای مناسب را توصیه میکند.
توسعهدهندگان میتوانند برای درخواستهای دریافتی با اعلام آنها در فایل 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
برای مؤلفه خود به این هدف دست یابید. از سطح API 31 و بالاتر، این ویژگی به طور پیش فرض روی 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 به اجزای برنامه محافظت شده از وبلاگ Overcured
- بهترین روش های ارائه دهنده محتوا
- مجوزهای زمان اجرا (خطرناک).
- اصل طراحی جداسازی نگرانی ها
- اسناد مجوزهای اندروید
- نکات امنیتی گیرنده های پخش آندروید
- نکات امنیتی خدمات اندروید
- Android 12 (API 31) پیشفرض صادر شده روی "نادرست" تنظیم شده است
- بررسی لنت: Exported PreferenceActivity نباید صادر شود
- بررسی لنت: گیرنده صادر شده به مجوز نیاز ندارد
- بررسی لینت: سرویس صادر شده به مجوز نیاز ندارد
دسته OWASP: MASVS-PLATFORM: پلتفرم تعامل
نمای کلی
مجوز Android یک شناسه رشته ای است که در مانیفست برنامه برای درخواست دسترسی به داده ها یا اقدامات محدود اعلام شده است که در زمان اجرا توسط چارچوب Android اعمال می شود.
سطوح مجوز Android نشان دهنده خطر بالقوه مرتبط با مجوز است:
- عادی : مجوزهای کم خطر، به طور خودکار در زمان نصب اعطا می شوند
- خطرناک : مجوزهای پرخطری که میتوانند به دادههای حساس کاربر دسترسی داشته باشند و نیاز به تأیید صریح کاربر در زمان اجرا دارند.
- امضا : فقط به برنامههایی اعطا میشود که با همان گواهینامه امضا شده برنامه مجوز را اعلام میکند، که معمولاً برای برنامههای سیستمی یا تعامل بین برنامههای یک برنامهنویس استفاده میشود.
آسیبپذیریهای مربوط به کنترلهای دسترسی مبتنی بر مجوز زمانی رخ میدهند که مؤلفه برنامه (مانند فعالیت ، گیرنده ، ارائهدهنده محتوا یا سرویس ) همه معیارهای زیر را داشته باشد:
- این مؤلفه با هیچ
android:permission
درManifest
; - مؤلفه یک کار حساس را انجام می دهد که مجوزی برای آن وجود دارد که کاربر قبلاً تأیید کرده است.
- جزء صادر می شود.
- مؤلفه هیچ گونه بررسی مجوز دستی (مانیفست یا سطح کد) را انجام نمی دهد.
هنگامی که این اتفاق می افتد، یک برنامه مخرب می تواند با سوء استفاده از امتیازات جزء آسیب پذیر، اقدامات حساس را انجام دهد، و امتیازات برنامه آسیب پذیر را به برنامه مخرب پروکسی کند.
تاثیر
صادرات اجزای آسیب پذیر می تواند برای دسترسی به منابع حساس یا انجام اقدامات حساس مورد استفاده قرار گیرد. تأثیر این رفتار ناخواسته به زمینه مولفه آسیب پذیر و امتیازات آن بستگی دارد.
اقدامات کاهشی
نیاز به مجوز برای کارهای حساس
هنگام صادرات یک مؤلفه با مجوزهای حساس، برای هر درخواست ورودی به همان مجوزها نیاز دارید. Android Studio IDE دارای بررسیهای لینت برای گیرندهها و سرویسها برای شناسایی این آسیبپذیری است و نیاز به مجوزهای مناسب را توصیه میکند.
توسعهدهندگان میتوانند برای درخواستهای دریافتی با اعلام آنها در فایل 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
برای مؤلفه خود به این هدف دست یابید. از سطح API 31 و بالاتر، این ویژگی به طور پیش فرض روی 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 به اجزای برنامه محافظت شده از وبلاگ Overcured
- بهترین روش های ارائه دهنده محتوا
- مجوزهای زمان اجرا (خطرناک).
- اصل طراحی جداسازی نگرانی ها
- اسناد مجوزهای اندروید
- نکات امنیتی گیرنده های پخش آندروید
- نکات امنیتی خدمات اندروید
- Android 12 (API 31) پیشفرض صادر شده روی "نادرست" تنظیم شده است
- بررسی لنت: Exported PreferenceActivity نباید صادر شود
- بررسی لنت: گیرنده صادر شده به مجوز نیاز ندارد
- بررسی لینت: سرویس صادر شده به مجوز نیاز ندارد