標籤:
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、CheckPermission1. 如果傳入的 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、CheckUriPermission1. 如果 uid 為 0 ,說明是 root 使用者,那麼不控制許可權。
2. 否則,在 ActivityManagerService 維護的 mGrantedUriPermissions 這個表中尋找這個 uid 是否含有這個許可權,如果有再檢查其請求的是讀還是寫入權限。
5、總結上文介紹過基於UID和GID的Android安全機制,使用的是Linux的許可權存取控制,控制檔案和裝置訪問。這次講的Android Permission許可權機制是對Android安全機制的一個重要補充,控制了應用對於系統介面或者對外介面的訪問。後續再講Android 簽名機制和Selinux Android
6、參考文獻1、http://dengzhangtao.iteye.com/blog/1990138
2、http://www.ibm.com/developerworks/cn/opensource/os-cn-android-sec/3、http://www.cnblogs.com/senix/archive/2013/01/15/2853733.html
Android安全機制(2) Android Permission許可權控制機制