Android系統用於許可權檢查的函數較多,“PackageManagerService.java”中的“checkUidPermission”是其中底層的許可權檢查函數。“checkUidPermission”函數首先根據進程的“uid”找到相應的已經被獲批准的許可權集“GrantedPermission”,然後判斷此時請求的許可權名“permName”是否在“GrantedPermission”中。正如所示,本課題設計了函數“Permset”,它將許可權表和使用者表進行聯集查詢,根據“uid”返回對應的許可權集“permset”,然後RBAC判斷請求的許可權名permName是否在“permset”中,若不在,則返回錯誤碼。
1. 關鍵方法設計
當手機使用者通過安全性原則工具定製了安全性原則後,permTorole和uidTorole這兩張表也就形成了,現在需要知道給定一個uid,那麼使用者批准給它的許可權集是什嗎?為此設計了如下方法:
/ *
* return permissions set associated withuid
* @uid: the uid of App
* */
public HashSet<String>PermissionsSet(Stringuid);
此方法使用operation對象聯集查詢許可權表和使用者表,根據uid尋找相關的許可權,並返回HashSet<String>型的變數。由於HashSet採用紅/黑樹狀結構作為儲存結構,因此尋找效率較高,那麼這樣的設計會減少RBAC控制邏輯決策的時間開銷。
2. 修改checkUidPermission
為了實現RBAC存取控制,必須修改checkUidPermission方法,首先,根據參數uid找到其相關的許可權集,如下:
if(RbacDebug.rbac== true) {
permset =PermissionsSet(String.valueOf(uid));
}
接著,在Android已經批准了該許可權後,添加RBAC控制碼,如下:
if(RbacDebug.rbac== true) {
if(permset.isEmpty() == true ||permset.contains(permName) == true) {
return PackageManager.PERMISSION_GRANTED;
}
else {
return PackageManager.PERMISSION_DENIED;
}
}