Android安全—許可權模型

weixin_34185560發表於2017-04-30

從架構開始

對於Android架構的一般理解會是,”在Linux上的Java“。然而,不準確,這樣的描述直接忽略掉整個平臺的複雜架構。

縱觀全域性,架構由五部分組成,包括Android應用層,Android Framework,Dalvik虛擬機器,native code和Linux kernel。如圖

652417-041a0d4988f3f5ba.png
FFDE345A-04FA-4D21-8577-72C41AA35434.png

職能簡介

  • 應用層:允許開發者擴充套件與提升裝置功能,無需關注底層實現細節。
  • Framework:提供豐富的API呼叫Android裝置上的功能,包括管理UI元素,資料儲存與應用間傳遞資料。是應用層與Dalvik虛擬機器之間的粘合劑,

上述兩層都是使用Java開發並在Dalvik虛擬機器上執行的。

  • Dalvik:為作業系統特別設計的高效能抽象層,執行Dalvik Executable(DEX)檔案,依賴於native層的libraries。
  • Native:包括系統服務如vold,Dbus;網路服務如dhcpd;其他庫如WebKit,OpenSSL。其中的一些服務會與核心級服務,驅動程式通訊,另一些則簡化了呼叫底層程式碼。

Android基於Linux核心做出很多額外的改動,例如獲取相機,WIFI,網路,Binder和安全等。

安全模型

Android使用兩套分離,卻又互相配合的許可權模型:沙箱和執行時許可權。

在低層級,Linux核心強制使用使用者和使用者組許可權,限制獲取檔案系統和Android特定資源的許可權。一般被稱為Android's sandBox(沙箱)。

在Android執行時,通過Dalvik虛擬機器和Android Framework實現第二套模型,在使用者安裝應用時啟用,限制了應用能獲取資源的許可權。一部分許可權直接對應底層作業系統特定使用者和使用者組的許可權。

Android‘s SandBox

Android基於Linux,而Linux繼承了Unix著名的程式獨立和最小特權法則。需要注意的是,程式作為獨立的使用者執行時,既不能與其他使用者通訊,又無法訪問其他使用者的記憶體區域。

所以沙箱可以理解為幾個概念:標準的Linux程式隔離,大多數應用都有單獨的使用者ID(UID),嚴格的檔案系統許可權。

Andoird定義了一系列的AndroidIDs(AIDs)來代替傳統的使用者和使用者組的密碼驗證,AIDs通過補充組獲取許可權或共享資源,例如在sdcard_rw組的成員擁有讀寫/sdcard檔案的許可權。

除了檔案系統的許可權,補充組也用於獲取其他許可權。例如AID_INET組,允許使用者開啟AF_INET和AF_INET6套接字。

當應用執行時,UID,GID和補充組分配給一個新程式,作業系統不僅會在核心層級強制使用許可權限制,還會在應用執行時進行控制,這就是Android沙箱。

在Android模擬器中,通過ps命令可以檢視程式的PID。

652417-0a141e5496a32e39.png
ps.png

通過cd /proc/1進入PID為1的程式內,cat status檢視UID和GID。

652417-2acb66b9d0037c89.png
uid.png

Android許可權

Android許可權模型是多方面的,有API許可權,檔案系統許可權和IPC許可權。正如前面所說,高層級的許可權會對應底層OS的功能,包括開啟套接字,藍芽裝置,和特定的檔案路徑。

Android高層級許可權宣告在AndroidManifest內。應用安裝時,PackageManager會將應用許可權從Manifest中讀取出來,儲存在/data/system/packages.xml中。

通過cat /data/system/packages.xml可以找到系統Phone的UID及許可權。

  <shared-user name="android.uid.phone" userId="1001">
        <sigs count="1">
            <cert index="1" />
        </sigs>
        <perms>
            <item name="android.permission.WRITE_SETTINGS" />
            <item name="android.permission.READ_SMS" />
            <item name="android.permission.READ_CALL_LOG" />
            <item name="android.permission.MODIFY_AUDIO_SETTINGS" />
            <item name="android.permission.SYSTEM_ALERT_WINDOW" />
            <item name="android.permission.SEND_RESPOND_VIA_MESSAGE" />
            <item name="android.permission.SHUTDOWN" />
            <item name="android.permission.INTERNAL_SYSTEM_WINDOW" />
            <item name="android.permission.BROADCAST_SMS" />
            <item name="android.permission.CALL_PRIVILEGED" />
            <item name="android.permission.CHANGE_NETWORK_STATE" />
            <item name="android.permission.RECEIVE_BOOT_COMPLETED" />
            <item name="android.permission.DEVICE_POWER" />
            <item name="android.permission.RECEIVE_SMS" />
            <item name="android.permission.SET_TIME_ZONE" />
            <item name="android.permission.BLUETOOTH" />
...
         </perms>
    </shared-user>

這些許可權會在應用程式例項化時(例如設定補充GIDs時)授予。

使用者組的許可權儲存在/etc/permissions/platform.xml中,用於確定應用的補充組GIDs。

通過cat /etc/permission/platform.xml檢視。下面列舉儲存許可權。

    <permission name="android.permission.READ_EXTERNAL_STORAGE" >
        <group gid="sdcard_r" />
    </permission>

    <permission name="android.permission.WRITE_EXTERNAL_STORAGE" >
        <group gid="sdcard_r" />
        <group gid="sdcard_rw" />
    </permission>

    <permission name="android.permission.ACCESS_ALL_EXTERNAL_STORAGE" >
        <group gid="sdcard_r" />
        <group gid="sdcard_rw" />
        <group gid="sdcard_all" />
    </permission>

這些許可權會以下列兩種方式之一強制執行:執行時呼叫方法時進行判斷,底層作業系統或核心檢查。

API許可權

API許可權包括用於控制在API/frameword中高層級的功能和第三方框架。例如公用API許可權READ_PHONE_STATE,在文件中定義為“僅允許讀取電話狀態”。需要該許可權的應用要在呼叫任何與電話狀態相關的API之前獲取授權。相關方法在TelephoneManager中getDeviceSoftwareVersion, getDeviceId等。

檔案系統許可權

Android應用沙箱由Unix嚴格的檔案系統許可權控制。UIDs和GIDs授予了訪問各自檔案系統內的儲存空間。

通過ls -l /data/data檢視,UIDs和GIDs(第二,第三列)在列表中是獨一無二的,而且再看許可權只有特定UIDs和GIDs才能訪問其中內容。

652417-3093ceba63dac6cd.png
ls-l.png

正如前面提到的,補充組GIDs用於獲取共享資源,例如SD卡或外接儲存。

通過ls -l /mnt/檢視sdcard讀寫許可權。

652417-e7c754abc9e4fe99.png
sdcard.png

總結

本文對Android許可權在低層級和高層級的應用做了大致的介紹,通過兩個互相配合的安全模型,強制限制了應用最小需用許可權,獲取共享資源和應用間通訊。

下一篇Android安全—深入理解各層級介紹Android架構裡每個模組為實現安全各自所做的努力。

相關文章