<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 電源與新能源 > 設計應用 > 詳解Android 安全機制

詳解Android 安全機制

作者: 時(shí)間:2012-04-29 來(lái)源:網(wǎng)絡(luò ) 收藏
被卸載,但數據還有保留),或者 package 數據結構中根本不含有這個(gè) permission-tree ,那么將這個(gè)permission-tree 清除。

  2. 清除不一致的 permission 信息。如果 packageSettings 或者 package 結構為空(未解析該 package 或者被卸載,但數據有保留),或者package 中根本沒(méi)有定義該 permission ,那么將該 permission 清除。

  第九步。對每一個(gè) package 進(jìn)行輪詢(xún),并進(jìn)行 permission 授權。

  1. 對申請的進(jìn)行檢查,并更新 grantedPermissions 列表

  2. 如果其沒(méi)有設置 shared user id ,那么將其 gids 初始化為 mGlobalGids ,它從 permission.xml 中讀取。

  3. 遍歷所有申請的,進(jìn)行如下檢查

  1 )如果是該是 normal 或者 dangerous 的。通過(guò)檢查。

  2 )如果權限需要簽名驗證。如果簽名驗證通過(guò)。還需要進(jìn)行如下檢查

  * 如果程序升級,而且是 system package 。那么是否授予該權限要看原來(lái)的 package 是否被授予了該權限。如果被授予了,那么通過(guò)檢查,否則不通過(guò)。

  * 如果是新安裝的。那么檢查通過(guò)。

  4. 如果 3 中檢查通過(guò),那么將這個(gè) permission 添加到 package 的 grantedPermissions 列表中,表示這個(gè) permission 申請成功( granted)。申請成功的同時(shí)會(huì )將這個(gè)申請到的 permission 的 gids 添加到這個(gè) package 的 gids 中去。

  5. 將 permissionsFixed 字段標準為 ture ,表示這個(gè) packge 的 permission 進(jìn)行過(guò)修正。后續將禁止對非 system 的 app 的權限進(jìn)行再次修正。

  2.1.3 Dynamic permission 的管理

  PackageManagerService 提供了 addPermission/ removePermission 接口用來(lái)動(dòng)態(tài)添加和刪除一些權限。但是這些權限必須是所謂的動(dòng)態(tài)權限( BasePermission.TYPE_DYNAMIC )。

  一個(gè) Package 如果要添加 Dynamic permissions ,首先必須要在 manifest 中申明 permission-tree> 標簽,它實(shí)際上是一個(gè)權限的名字空間(例如,“ com.foo.far ”這個(gè)權限就是 permission-tree “com.foo ”的成員),本身不是一個(gè)權限。一個(gè) Package 只能為自己的 permission-tree 或者擁有相同的 uid 的 package 添加或者刪除權限。

  Package 不能夠通過(guò)這種接口去修改在 manifest 中靜態(tài)申請的權限,否則拋出異常。

  首先查找這個(gè) permission 在全局 permission 列表 mSettings.mPermissions 中是否存在。如果存在,而且類(lèi)型為BasePermission.TYPE_DYNAMIC 那么根據傳入的權限信息修改全局表中的權限信息,并觸發(fā) permissions.xml 的持久化。

  如果在全局的 permission 列表 mSettings.mPermissions 中沒(méi)有找到,先找到這個(gè) permission 所在 permissionTree ,然后添加到全局permission 列表 mSettings.mPermissions 中去,并觸發(fā) permissions.xml 的持久化。

  2.1.4 Uri permission 的管理

  下面兩個(gè) 接口 主要用于 Uri permission 的管理 (其實(shí)現在 ActivityManagerService 中)。

  // 為指定的 uid 和 targetPkg 添加對某個(gè) content Uri 的讀或者寫(xiě)權限。

  public void grantUriPermission(IApplicationThread caller, String targetPkg, Uri uri, int mode) throws RemoteException;

  // 清除所有通過(guò) grantUriPermission 對某個(gè) Uri 授予的權限。

  public void revokeUriPermission(IApplicationThread caller, Uri uri, int mode) throws RemoteException;

  grantUriPermission 主要的實(shí)現過(guò)程分析。

  grantUriPermission 分析:

  1. 驗證 caller 的 ProcessRecord 和 targetPkg 不為空。否則檢測不通過(guò)。

  2. 驗證所請求的 mode 為 Intent.FLAG_GRANT_READ_URI_PERMISSION 或者為 Intent.FLAG_GRANT_WRITE_URI_PERMISSION ,否則不通過(guò)。

  3. 確保參數 Uri 是一個(gè) content Uri 。否則,則檢測不通過(guò)。

  4. 通過(guò) Uri 得到目標 ContentProvider ,如果不存在,則檢測不通過(guò)。

  5. 從 PackageManagerService 中獲得 targetPkg 對應的 uid 。

  6. 檢查 target uid 所對應的 package 是否真正需要這個(gè)權限?

  先判斷要申請的是讀還是寫(xiě)權限,然后查看對應的 ContentProvider 中對應的 readPermission writePermission 字段是否保存了權限名稱(chēng)。如果該字段不為空,則以 target uid 和該權限名去PackageManagerService 中去查找該 uid 是否被 granted 了該權限。如果已經(jīng)獲得了該權限,那么無(wú)需再去為這個(gè) Activity 去申請這個(gè) Uri 權限了,返回。否者繼續執行如下操作。

  7. 檢查這個(gè) ContentProvider 的 grantUriPermissions 開(kāi)關(guān)變量,是否允許對其它 package 進(jìn)行權限的 grant 操作。如果禁止,那么拋出異常。

  8. 檢查這個(gè) ContentProvider 是否設置了 Uri 的過(guò)濾類(lèi)型 uriPermissionPatterns ,如果設置了過(guò)濾類(lèi)型,則將需要申請權限的 Uri 與之匹配。匹配不同過(guò),則拋出異常。

  9. 檢查調用者自己是否有權限訪(fǎng)問(wèn)這個(gè) Uri 。如果沒(méi)有,拋出異常。

  10. 從 mGrantedUriPermissions 中取得 target uid 對應的 HashMap《Uri, UriPermission》 數據結構。用 target uid 和 Uri 生成UriPermission 并保存在 mGrantedUriPermissions 中。

  revokeUriPermission 實(shí)現分析。

  找到該 Uri 對應的 ContentProvider ,然后刪除 mGrantedUriPermissions 中與 Uri 對應的所有權限。

  2.2 permission 的動(dòng)態(tài)檢查

  這里的動(dòng)態(tài)檢查是指是 package 在程序運行過(guò)程中進(jìn)行某些操作或者數據訪(fǎng)問(wèn)時(shí)才進(jìn)行的 check ,與之對應的是應用程序安裝或者升級時(shí) PackageManagerService 通過(guò)掃描包中的靜態(tài)權限信息相對應。

  系統與權限 檢查 相關(guān)的機制的實(shí)現主要集中在 PackageManagerService 和 ActivityManagerService 中。 ActivityManagerService 主要負責的是底層的 uid 層次的身份檢查; PackageManagerService 則維護了 uid 到自己擁有的和被授予的權限的一張表。在通過(guò) ActivityManagerService 的身份檢查后, PackageManagerService 根據請求者的 uid 來(lái)查看這張表,判斷其是否具有相應的權限。

  除此之外, per-URI permission 機制的實(shí)現也需要一張表,它維護在 ActivityManagerService 中,它建立了從 content URI 到被授權訪(fǎng)問(wèn)這個(gè) URI 的 component 之間的映射。但是它也需要借助 PackageManagerService 的機制來(lái)輔助實(shí)現。

  2.2.1 framework 提供的接口

   framework 中提供了一些接口用來(lái)對外來(lái)的訪(fǎng)問(wèn)(包括自己)進(jìn)行權限檢查 。 這些接口 主要通過(guò) ContextWrapper 提供,具體實(shí)現在 ContextImpl 中 。如果 package 接受到外來(lái)訪(fǎng)問(wèn)者的操作請求,那么可以調用這些接口進(jìn)行權限檢查。一般情況下可以把這些接口的檢查接口分為兩種,一種是返回錯誤,另一種是拋出異常。

  主要包含如下幾組:

  n permission 和 uid 檢查 API

  下面這一組接口主要用來(lái)檢查某個(gè)調用(或者是其它 package 或者是自己)是否擁有訪(fǎng)問(wèn)某個(gè) permission 的權限。參數中 pid 和 uid 可以指定,如果沒(méi)有指定,那么 framework 會(huì )通過(guò) Binder 來(lái)獲取調用者的 uid 和 pid 信息,加以填充。返回值為 PackageManager.PERMISSION_GRANTED 或者 PackageManager.PERMISSION_DENIED 。

  public int checkPermission(String permission, int pid, int uid) // 檢查某個(gè) uid 和 pid 是否有 permission 權限

  public int checkCallingPermission(String permission) // 檢查調用者是否有 permission 權限,如果調用者是自己那么返回PackageManager.PERMISSION_DENIED

  public int checkCallingOrSelfPermission(String permission) // 檢查自己或者其它調用者是否有 permission 權限

  下面這一組和上面類(lèi)似,如果遇到檢查不通過(guò)時(shí),會(huì )拋出異常,打印消息 。

  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)

  n per-URI 檢查 API

  為某個(gè) package 添加訪(fǎng)問(wèn) content Uri 的讀或者寫(xiě)權限。

  public void grantUriPermission(String toPackage, Uri uri, int modeFlags)

  public void revokeUriPermission(Uri uri, int modeFlags)

  檢查某個(gè) pid 和 uid 的 package 是否擁有 uri 的讀寫(xiě)權限,返回值表示是否被 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)

  檢查某個(gè) pid 和 uid 的 package 是否擁有 uri 的讀寫(xiě)權限,如果失敗則拋出異常,打印消息 。

  public void enforceUriPermission(Uri uri, int pid, int uid, int modeFlags, String message)

  public void enforceCallingUriPermission(Uri uri, int modeFlags, String m

pid控制相關(guān)文章:pid控制原理




評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>