Android安全机制(2) Android Permission权限控制机制
生活随笔
收集整理的這篇文章主要介紹了
Android安全机制(2) Android Permission权限控制机制
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://blog.csdn.net/vshuang/article/details/44001661
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
目錄(?)[+]
1、概述?
? ? ? ??Android?是一個權限分離的系統 。 這是利用 Linux 已有的權限管理機制,通過為每一個 Application 分配不同的 uid 和 gid , 從而使得不同的 Application 之間的私有數據和訪問( native 以及?Java?層通過這種 sandbox 機制,都可以)達到隔離的目的 。 與此 同時, Android 還 在此基礎上進行擴展,提供了 permission 機制,它主要是用來對 Application 可以執行的某些具體操作進行權限細分和訪問控制,同時提供了 per-URI permission 機制,用來提供對某些特定的數據塊進行 ad-hoc 方式的訪問
2、Android Permission機制
一個權限主要包含三個方面的信息:權限的名稱;屬于的權限組;保護級別。一個權限組是指把權限按照功能分成的不同的集合。每一個權限組包含若干具體 權限,例如在 COST_MONEY 組中包含 android.permission.SEND_SMS , android.permission.CALL_PHONE 等和費用相關的權限。 Android權限等級劃分為normal,dangerous,signature,signatureOrSystem,system,development,不同的保護級別代表了程序要使用此權限時的認證方式。 normal 的權限只要申請了就可以使用 dangerous 的權限在安裝時需要用戶確認才可以使用? ? ? ? signature需要簽名才能賦予權限,
? ? ? ? signatureOrSystem需要簽名或者系統級應用(放置在/system/app目錄下)才能賦予權限,
? ? ? ? system系統級應用(放置在/system/app目錄下)才能賦予權限,系統權限的描述在frameworks/base/core/res/AndroidManifest.xml當中。
? ? ? ? Package 的權限信息主要 通過在 AndroidManifest.xml 中通過一些標簽來指定。如 <permission> 標簽, <permission-group> 標簽 <permission-tree> 等標簽。如果 package 需要申請使用某個權限,那么需要使用 <use-permission> 標簽來指定。
3、Android 提供的Permission 接口?
3.1、CheckPermission
? ? ? ? 下面這一組接口主要用來檢查某個調用(或者是其它 package 或者是自己)是否擁有訪問某個 permission 的權限。參數中 pid 和 uid 可以指定,如果沒有指定,那么 framework 會通過 Binder 來獲取調用者的 uid 和 pid 信息,加以填充。返回值為 PackageManager.PERMISSION_GRANTED 或者 PackageManager.PERMISSION_DENIED?public int checkPermission(String permission, int pid, int uid) // 檢查某個 uid 和 pid 是否有 permission 權限
public int checkCallingPermission(String permission) // 檢查調用者是否有 permission 權限,如果調用者是自己那么返回 PackageManager.PERMISSION_DENIED
public int checkCallingOrSelfPermission(String permission) // 檢查自己或者其它調用者是否有 permission 權限
? ? ? ? 下面這一組和上面類似,如果遇到檢查不通過時,會拋出異常,打印消息 。
public void enforcePermission(String permission, int pid, int uid, String message)
public void enforceCallingPermission(String permission, String message)
public void enforceCallingOrSelfPermission(String permission, String message)
3.2、CheckUriPermission
? ? ? ? 為某個 package 添加訪問 content Uri 的讀或者寫權限。public void grantUriPermission(String toPackage, Uri uri, int modeFlags)
public void revokeUriPermission(Uri uri, int modeFlags)
? ? ? ? 檢查某個 pid 和 uid 的 package 是否擁有 uri 的讀寫權限,返回值表示是否被 granted 。
public int checkUriPermission(Uri uri, int pid, int uid, int modeFlags)
public int checkCallingUriPermission(Uri uri, int modeFlags)
public int checkCallingOrSelfUriPermission(Uri uri, int modeFlags)
public int checkUriPermission(Uri uri, String readPermission,String writePermission, int pid, int uid, int modeFlags)
? ? ? ? 檢查某個 pid 和 uid 的 package 是否擁有 uri 的讀寫權限,如果失敗則拋出異常,打印消息 。
public void enforceUriPermission(Uri uri, int pid, int uid, int modeFlags, String message)
public void enforceCallingUriPermission(Uri uri, int modeFlags, String message)
public void enforceCallingOrSelfUriPermission(Uri uri, int modeFlags, String message)
public void enforceUriPermission(Uri uri, String readPermission, String writePermission,int pid, int uid, int modeFlags, String message)
其中check開頭的,只做檢查。enforce開頭的,不單檢查,沒有權限的還會拋出異常。
4、權限機制實現分析
4.1、CheckPermission
1. 如果傳入的 permission 名稱為 null ,那么返回 PackageManager.PERMISSION_DENIED 。2. 判斷調用者 uid 是否符合要求 。
1 ) 如果 uid 為 0 ,說明是 root 權限的進程,對權限不作控制。
2 ) 如果 uid 為 system server 進程的 uid ,說明是 system server ,對權限不作控制。
3 ) 如果是 ActivityManager 進程本身,對權限不作控制。
4 )如果調用者 uid 與參數傳入的 req uid 不一致,那么返回 PackageManager.PERMISSION_DENIED 。
3. 如果通過 2 的檢查后,再 調用 PackageManagerService.checkUidPermission ,判斷 這個 uid 是否擁有相應的權限,分析如下 。
1 ) 首先它通過調用 getUserIdLP ,去 PackageManagerService.Setting.mUserIds 數組中,根據 uid 查找 uid (也就是 package )的權限列表。一旦找到,就表示有相應的權限。
2 ) 如果沒有找到,那么再去 PackageManagerService.mSystemPermissions 中找。這些信息是啟動時,從 /system/etc/permissions/platform.xml 中讀取的。這里記錄了一些系統級的應用的 uid 對應的 permission 。
3 )返回結果 。
4.2、CheckUriPermission
1. 如果 uid 為 0 ,說明是 root 用戶,那么不控制權限。2. 否則,在 ActivityManagerService 維護的 mGrantedUriPermissions 這個表中查找這個 uid 是否含有這個權限,如果有再檢查其請求的是讀還是寫權限。
5、總結
上文介紹過基于UID和GID的Android安全機制,使用的是Linux的權限訪問控制,控制文件和設備訪問。 這次講的Android Permission權限機制是對Android安全機制的一個重要補充,控制了應用對于系統接口或者對外接口的訪問。 后續再講Android 簽名機制和Selinux Android6、參考文獻
1、http://dengzhangtao.iteye.com/blog/19901382、http://www.ibm.com/developerworks/cn/opensource/os-cn-android-sec/ 3、http://www.cnblogs.com/senix/archive/2013/01/15/2853733.html
? ? 本文轉自 一點點征服 ? 博客園博客,原文鏈接:http://www.cnblogs.com/ldq2016/p/5557130.html,如需轉載請自行聯系原作者
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的Android安全机制(2) Android Permission权限控制机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 四格漫画《MUXing》——度姐传说
- 下一篇: Android开发者指南(4) —— A