عناصر برنامه های کاربردی
اندروید یک پلتفرم منبع باز و محیط برنامه برای دستگاه های تلفن همراه فراهم می کند. سیستم عامل اصلی مبتنی بر هسته لینوکس است. برنامه های اندروید اغلب به زبان برنامه نویسی جاوا نوشته می شوند و در ماشین مجازی Android Runtime (ART) اجرا می شوند. با این حال، برنامه ها را می توان با کد بومی نیز نوشت. برنامه ها از یک فایل با پسوند فایل apk. نصب می شوند.
بلوک های اصلی سازنده برنامه اندروید عبارتند از:
AndroidManifest.xml : فایل AndroidManifest.xml فایل کنترلی است که به سیستم میگوید با تمام اجزای سطح بالا (مخصوصاً فعالیتها، خدمات، گیرندههای پخش و ارائهدهندگان محتوا که در زیر توضیح داده شده است) در یک برنامه چه کاری انجام دهد. این همچنین مشخص می کند که کدام مجوزها مورد نیاز است.
فعالیتها : یک Activity معمولاً کد یک کار متمرکز بر کاربر است. معمولاً شامل نمایش یک رابط کاربری برای کاربر است، اما مجبور نیست -- برخی از فعالیت ها هرگز رابط کاربری را نشان نمی دهند. به طور معمول، یکی از فعالیت های برنامه، نقطه ورود به یک برنامه است.
خدمات : یک سرویس مجموعه ای از کد است که در پس زمینه اجرا می شود. می تواند در فرآیند خود یا در زمینه فرآیند برنامه دیگری اجرا شود. سایر مؤلفهها به یک سرویس متصل میشوند و از طریق فراخوانیهای رویه از راه دور، متدهایی را روی آن فراخوانی میکنند. نمونهای از یک سرویس، پخشکننده رسانه است: حتی زمانی که کاربر از رابط کاربری انتخاب رسانه خارج میشود، احتمالاً کاربر همچنان قصد دارد به پخش موسیقی ادامه دهد. یک سرویس موسیقی را حتی زمانی که رابط کاربری کامل شده است حفظ می کند.
گیرنده Broadcast : یک BroadcastReceiver شیئی است که زمانی که مکانیزم IPC معروف به Intent توسط سیستم عامل یا برنامه دیگری صادر می شود، نمونه سازی می شود. برای مثال ممکن است یک برنامه یک گیرنده را برای پیام باتری کم ثبت کند و رفتار خود را بر اساس آن اطلاعات تغییر دهد.
مدل مجوز اندروید: دسترسی به APIهای محافظت شده
همه برنامه های اندروید در یک Application Sandbox اجرا می شوند. به طور پیش فرض، یک برنامه اندروید تنها می تواند به محدوده محدودی از منابع سیستم دسترسی داشته باشد. این سیستم دسترسی برنامه اندروید به منابعی را مدیریت می کند که در صورت استفاده نادرست یا مخرب، می تواند بر تجربه کاربر، شبکه یا داده های دستگاه تأثیر منفی بگذارد.
این محدودیت ها به اشکال مختلف اجرا می شوند. برخی از قابلیت ها به دلیل فقدان عمدی APIها به عملکرد حساس محدود شده اند (مثلاً هیچ API Android برای دستکاری مستقیم سیم کارت وجود ندارد). در برخی موارد، جداسازی نقشها یک معیار امنیتی را فراهم میکند، مانند جداسازی فضای ذخیرهسازی برای هر برنامه. در موارد دیگر، API های حساس برای استفاده توسط برنامه های کاربردی قابل اعتماد در نظر گرفته شده اند و از طریق مکانیزم امنیتی به نام مجوزها محافظت می شوند.
این APIهای محافظت شده عبارتند از:
- عملکردهای دوربین
- داده های موقعیت مکانی (GPS)
- عملکردهای بلوتوث
- توابع تلفن
- توابع SMS/MMS
- اتصالات شبکه/داده
این منابع فقط از طریق سیستم عامل قابل دسترسی هستند. برای استفاده از APIهای محافظت شده روی دستگاه، یک برنامه باید قابلیت های مورد نیاز خود را در مانیفست خود تعریف کند. همه نسخههای اندروید 6.0 و بالاتر از مدل مجوزهای زمان اجرا استفاده میکنند. اگر کاربر ویژگی را از برنامه ای درخواست کند که به یک API محافظت شده نیاز دارد، سیستم یک گفتگو نمایش می دهد که از کاربر می خواهد اجازه را رد کند یا اجازه دهد .
پس از اعطا، مجوزها تا زمانی که برنامه نصب شده باشد اعمال می شود. برای جلوگیری از سردرگمی کاربر، سیستم مجدداً کاربر را از مجوزهای اعطا شده به برنامه مطلع نمیکند و برنامههایی که در سیستم عامل اصلی گنجانده شدهاند یا توسط یک OEM همراه شدهاند مجوز از کاربر درخواست نمیکنند. در صورت حذف نصب، مجوزها حذف می شوند، بنابراین نصب مجدد بعدی مجدداً منجر به نمایش مجوزها می شود.
در تنظیمات دستگاه، کاربران میتوانند مجوزهای برنامههایی را که قبلاً نصب کردهاند، مشاهده کنند. کاربران همچنین می توانند در صورت انتخاب برخی از عملکردها را در سطح جهانی خاموش کنند، مانند غیرفعال کردن GPS، رادیو یا وای فای.
در صورتی که یک برنامه سعی کند از یک ویژگی محافظت شده استفاده کند که در مانیفست برنامه اعلام نشده است، شکست مجوز معمولاً منجر به بازگرداندن یک استثنا امنیتی به برنامه می شود. بررسی های مجوز API محافظت شده در پایین ترین سطح ممکن برای جلوگیری از دور زدن اعمال می شود. نمونهای از پیامرسانی کاربر هنگام نصب برنامه در حین درخواست دسترسی به APIهای محافظت شده در شکل 2 نشان داده شده است.
مجوزهای پیش فرض سیستم در https://developer.android.com/reference/android/Manifest.permission.html توضیح داده شده است. برنامهها ممکن است مجوزهای خود را برای استفاده از سایر برنامهها اعلام کنند. چنین مجوزهایی در مکان فوق ذکر نشده است.
هنگام تعریف یک مجوز، یک ویژگی protectLevel به سیستم می گوید که چگونه کاربر باید از برنامه هایی که نیاز به مجوز دارند مطلع شود یا چه کسی مجاز به داشتن مجوز است. جزئیات مربوط به ایجاد و استفاده از مجوزهای خاص برنامه در https://developer.android.com/guide/topics/security/security.html شرح داده شده است.
برخی از قابلیتهای دستگاه، مانند توانایی ارسال پیامهای ارسال پیامک، وجود دارد که برای برنامههای شخص ثالث در دسترس نیست، اما ممکن است توسط برنامههای از پیش نصب شده توسط OEM استفاده شود. این مجوزها از مجوز signatureOrSystem استفاده می کنند.
نحوه درک کاربران از برنامه های شخص ثالث
اندروید تلاش می کند تا زمانی که کاربران در حال تعامل با برنامه های شخص ثالث هستند، این موضوع را برای کاربران روشن کند و کاربر را از قابلیت های آن برنامه ها آگاه کند. قبل از نصب هر برنامه ای، پیام واضحی در مورد مجوزهای متفاوتی که برنامه درخواست می کند به کاربر نشان داده می شود. پس از نصب، دیگر از کاربر خواسته نمی شود که هیچ مجوزی را تأیید کند.
دلایل زیادی برای نمایش مجوزها بلافاصله قبل از زمان نصب وجود دارد. این زمانی است که کاربر به طور فعال اطلاعات مربوط به برنامه، توسعه دهنده و عملکرد را بررسی می کند تا تعیین کند که آیا با نیازها و انتظارات آنها مطابقت دارد یا خیر. همچنین مهم است که آنها هنوز تعهد ذهنی یا مالی نسبت به برنامه ایجاد نکرده اند و به راحتی می توانند برنامه را با سایر برنامه های کاربردی دیگر مقایسه کنند.
برخی دیگر از پلتفرمها از رویکرد متفاوتی برای اطلاعرسانی کاربر استفاده میکنند و در ابتدای هر جلسه یا زمانی که برنامهها در حال استفاده هستند، مجوز درخواست میکنند. چشم انداز اندروید این است که کاربران به دلخواه خود به طور یکپارچه بین برنامه ها جابجا شوند. ارائه هر بار تایید باعث کاهش سرعت کاربر و جلوگیری از ارائه یک تجربه کاربری عالی توسط اندروید می شود. داشتن مجوزهای بازبینی کاربر در زمان نصب به کاربر این امکان را می دهد که اگر احساس ناراحتی کرد، برنامه را نصب نکند.
همچنین، بسیاری از مطالعات رابط کاربری نشان داده اند که درخواست بیش از حد از کاربر باعث می شود که کاربر شروع به گفتن "OK" به هر گفتگوی نشان داده شده کند. یکی از اهداف امنیتی اندروید، انتقال موثر اطلاعات امنیتی مهم به کاربر است که با استفاده از دیالوگ هایی که کاربر آموزش دیده نادیده گرفته می شود، نمی توان این کار را انجام داد. با ارائه اطلاعات مهم یک بار و تنها در مواقعی که مهم است، احتمال بیشتری وجود دارد که کاربر به آنچه که با آن موافقت می کند فکر کند.
برخی از پلتفرمها تصمیم میگیرند که اصلاً اطلاعاتی درباره عملکرد برنامه نشان ندهند. این رویکرد باعث میشود که کاربران نتوانند به راحتی قابلیتهای برنامه را درک کنند و در مورد آن بحث کنند. در حالی که این امکان برای همه کاربران وجود ندارد که همیشه کاملاً آگاهانه تصمیم بگیرند، مدل مجوزهای Android باعث میشود اطلاعات مربوط به برنامهها به راحتی برای طیف گستردهای از کاربران قابل دسترسی باشد. برای مثال، درخواستهای مجوزهای غیرمنتظره میتواند کاربران پیچیدهتر را وادار کند تا سؤالات مهمی درباره عملکرد برنامه بپرسند و نگرانیهای خود را در مکانهایی مانند Google Play که برای همه کاربران قابل مشاهده است به اشتراک بگذارند.
مجوزها در نصب برنامه - Google Translate | مجوزهای یک برنامه نصب شده - Gmail |
![]() | ![]() |
شکل 1. نمایش مجوزها برای برنامه ها
ارتباطات بین فرآیندی
فرآیندها می توانند با استفاده از هر یک از مکانیسم های سنتی نوع یونیکس ارتباط برقرار کنند. به عنوان مثال می توان به سیستم فایل، سوکت های محلی یا سیگنال ها اشاره کرد. با این حال، مجوزهای لینوکس همچنان اعمال می شود.
اندروید همچنین مکانیسم های IPC جدیدی را ارائه می دهد:
Binder : یک مکانیسم فراخوانی روش از راه دور مبتنی بر قابلیت سبک وزن که برای کارایی بالا در هنگام انجام تماس های درون فرآیندی و متقابل طراحی شده است. Binder با استفاده از درایور لینوکس سفارشی پیاده سازی می شود. به https://developer.android.com/reference/android/os/Binder.html مراجعه کنید.
خدمات : سرویسها (در بالا مورد بحث قرار گرفت) میتوانند رابطهایی را فراهم کنند که مستقیماً با استفاده از کلاسور قابل دسترسی هستند.
Intents : یک Intent یک شیء پیام ساده است که نشان دهنده یک "نیت" برای انجام کاری است. به عنوان مثال، اگر برنامه شما بخواهد یک صفحه وب را نمایش دهد، با ایجاد یک نمونه Intent و تحویل آن به سیستم، "نیت" خود را برای مشاهده URL بیان می کند. سیستم قطعه دیگری از کد (در این مورد، مرورگر) را که می داند چگونه آن Intent را مدیریت کند، پیدا می کند و آن را اجرا می کند. Intent ها همچنین می توانند برای پخش رویدادهای جالب (مانند اعلان) در سراسر سیستم استفاده شوند. به https://developer.android.com/reference/android/content/Intent.html مراجعه کنید.
ContentProvider : یک ContentProvider یک انبار داده است که دسترسی به داده ها را در دستگاه فراهم می کند. مثال کلاسیک ContentProvider است که برای دسترسی به لیست مخاطبین کاربر استفاده می شود. یک برنامه کاربردی میتواند به دادههایی دسترسی پیدا کند که سایر برنامهها از طریق یک ContentProvider در معرض نمایش قرار دادهاند، و یک برنامه کاربردی همچنین میتواند ContentProviders خود را برای افشای دادههای خودش تعریف کند. به https://developer.android.com/reference/android/content/ContentProvider.html مراجعه کنید.
در حالی که میتوان IPC را با استفاده از مکانیسمهای دیگری مانند سوکتهای شبکه یا فایلهای قابل نوشتن جهانی پیادهسازی کرد، اینها چارچوبهای IPC Android توصیه میشوند. توسعه دهندگان اندروید تشویق خواهند شد تا از بهترین شیوه ها در مورد ایمن سازی داده های کاربران و اجتناب از معرفی آسیب پذیری های امنیتی استفاده کنند.
APIهای حساس به هزینه
API حساس به هزینه هر عملکردی است که ممکن است برای کاربر یا شبکه هزینه ایجاد کند. پلتفرم Android APIهای حساس به هزینه را در لیست APIهای محافظت شده تحت کنترل سیستم عامل قرار داده است. کاربر باید به برنامه های شخص ثالثی که درخواست استفاده از API های حساس به هزینه را دارند، مجوز صریح بدهد. این APIها عبارتند از:
- تلفن
- SMS/MMS
- شبکه/داده
- صورتحساب درون برنامه ای
- دسترسی NFC
اندروید 4.2 کنترل بیشتری بر استفاده از پیامک اضافه می کند. اگر برنامهای بخواهد به کد کوتاهی که از خدمات ممتاز استفاده میکند که ممکن است هزینههای اضافی را به همراه داشته باشد، پیامک ارسال کند، اندروید اعلانی ارائه میکند. کاربر می تواند انتخاب کند که آیا به برنامه اجازه ارسال پیام را بدهد یا آن را مسدود کند.
دسترسی به سیم کارت
دسترسی سطح پایین به سیم کارت برای برنامه های شخص ثالث در دسترس نیست. سیستم عامل تمام ارتباطات با سیم کارت از جمله دسترسی به اطلاعات شخصی (مخاطبین) روی حافظه سیم کارت را انجام می دهد. برنامه ها همچنین نمی توانند به دستورات AT دسترسی داشته باشند، زیرا این دستورات منحصراً توسط لایه رابط رادیویی (RIL) مدیریت می شوند. RIL هیچ API سطح بالایی برای این دستورات ارائه نمی دهد.
اطلاعات شخصی
Android API هایی را که دسترسی به داده های کاربر را فراهم می کند در مجموعه API های محافظت شده قرار داده است. با استفاده معمولی، دستگاههای Android نیز دادههای کاربر را در برنامههای شخص ثالث نصب شده توسط کاربران جمعآوری میکنند. برنامههایی که انتخاب میکنند این اطلاعات را به اشتراک بگذارند، میتوانند از بررسیهای مجوز سیستم عامل Android برای محافظت از دادهها در برابر برنامههای شخص ثالث استفاده کنند.
![دسترسی به داده های حساس کاربر فقط از طریق API های محافظت شده در دسترس است](https://source.android.com/docs/security/images/permissions_check.png?authuser=2&hl=fa)
شکل 2. دسترسی به داده های حساس کاربر فقط از طریق API های محافظت شده در دسترس است
ارائه دهندگان محتوای سیستمی که احتمالاً حاوی اطلاعات شخصی یا شناسایی شخصی مانند مخاطبین و تقویم هستند، با مجوزهای مشخص و واضح ایجاد شده اند. این جزئیات، نشانههای واضحی از انواع اطلاعاتی که ممکن است به برنامه ارائه شود در اختیار کاربر قرار میدهد. در طول نصب، یک برنامه شخص ثالث ممکن است برای دسترسی به این منابع اجازه درخواست کند. در صورت اعطای مجوز، برنامه قابل نصب است و در هر زمانی که نصب شود به داده های درخواستی دسترسی خواهد داشت.
هر برنامهای که اطلاعات شخصی را جمعآوری میکند، بهطور پیشفرض، این دادهها را فقط به برنامه خاصی محدود میکند. اگر برنامهای تصمیم بگیرد که دادهها را از طریق IPC در اختیار سایر برنامهها قرار دهد، برنامهای که به آن دسترسی میدهد میتواند مجوزهایی را برای مکانیسم IPC اعمال کند که توسط سیستم عامل اعمال میشود.
دستگاه های ورودی داده های حساس
دستگاههای Android اغلب دستگاههای ورودی داده حساسی را ارائه میکنند که به برنامهها اجازه میدهد با محیط اطراف مانند دوربین، میکروفون یا GPS تعامل داشته باشند. برای دسترسی یک برنامه شخص ثالث به این دستگاهها، ابتدا باید به صراحت توسط کاربر از طریق استفاده از مجوزهای سیستم عامل Android امکان دسترسی به آن فراهم شود. پس از نصب، نصبکننده از کاربر درخواست میکند که با نام سنسور اجازه دریافت کند.
اگر برنامه ای بخواهد مکان کاربر را بداند، برنامه برای دسترسی به موقعیت مکانی کاربر به مجوز نیاز دارد. پس از نصب، نصبکننده از کاربر میپرسد که آیا برنامه میتواند به مکان کاربر دسترسی داشته باشد یا خیر. در هر زمان، اگر کاربر نمیخواهد هیچ برنامهای به موقعیت مکانی خود دسترسی پیدا کند، کاربر میتواند برنامه «تنظیمات» را اجرا کند، به «مکان و امنیت» رفته و تیک «استفاده از شبکههای بیسیم» و «فعال کردن ماهوارههای GPS» را بردارید. . این کار خدمات مبتنی بر مکان را برای همه برنامههای موجود در دستگاه کاربر غیرفعال میکند.
فراداده دستگاه
اندروید همچنین تلاش میکند دسترسی به دادههایی را که ذاتاً حساس نیستند، اما ممکن است بهطور غیرمستقیم ویژگیهای کاربر، ترجیحات کاربر و نحوه استفاده از دستگاه را نشان دهد، محدود کند.
برنامهها بهطور پیشفرض به گزارشهای سیستم عامل، تاریخچه مرورگر، شماره تلفن یا اطلاعات شناسایی سختافزار/شبکه دسترسی ندارند. اگر برنامه ای در زمان نصب درخواست دسترسی به این اطلاعات را داشته باشد، نصب کننده از کاربر می خواهد که آیا برنامه می تواند به اطلاعات دسترسی پیدا کند یا خیر. اگر کاربر اجازه دسترسی ندهد، برنامه نصب نخواهد شد.
مقامات صدور گواهی
Android شامل مجموعه ای از مقامات گواهی سیستم نصب شده است که در سراسر سیستم قابل اعتماد هستند. قبل از Android 7.0، سازندگان دستگاه میتوانستند مجموعه CAهای ارسال شده روی دستگاههای خود را تغییر دهند. با این حال، دستگاههایی که نسخههای 7.0 و بالاتر را اجرا میکنند، مجموعهای یکنواخت از CA سیستم خواهند داشت، زیرا تغییر توسط سازندگان دستگاه دیگر مجاز نیست.
برای اضافه شدن به عنوان یک CA عمومی جدید به مجموعه سهام Android، CA باید فرآیند گنجاندن موزیلا CA را تکمیل کند و سپس یک درخواست ویژگی را علیه Android ارسال کند ( https://code.google.com/p/android/issues/entry ) برای افزودن CA به مجموعه Android CA موجود در پروژه منبع باز Android (AOSP).
هنوز CAهایی هستند که مختص دستگاه هستند و نباید در مجموعه اصلی CAهای AOSP گنجانده شوند، مانند CAهای خصوصی شرکتهای مخابراتی که ممکن است برای دسترسی ایمن به اجزای زیرساخت شرکت مخابراتی، مانند دروازههای SMS/MMS مورد نیاز باشند. تولیدکنندگان دستگاه تشویق میشوند که CA خصوصی را فقط در مؤلفهها/برنامههایی که باید به این CA اعتماد کنند، بگنجانند. برای جزئیات بیشتر، پیکربندی امنیت شبکه را ببینید.
امضای برنامه
امضای کد به توسعه دهندگان این امکان را می دهد که نویسنده برنامه را شناسایی کرده و برنامه خود را بدون ایجاد رابط ها و مجوزهای پیچیده به روز کنند. هر برنامه ای که بر روی پلتفرم اندروید اجرا می شود باید توسط توسعه دهنده امضا شود. برنامههایی که سعی میکنند بدون امضا نصب شوند، توسط Google Play یا نصبکننده بسته در دستگاه Android رد میشوند.
در Google Play، امضای برنامه، اعتمادی را که Google به توسعهدهنده دارد و اعتمادی که توسعهدهنده به برنامه خود دارد، پیوند میدهد. توسعهدهندگان میدانند که برنامه آنها بدون تغییر در دستگاه Android ارائه شده است. و توسعه دهندگان را می توان در قبال رفتار برنامه خود پاسخگو دانست.
در اندروید، امضای برنامه اولین قدم برای قرار دادن یک برنامه در Application Sandbox آن است. گواهی برنامه امضا شده مشخص می کند که کدام شناسه کاربری با کدام برنامه مرتبط است. برنامه های مختلف تحت شناسه های کاربری مختلف اجرا می شوند. امضای برنامه تضمین می کند که یک برنامه نمی تواند به برنامه دیگری دسترسی داشته باشد مگر از طریق IPC کاملاً تعریف شده.
هنگامی که یک برنامه (فایل APK) روی دستگاه Android نصب می شود، Package Manager تأیید می کند که APK به درستی با گواهی موجود در آن APK امضا شده است. اگر گواهی (یا بهطور دقیقتر، کلید عمومی در گواهی) با کلید مورد استفاده برای امضای هر APK دیگری در دستگاه مطابقت داشته باشد، APK جدید این گزینه را دارد که در مانیفست مشخص کند که یک UID را با دیگری به اشتراک بگذارد. APK های امضا شده
برنامه ها را می توان توسط شخص ثالث (OEM، اپراتور، بازار جایگزین) امضا کرد یا خود امضا کرد. Android امضای کد را با استفاده از گواهینامههای خودامضا ارائه میکند که توسعهدهندگان میتوانند بدون کمک یا اجازه خارجی ایجاد کنند. درخواست ها نباید توسط یک مقام مرکزی امضا شوند. Android در حال حاضر تأیید CA را برای گواهیهای برنامه انجام نمیدهد.
برنامهها همچنین میتوانند مجوزهای امنیتی را در سطح حفاظت از امضا اعلام کنند، و دسترسی را فقط به برنامههایی که با همان کلید امضا شدهاند محدود میکنند و در عین حال UID و Application Sandboxهای مجزا را حفظ میکنند. یک رابطه نزدیکتر با یک Sandbox برنامه مشترک از طریق ویژگی UID مشترک مجاز است که در آن دو یا چند برنامه که با کلید توسعه دهنده یکسان امضا شده اند می توانند یک UID مشترک را در مانیفست خود اعلام کنند.
تأیید برنامه
Android 4.2 و نسخه های جدیدتر از تأیید برنامه پشتیبانی می کند. کاربران میتوانند «تأیید برنامهها» را فعال کنند و برنامهها را قبل از نصب توسط تأییدکننده برنامه ارزیابی کنند. تأیید برنامه میتواند در صورت تلاش برای نصب برنامهای که ممکن است مضر باشد به کاربر هشدار دهد؛ اگر برنامهای بهخصوص بد باشد، میتواند نصب را مسدود کند. .
مدیریت حقوق دیجیتال
پلتفرم Android یک چارچوب DRM توسعهیافته را ارائه میکند که به برنامهها اجازه میدهد محتوای محافظتشده با حقوق را بر اساس محدودیتهای مجوز مرتبط با محتوا مدیریت کنند. چارچوب DRM از بسیاری از طرح های DRM پشتیبانی می کند. طرحهای DRM که یک دستگاه پشتیبانی میکند به سازنده دستگاه واگذار میشود.
چارچوب Android DRM در دو لایه معماری پیاده سازی شده است (شکل زیر را ببینید):
یک API چارچوب DRM، که از طریق چارچوب برنامه اندروید در معرض برنامهها قرار میگیرد و از طریق ART VM برای برنامههای استاندارد اجرا میشود.
یک مدیر DRM کد بومی، که چارچوب DRM را پیادهسازی میکند و یک رابط برای پلاگینهای DRM (نمایندگان) برای مدیریت حقوق و رمزگشایی برای طرحهای مختلف DRM در معرض دید قرار میدهد.
شکل 3. معماری مدیریت حقوق دیجیتال در پلتفرم اندروید