51CTO專家專欄 李洋談Android系統及程序授權機制
原創【51CTO獨家特稿】李洋老師在前文中向我們介紹了“Android安全框架”。Android開發包工具將代碼和資源數據文件編譯成以.apk后綴的安裝文件。單個.apk文件就是一個應用程序,可被用來安裝在Android系統的手機上。但是你了解Android系統及程序授權機制嗎?本文李洋老師將向我們介紹“Android系統及應用程序授權機制”。
1.Android系統權限定義
Android系統在/system/core/private/android_filesystem_config.h頭文件中對Android用戶/用戶組作了如下定義,且權限均基于該用戶/用戶組設置。>Android系統在/system/core/private/android_filesystem_config.h頭文件中對Android用戶/用戶組作了如下定義,且權限均基于該用戶/用戶組設置。
- #define AID_ROOT 0 /* traditional unix root user */
- #define AID_SYSTEM 1000 /* system server */
- #define AID_RADIO 1001 /* telephony subsystem, RIL */
- #define AID_BLUETOOTH 1002 /* bluetooth subsystem */
- #define AID_GRAPHICS 1003 /* graphics devices */
- #define AID_INPUT 1004 /* input devices */
- #define AID_AUDIO 1005 /* audio devices */
- #define AID_CAMERA 1006 /* camera devices */
- #define AID_LOG 1007 /* log devices */
- #define AID_COMPASS 1008 /* compass device */
- #define AID_MOUNT 1009 /* mountd socket */
- #define AID_WIFI 1010 /* wifi subsystem */
- #define AID_ADB 1011 /* android debug bridge (adbd) */
- #define AID_INSTALL 1012 /* group for installing packages */
- #define AID_MEDIA 1013 /* mediaserver process */
- #define AID_DHCP 1014 /* dhcp client */
- #define AID_SDCARD_RW 1015 /* external storage write access */
- #define AID_VPN 1016 /* vpn system */
- #define AID_KEYSTORE 1017 /* keystore subsystem */
- #define AID_USB 1018 /* USB devices */
- #define AID_DRM 1019 /* DRM server */
- #define AID_DRMIO 1020 /* DRM IO server */
- #define AID_GPS 1021 /* GPS daemon */
- #define AID_NFC 1022 /* nfc subsystem */
- #define AID_SHELL 2000 /* adb and debug shell user */
- #define AID_CACHE 2001 /* cache access */
- #define AID_DIAG 2002 /* access to diagnostic resources */
- /* The 3000 series are intended for use as supplemental group id's only.
- * They indicate special Android capabilities that the kernel is aware of. */
- #define AID_NET_BT_ADMIN 3001 /* bluetooth: create any socket */
- #define AID_NET_BT 3002 /* bluetooth: create sco, rfcomm or l2cap sockets */
- #define AID_INET 3003 /* can create AF_INET and AF_INET6 sockets */
- #define AID_NET_RAW 3004 /* can create raw INET sockets */
- #define AID_NET_ADMIN 3005 /* can configure interfaces and routing tables. */
- #define AID_MISC 9998 /* access to misc storage */
- #define AID_NOBODY 9999
- #define AID_APP 10000 /* first app user */
值得注意的是:每個應用程序在安裝到Android系統后,系統都會為其分配一個用戶ID,如app_4、app_11等。以下是Calendar和Terminal軟件在Android系統中進程瀏覽的結果(其中,黑色字體標明的即為應用分配的用戶ID):
USER | PID | PPID | VSIZE | RSS | WCHAN | PC | NAME |
app_16 | 2855 | 2363 | 216196 | 20960 | ffffffff | afd0ee48 S | com.android.providers.calendar |
app_91 | 4178 | 2363 | 218872 | 25076 | ffffffff | afd0ee48 S | jackpal.androidterm |
在Android系統中,上述用戶/用戶組對文件的訪問遵循Linux系統的訪問控制原則,即根據長度為10個字符的權限控制符來決定用戶/用戶組對文件的訪問權限。該控制符的格式遵循下列規則:
(1) 第1個字符:表示一種特殊的文件類型。其中字符可為d(表示該文件是一個目錄)、b(表示該文件是一個系統設備,使用塊輸入/輸出與外界交互,通常為一個磁盤)、c(表示該文件是一個系統設備,使用連續的字符輸入/輸出與外界交互,如串口和聲音設備),“.”表示該文件是一個普通文件,沒有特殊屬性。
(2) 2~4個字符:用來確定文件的用戶(user)權限;
(3) 5~7個字符:用來確定文件的組(group)權限;
(4) 8~10個字符:用來確定文件的其它用戶(other user,既不是文件所有者,也不是組成員的用戶)的權限。
(5) 第2、5、8個字符是用來控制文件的讀權限的,該位字符為r表示允許用戶、組成員或其它人可從該文件中讀取數據。短線“-”則表示不允許該成員讀取數據。
(6) 第3、6、9位的字符控制文件的寫權限,該位若為w表示允許寫,若為“-”表示不允許寫。
(7) 第4、7、10位的字符用來控制文件的制造權限,該位若為x表示允許執行,若為“-”表示不允許執行。
舉個例子,“drwxrwxr-- 2 root root 4096 2月 11 10:36 guo”表示的訪問控制權限(黑色字體標明)為:因為guo的第1個位置的字符是d,所以由此知道guo是一個目錄。第2至4位置上的屬性是rwx,表示用戶root擁有權限列表顯示guo中所有的文件、創建新文件或者刪除guo中現有的文件,或者將guo作為當前工作目錄。第5至7個位置上的權限是rwx,表示root組的成員擁有和root一樣的權限。第8至10位上的權限僅是r--,表示不是root的用戶及不屬于root組的成員只有對guo目錄列表的權限。這些用戶不能創建或者刪除guo中的文件、執行junk中的可執行文件,或者將junk作為他們的當前工作目錄。#p#
2. Android應用程序權限申請
每個應用程序的APK包里面都包含有一個AndroidMainifest.xml文件,該文件除了羅列應用程序運行時庫、運行依賴關系等之外,還會詳細地羅列出該應用程序所需的系統訪問。程序員在進行應用軟件開發時,需要通過設置該文件的uses-permission字段來顯式地向Android系統申請訪問權限。
該文件的基本格式如下:
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="cn.com.fetion.android"
- android:versionCode="1"
- android:versionName="1.0.0">
- <application android:icon="@drawable/icon" android:label="@string/app_name">
- <activity android:name=".welcomActivity"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
- <uses-permission android:name="android.permission.SEND_SMS"></uses-permission>
- </manifest>
如上述文件描述中加下劃線的斜體部分,該文件的作用是說明該軟件需要發送短信的功能。
值得注意的是:通過測試發現一種特殊的情況,應用程序可以在程序運行時申請root權限,如右圖,在使用Android Terminal Emulator時嘗試使用su命令切換到root用戶。若用戶已通過hacking的方式使得Android系統獲得了root權限,則可以允許該程序以root用戶權限執行;反之即算用戶選擇“允許”,也不能使程序以root用戶權限執行。
#p#
3. Android系統對應用程序權限申請的處理方式分析
對Android源代碼中的如下文件進行分析:
(1) InstallAppProgress.java:其路徑為\packages\apps\PackageInstaller\src\com\android\packageinstaller\InstallAppProgress.java;
(2) PackageInstallerActivity.java:其路徑為\packages\apps\PackageInstaller\src\com\android\packageinstaller\PackageInstallerActivity.java;
(3) AppSecurityPermissions.java:其路徑為\frameworks\base\core\java\android\widget\AppSecurityPermissions.java
總結得出如下圖所示的Android系統對應用程序授權申請的處理流程:
(1) 進入處理應用程序授權申請的入口函數;
(2) 系統從被安裝應用程序的AndroidManifest.xml文件中獲取該應用正常運行需申請的權限列表;
(3) 顯示對話框,請求用戶確認是否滿足這些權限需求;
(4) 若同意,則應用程序正常安裝,并被賦予相應的權限;若否定,則應用程序不被安裝。系統僅提供給用戶選擇“是”或者“否”的權利,沒有選擇其中某些權限進行授權的權利。
李洋博士畢業于中科院計算所。10多年來一直從事計算機網絡信息安全研發工作,曾主持和參與多項國家重點項目以及信息安全系統和企業信息安全系統的研發工 作。具有Linux系統應用、管理、安全及內核的研發經驗,擅長網絡安全技術、協議分析、Linux系統安全技術、Linux系統及網絡管理、Linux 內核開發等。
【51CTO.com獨家特稿,非經授權謝絕轉載!合作媒體轉載請注明原文出處!如果您想與李洋老師探討Android安全架構等話題,或者向51CTO移動開發頻道投稿請發郵件至zhousn#51CTO.com(將“#”換成“@”)】
【編輯推薦】