詳解Android應(yīng)用沙盒機制
前言
Android使用沙盒來保護用戶不受惡意應(yīng)用的侵害,同時也將應(yīng)用隔離開來,防止他們互相訪問其數(shù)據(jù),本文主要對Android應(yīng)用沙盒中的幾種技術(shù)做簡要的總結(jié)。
一、Android應(yīng)用DAC沙盒
- 稍微了解Android一點的人都知道,Android上的App并不像Linux上的用戶程序那樣,啟動應(yīng)用的uid默認就是登錄用戶的uid,除非你使用sudo或者setuid等機制。而是每個Android應(yīng)用都對應(yīng)了一個uid,也就是一個用戶,通過Linux系統(tǒng)的DAC機制將應(yīng)用的數(shù)據(jù)嚴格隔離開來。
- Android并沒有使用/etc/passwd配置文件以及useradd、usermod和userdel等二進制來管理用戶,這些東西對Android來說過于復(fù)雜。實際上Android應(yīng)用到uid的映射是由PackageManagerService完成的,也就是PMS,并且存儲在/data/system/packages.xml中。
- 將Android應(yīng)用使用DAC隔離開之后,如果應(yīng)用要訪問任何系統(tǒng)資源,便會被拒絕,所以Android設(shè)計了應(yīng)用權(quán)限機制來向應(yīng)用提供訪問系統(tǒng)資源的通道,同時保護系統(tǒng)資源不被濫用。
- 下面是在Pixel 2 XL (RP1A.201005.004.A1) 上面的一些例子
u:r:untrusted_app:s0:c161,c256,c512,c768 u0_a161 16613 887 14608676 86088 0 0 S com.google.android.apps.photos u:r:untrusted_app:s0:c138,c256,c512,c768 u0_a138 17204 888 1402772 138956 0 0 S com.android.chrome
可以看到相冊應(yīng)用的用戶為u0_a161,而Chrome瀏覽器應(yīng)用的用戶為u0_a138
二、Android應(yīng)用權(quán)限
Android應(yīng)用權(quán)限的核心類型分為四種:普通權(quán)限、危險權(quán)限、簽名權(quán)限、簽名或系統(tǒng)權(quán)限
權(quán)限類型 | 權(quán)限行為 |
---|---|
普通權(quán)限(Normal) | 普通權(quán)限是只需要在AndroidManifest.xml中聲明后就可以使用的權(quán)限。 |
危險權(quán)限(dangerous) | 危險權(quán)限除了需要在AndroidManifest.xml中聲明之外,在Android 6.0或更高版本還需要使用動態(tài)權(quán)限API進行申請,并且用戶點擊同意之后才能使用;在Android 5.1以及更早版本,會在安裝時單獨列出危險權(quán)限以特別提醒用戶。注意,如果自定義權(quán)限設(shè)置為了危險權(quán)限,無論Android版本是多少都只是會在安裝時單獨列出危險權(quán)限。 |
簽名權(quán)限(signature) | 簽名權(quán)限僅會授予給與定義這個權(quán)限的包相同簽名的應(yīng)用。 |
簽名或系統(tǒng)權(quán)限(signatureOrSystem) | signature|privileged的舊同義詞。簽名或系統(tǒng)權(quán)限與簽名權(quán)限唯一的區(qū)別就是,簽名或系統(tǒng)權(quán)限也允許授予給特權(quán)應(yīng)用(priv_app),該字段現(xiàn)已棄用。 |
在自定義權(quán)限中,經(jīng)常使用簽名權(quán)限來保護敏感的接口,使其只能被可信的應(yīng)用調(diào)用——那些具備和定義權(quán)限者相同簽名的應(yīng)用。
三、應(yīng)用信息的存儲
應(yīng)用信息的存儲上文已經(jīng)提到,位于/data/system/packages.xml中,這里面存儲了應(yīng)用的各種信息,下面是一個示例:
<package name="com.android.storagemanager" codePath="/system/priv-app/StorageManager" nativeLibraryPath="/system/priv-app/StorageManager/lib" publicFlags="541605445" privateFlags="8" ft="165151eba60" it="165151eba60" ut="165151eba60" version="29" user appUseNotchMode="0" appUseSideMode="1" hwExtraFlags="0" isOrphaned="true" forceDarkMode="2"> <sigs count="1" schemeVersion="1"> <cert index="13" /> </sigs> <perms> <item name="android.permission.USE_RESERVED_DISK" granted="true" flags="0" /> <!-- ... --> </perms> <proper-signing-keyset identifier="3" /> </package> <package name="com.android.settings" codePath="/system/priv-app/Settings" nativeLibraryPath="/system/priv-app/Settings/lib" publicFlags="675823173" privateFlags="8" ft="165151eba60" it="165151eba60" ut="165151eba60" version="10010400" sharedUser appUseNotchMode="0" appUseSideMode="1" hwExtraFlags="0" isOrphaned="true" forceDarkMode="2"> <sigs count="1" schemeVersion="1"> <cert index="0" /> </sigs> <perms> <item name="android.permission.REAL_GET_TASKS" granted="true" flags="0" /> <!-- ... --> </perms> <proper-signing-keyset identifier="1" /> </package>
- 可以看到這個文件中存儲有很多內(nèi)容,最關(guān)鍵的信息包括應(yīng)用的uid、包名、各類路徑,以及定義和授予的權(quán)限。
- 例如StorageManager這個應(yīng)用的uid是10036,而設(shè)置的uid是1000,也就是system的uid。
四、應(yīng)用權(quán)限的映射
- 我們知道Android使用的是Linux內(nèi)核,而在Linux的安全模型中,如果需要訪問系統(tǒng)資源,訪問系統(tǒng)資源的用戶和進程必須具備相應(yīng)的權(quán)限。
- Android如何將自行定義的Android權(quán)限映射到Linux層面的權(quán)限呢?答案就位于/etc/permissions/platform.xml中,下面是該文件的節(jié)選:
<permission name="android.permission.BLUETOOTH_ADMIN" > <group g /> </permission> <permission name="android.permission.BLUETOOTH" > <group g /> </permission>
這里顯示的就是,Android的兩個藍牙權(quán)限,分別對應(yīng)了net_bt_admin和net_bt兩個Linux組,在應(yīng)用被授予相應(yīng)的權(quán)限時,PMS會自動將應(yīng)用uid加入這兩個組中,這樣應(yīng)用就擁有了相應(yīng)系統(tǒng)資源的訪問權(quán)限了。
五、應(yīng)用的SELinux標簽
在Android引入SELinux之后,對應(yīng)用權(quán)限的劃分更為細致,Android默認將應(yīng)用分為四種:不可信應(yīng)用、特權(quán)應(yīng)用、平臺應(yīng)用和系統(tǒng)應(yīng)用。
SELinux標簽 | 標簽行為 |
---|---|
不可信應(yīng)用(untrusted_app) | 不可信應(yīng)用擁有最少的特權(quán),訪問系統(tǒng)資源受到嚴格限制,所有用戶安裝的應(yīng)用以及部分預(yù)裝應(yīng)用都屬于此標簽。 |
特權(quán)應(yīng)用(priv-app) | 特權(quán)應(yīng)用位于/system/priv-app目錄或OEM定義的其它目錄下,不可卸載,但不以system uid運行。 |
平臺應(yīng)用(platform_app) | 平臺應(yīng)用具備平臺簽名,但不以system uid運行。除了AOSP和部分第三方ROM之外,幾乎所有的OEM都不會公開其平臺私鑰,所以一般情況下平臺應(yīng)用只能是OEM提供的。 |
系統(tǒng)應(yīng)用(system_app) | 系統(tǒng)應(yīng)用既具備平臺簽名,又以system uid運行(配置android:sharedUserId=”android.uid.system”)。使用system uid運行意味著它們可以不受應(yīng)用沙盒的限制,并能訪問絕大部分Android框架中的系統(tǒng)資源。 |
下面是在Pixel 2 XL (RP1A.201005.004.A1) 上面的一些例子
可以得出以下結(jié)論:
- Chrome在這臺手機上是untrusted_app
- 啟動器nexuslauncher在這臺手機上是priv_app
- systemui在這臺手機上是platform_app
- 設(shè)置settings在這臺手機上是system_app
顯然其中只有設(shè)置是以system uid運行的,其它進程使用的都是普通的應(yīng)用uid。
六、Android應(yīng)用MAC沙盒
上面所說的SELinux標簽,Android在源代碼中為它們定義了不同的SELinux政策,這便實現(xiàn)了MAC層面的沙盒增強。
以上就是詳解Android應(yīng)用沙盒機制的詳細內(nèi)容,更多關(guān)于Android應(yīng)用沙盒機制的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android中activity跳轉(zhuǎn)按鈕事件的四種寫法
這篇文章主要介紹了Android中activity跳轉(zhuǎn)按鈕事件的四種寫法,下文中包括四個activity的內(nèi)容詳解,非常不錯具有參考借鑒價值,需要的朋友可以參考下2016-10-10Android編程判斷是否連接網(wǎng)絡(luò)的方法【W(wǎng)iFi及3G判斷】
這篇文章主要介紹了Android編程判斷是否連接網(wǎng)絡(luò)的方法,結(jié)合實例形式分析了Android針對WiFi及3G網(wǎng)絡(luò)連接的判斷方法,需要的朋友可以參考下2017-02-02android 監(jiān)聽網(wǎng)絡(luò)狀態(tài)的變化及實戰(zhàn)的示例代碼
本篇文章主要介紹了android 監(jiān)聽網(wǎng)絡(luò)狀態(tài)的變化及實戰(zhàn)的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01詳解Android Studio正式簽名進行調(diào)試的實現(xiàn)步驟
這篇文章主要介紹了詳解Android Studio正式簽名進行調(diào)試的實現(xiàn)步驟的相關(guān)資料,需要的朋友可以參考下2017-07-07Android sdcard實現(xiàn)圖片存儲 、聯(lián)網(wǎng)下載
這篇文章主要介紹了Android sdcard實現(xiàn)圖片存儲 、聯(lián)網(wǎng)下載功能,感興趣的小伙伴們可以參考一下2016-02-0220.5 語音合成(百度2016年2月29日發(fā)布的tts引擎)
編寫手機App時,有時需要使用文字轉(zhuǎn)語音(Text to Speech)的功能,比如開車時閱讀收到的短信、導(dǎo)航語音提示、界面中比較重要的信息通過語音強調(diào)2016-03-03