دسته OWASP: MASVS-PLATFORM: تعامل پلتفرم
نمای کلی
مجوز اندروید، یک شناسه رشتهای است که در مانیفست برنامه برای درخواست دسترسی به دادهها یا اقدامات محدود شده اعلام میشود و در زمان اجرا توسط چارچوب اندروید اعمال میشود.
سطوح مجوز اندروید، ریسک بالقوه مرتبط با مجوز را نشان میدهد:
- عادی : مجوزهای کمخطر، بهطور خودکار در زمان نصب اعطا میشوند
- خطرناک : مجوزهای پرخطر که میتوانند امکان دسترسی به دادههای حساس کاربر را فراهم کنند و نیاز به تأیید صریح کاربر در زمان اجرا دارند.
- امضا : فقط به برنامههایی اعطا میشود که با همان گواهینامهای که برنامهی اعلامکنندهی مجوز با آن امضا شده است، امضا شدهاند و معمولاً برای برنامههای سیستمی یا تعاملات بین برنامهها از یک توسعهدهنده استفاده میشود.
آسیبپذیریهای مربوط به کنترلهای دسترسی مبتنی بر مجوز زمانی رخ میدهند که یک جزء برنامه (مانند فعالیت ، گیرنده ، ارائهدهنده محتوا یا سرویس ) تمام معیارهای زیر را داشته باشد:
- این کامپوننت با هیچ
android:permissionدرManifestمرتبط نیست؛ - این مؤلفه یک کار حساس را انجام میدهد که برای آن مجوزی وجود دارد که کاربر قبلاً آن را تأیید کرده است.
- کامپوننت صادر میشود؛
- این کامپوننت هیچ بررسی مجوز دستی (در سطح مانیفست یا کد) انجام نمیدهد؛
وقتی این اتفاق میافتد، یک برنامهی مخرب میتواند با سوءاستفاده از امتیازات جزء آسیبپذیر، اقدامات حساسی را انجام دهد و امتیازات برنامهی آسیبپذیر را به برنامهی مخرب واگذار کند.
تأثیر
استخراج اجزای آسیبپذیر میتواند برای دسترسی به منابع حساس یا انجام اقدامات حساس مورد استفاده قرار گیرد. تأثیر این رفتار ناخواسته به زمینهی مؤلفهی آسیبپذیر و امتیازات آن بستگی دارد.
کاهشها
برای کارهای حساس مجوز لازم است
هنگام اکسپورت کردن یک کامپوننت با مجوزهای حساس، برای هر درخواست ورودی، همان مجوزها را الزامی کنید. IDE اندروید استودیو دارای بررسیهای خطی برای گیرندهها و سرویسها است تا این آسیبپذیری را تشخیص دهد و مجوزهای مناسب را الزامی کند.
توسعهدهندگان میتوانند برای درخواستهای ورودی، مجوزهایی را یا با اعلام آنها در فایل 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
}
}
کامپوننت را اکسپورت نکنید
از اکسپورت کردن کامپوننتهایی که به منابع حساس دسترسی دارند، مگر در موارد ضروری، خودداری کنید. میتوانید با تنظیم android:exported در فایل Manifest برای کامپوننت خود روی 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" />
نقاط پایانی تک وظیفهای
برنامه خود را با پیروی از اصل طراحی جداسازی دغدغهها پیادهسازی کنید. هر نقطه پایانی فقط باید مجموعه کوچکی از وظایف خاص را با امتیازات خاص انجام دهد. این شیوه طراحی خوب همچنین به توسعهدهنده اجازه میدهد تا مجوزهای جزئی را برای هر نقطه پایانی اعمال کند. به عنوان مثال، از ایجاد یک نقطه پایانی واحد که هم به تقویم و هم به مخاطبین سرویس میدهد، خودداری کنید.
منابع
- دسترسی اندروید به اجزای محافظتشده برنامه از وبلاگ Oversecured
- بهترین شیوههای ارائهدهنده محتوا
- مجوزهای زمان اجرا (خطرناک)
- اصل طراحی جداسازی دغدغهها
- مستندات مجوزهای اندروید
- نکات امنیتی گیرندههای پخش اندروید
- نکات امنیتی سرویسهای اندروید
- اندروید ۱۲ (API 31) مقدار پیشفرض را روی "false" تنظیم کرد.
- بررسی Lint: PreferenceActivity صادر شده نباید صادر شود
- بررسی پرز: گیرنده صادر شده نیازی به اجازه ندارد
- بررسی پرز: سرویس صادر شده نیازی به اجازه ندارد