Android安全—許可權模型
從架構開始
對於Android架構的一般理解會是,”在Linux上的Java“。然而,不準確,這樣的描述直接忽略掉整個平臺的複雜架構。
縱觀全域性,架構由五部分組成,包括Android應用層,Android Framework,Dalvik虛擬機器,native code和Linux kernel。如圖
職能簡介
- 應用層:允許開發者擴充套件與提升裝置功能,無需關注底層實現細節。
- 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。
通過cd /proc/1
進入PID為1的程式內,cat status
檢視UID和GID。
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才能訪問其中內容。
正如前面提到的,補充組GIDs用於獲取共享資源,例如SD卡或外接儲存。
通過ls -l /mnt/
檢視sdcard讀寫許可權。
總結
本文對Android許可權在低層級和高層級的應用做了大致的介紹,通過兩個互相配合的安全模型,強制限制了應用最小需用許可權,獲取共享資源和應用間通訊。
下一篇Android安全—深入理解各層級介紹Android架構裡每個模組為實現安全各自所做的努力。
相關文章
- 許可權模型:ACL模型
- Android系統許可權和root許可權Android
- android許可權大全Android
- Android permission許可權Android
- 許可權系統:6個許可權概念模型設計模型
- android動態許可權到自定義許可權框架Android框架
- android permission 許可權與安全機制解析(下)Android
- android permission許可權與安全機制解析(上)Android
- Android許可權管理之Permission許可權機制及使用Android
- RBAC_許可權模型介紹模型
- 許可權+訂單資料模型模型
- android 許可權庫EasyPermissionsAndroid
- Android許可權適配Android
- Android系統許可權Android
- android 許可權問題Android
- Android SELinux許可權AndroidLinux
- Android6.0------許可權申請管理(單個許可權和多個許可權申請)Android
- Oracle的物件許可權、角色許可權、系統許可權Oracle物件
- mongoDB 3.0 安全許可權訪問MongoDB
- 資料安全之許可權控制
- 從0實現RBAC許可權模型模型
- 許可權之選單許可權
- android 許可權元件設計Android元件
- Xamarin Android許可權請求Android
- Android之SharedPreferences許可權Android
- Android 許可權清單大全Android
- Android許可權最佳實踐Android
- Android 安全架構及許可權控制機制剖析Android架構
- Android許可權管理之Android 6.0執行時許可權及解決辦法Android
- 如何用 Vue 實現前端許可權控制(路由許可權 + 檢視許可權 + 請求許可權)Vue前端路由
- linux 檔案許可權 s 許可權和 t 許可權解析Linux
- Java安全之Filter許可權繞過JavaFilter
- Docker安全:通過Docker提升許可權Docker
- saas-export專案-RBAC許可權模型Export模型
- 基於RBAC的許可權設計模型模型
- 許可權系統:一文搞懂功能許可權、資料許可權
- Android動態許可權總結Android
- Android許可權處理分類Android