همانطور که در مطالب قبلی توضیح داده شد، اندروید بر روی هستهی لینوکس نگارش 2.6 به بالا اجرا میشود. در این مطلب قصد داریم تا نگاهی به معماری امنیتی اندروید داشته باشیم.
Privilege Separation به چه معناست؟
هستهی اندروید یک مدل جداسازی امتیازی (
Privilege separation) را در زمان اجرای برنامههای کاربردی اجرا میکند. این مورد به این معنا است که مانند سیستم یونیکس، سیستمعامل اندروید به یک برنامه نیاز دارد تا تنها با شناسهی کاربر خود و شناسهی گروه خاص خودش اجرا شود. بخشهای معماری سیستم اندروید به این روش از هم جدا شدهاند.
Privilege Separation یک ویژگی امنیتی مهم است؛ زیرا رایجترین انواع حملات را انکار میکند و در نتیجه یکی از اولویتهای یک برنامه میباشد. از آنجایی که عملیات جداسازی امتیازی را هسته انجام میدهد، لذا این مورد یکی از مباحث پر اهمیت در طراحی هسته میباشد که به شدت مورد توجه خواهد بود. تنها فلسفه پشت این طرح این است که اطمینان حاصل شود، هیچ برنامهی کاربردی نمیتواند به کد یا دادههای دیگر برنامهها و یا به دستگاه کاربر و یا خود سیستم نفوذ کند. یک برنامه ممکن است مستقیما از فهرست تماس دستگاه یا تقویم خوانده نشود! این ویژگی همچنین به عنوان
sandboxing شناخته میشود.
Permissions چگونه کار میکند؟
اجازه دهید با یک مثال ساده توضیح دهم: ما برنامهای را داریم که صدا را ضبط کرده و آنرا از طریق میکروفن دستگاه پخش میکند. برای اینکه برنامه بهدرستی کار کند، توسعه دهنده باید یک درخواست دسترسی به RECORD_AUDIO را برای اجازه دسترسی به ضبط صدا، در فایل AndroidManifest.xml بفرستد. این کار به برنامه ما اجازه میدهد تا از مؤلفههای سیستم که ضبط صدا را کنترل میکنند، استفاده کنیم. یک سؤال اینجا مطرح میشود که «چه کسی تصمیم میگیرد که این دسترسی داده شود یا اینکه تکذیب شود؟»
فقط و فقط هستهی اندروید به کاربر نهایی اجازه میدهد تا این فرآیند تایید نهایی را انجام دهد؛ نه هیچ سیستم دیگر یا کاربر دیگری! زمانیکه کاربر، برنامه ما را نصب میکند، این کار او را تشویق میکند تا این عملیات را انجام دهد. به این نکته دقت کنید که عجله ای برای این دسترسی وجود ندارد و هر زمانیکه برنامه نصب شد، اتفاق خواهد افتاد و این مجوز دسترسی تنها در زمان نصب به کاربر داده میشود نه قبل از آن. (به تصویر زیر دقت کنید)
اگر ما درخواست خود را برای دسترسی به RECORD_AUDIO ثبت نکنیم یا اگر صاحب دستگاه تائید نکند که پس از درخواست ما اجازه استفاده از آن را بدهد، آنگاه یک استثناء به حافظهی مجازی (VM) داده خواهد شد و برنامه با شکست روبرو میشود. این مفهوم برای توسعه دهندهاست که بداند در خواستی را صادر کرده است یا خیر؟ پس برای درخواست مجوز مورد نظر باید برچسب زیر، در فایل AndroidManifest.xml درج شود.
<uses-permission android:name="android.permission.RECORD_AUDIO" />
Application Code Signing
هر برنامهی کاربردی که بر روی سیستمعامل اندروید اجرا میشود، باید امضاء شود. اندروید از گواهی توسعه دهندگان فردی برای شناسایی آنها و ایجاد روابط اعتمادسازی استفاده میکند که در میان کاربردهای مختلفی که در سیستمعامل اجرا میشوند پیاده میشود.
سیستمعامل مجاز به اجرای برنامهای بدون امضاء نخواهد بود.
استفادهی از یک مرجع، برای صدور امضای یک برنامه لازم نیست؛ چرا که سیستم امنیتی اندروید تنها از یک امضای تک گانه که توسعه دهنده در برنامه قرار دادهاست پیروی میکند! مجوزهای کنترلی برنامه مانند امضاء در طول نصب برنامه از طریق هستهی اندروید بررسی شده و ضمانت و تایید خواهند شد. تمامی این فرآیندها به صورت خودکار و بلادرنگ در پشت پرده به سرعت اتفاق میافتند! در این صورت اگر گواهی اعتماد (certificate) توسط توسعه دهنده منقضی شود و یا به نحوی مورد اطمینان برای دستگاه نباشد، تمامی عملیاتهای ذکر شده بر روی برنامه به صورت عادی، ادامه خواهند یافت.