1. 程式人生 > >Android uid和pid安全機制

Android uid和pid安全機制

1、概述

  Android 安全機制來源於Linux,並且以Linux許可權管理為基礎,要了解Android的安全機制,需要從linux中的安全機制瞭解開始,而使用者的許可權管理又是linux安全機制的最基本的一個組成

2.Android 系統中的UID、GID、GIDS與PID

    在 Android 上,一個使用者 UID 標示一個應用程式。應用程式在安裝時被分配使用者 UID,應用程式在裝置上的存續期間內,使用者 UID 保持不變。對於普通的應用程式,GID即等於UID。

    GIDS 是由框架在 Application 安裝過程中生成,與 Application 申請的具體許可權相關。 如果 Application 申請的相應的 permission 被 granted ,而且有對應的GIDS, 那麼 這個Application 的 gids 中將 包含這個 gids。記住許可權(GIDS)是關於允許或限制應用程式(而不是使用者)訪問裝置資源。

    Android 使用沙箱的概念來實現應用程式之間的分離和許可權,以允許或拒絕一個應用程式訪問裝置的資源,比如說檔案和目錄、網路、感測器和 API。為此,Android 使用一些 Linux 實用工具(比如說程序級別的安全性、與應用程式相關的使用者和組 ID,以及許可權),來實現應用程式被允許執行的操作。

3.android沙箱

Android“沙箱”的本質是為了實現不同應用程式和程序之間的互相隔離,即在預設情況 下,應用程式沒有許可權訪問系統資源或其它應用程式的資源。每個APP和系統程序都被分配唯一併且固定的User Id,這個uid與核心層程序的uid對應。每個APP在各自獨立的Dalvik虛擬機器中執行,擁有獨立的地址空間和資源。運行於Dalvik虛擬機器中的 程序必須依託核心層Linux程序而存在,因此Android使用Dalvik虛擬機器和Linux的檔案訪問控制來實現沙箱機制,任何應用程式如果想要訪 問系統資源或者其它應用程式的資源必須在自己的manifest檔案中進行宣告許可權或者共享uid。

安裝在裝置中的每一個apk檔案,Android給每個APK程序分配一個單獨的使用者空間,其manifest中的userid就是對應一個Linux 使用者都會被分配到一個屬於自己的統一的Linux使用者ID,並且為它建立一個沙箱,以防止影響其他應用程式(或者其他應用程式影響它)。使用者ID 在應用程式安裝到裝置中時被分配,並且在這個裝置中保持它的永久性。

通過Shared User id,擁有同一個User id的多個APK可以配置成執行在同一個程序中.所以預設就是可以互相訪問任意資料. 也可以配置成執行成不同的程序, 同時可以訪問其他APK的資料目錄下的資料庫和檔案.就像訪問本程式的資料一樣.

4.uid pid
PID:為Process Identifier, PID就是各程序的身份標識,程式一執行系統就會自動分配給程序一個獨一無二的PID。程序中止後PID被系統回收,可能會被繼續分配給新執行的程式,但是在android系統中一般不會把已經kill掉的程序ID重新分配給新的程序,新產生程序的程序號,一般比產生之前所有的程序號都要大。

UID:一般理解為User Identifier,UID在linux中就是使用者的ID,表明時哪個使用者運行了這個程式,主要用於許可權的管理。而在android 中又有所不同,因為android為單使用者系統,這時UID 便被賦予了新的使命,資料共享,為了實現資料共享,android為每個應用幾乎都分配了不同的UID,不像傳統的linux,每個使用者相同就為之分配相同的UID。(當然這也就表明了一個問題,android只能時單使用者系統,在設計之初就被他們的工程師給閹割了多使用者),使之成了資料共享的工具。

因此在android中PID,和UID都是用來識別應用程式的身份的,但UID是為了不同的程式來使用共享的資料。

5.通過uid共享資料

在android 中要通過UID共享資料只需在程式a,b中的menifest配置即可,具體如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.perseus.a"
      android:versionCode="1"
      android:versionName="1.0"
          android:sharedUserId="com.share"
>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.perseus.b"
      android:versionCode="1"
      android:versionName="1.0"
          android:sharedUserId="com.share"
>

這樣的話你也許會有疑問,如果讓其他的開發這知道了我們的shareUserId知道了我們的ID,那我們的資料不是暴露了,放心吧google不會犯這樣的低階錯誤的,我們要使不同的程式能夠相互訪問,還需要擁有相同的簽名,每個公司或者開發者的簽名是唯一的,這樣我們就不用擔心了,另外兩者能夠訪問,別忘了許可權

我的微信二維碼如下

這裡寫圖片描述

微信訂閱號二維碼如下:

這裡寫圖片描述