詳解Android應(yīng)用沙盒機(jī)制
前言
Android使用沙盒來(lái)保護(hù)用戶不受惡意應(yīng)用的侵害,同時(shí)也將應(yīng)用隔離開(kāi)來(lái),防止他們互相訪問(wèn)其數(shù)據(jù),本文主要對(duì)Android應(yīng)用沙盒中的幾種技術(shù)做簡(jiǎn)要的總結(jié)。
一、Android應(yīng)用DAC沙盒
- 稍微了解Android一點(diǎn)的人都知道,Android上的App并不像Linux上的用戶程序那樣,啟動(dòng)應(yīng)用的uid默認(rèn)就是登錄用戶的uid,除非你使用sudo或者setuid等機(jī)制。而是每個(gè)Android應(yīng)用都對(duì)應(yīng)了一個(gè)uid,也就是一個(gè)用戶,通過(guò)Linux系統(tǒng)的DAC機(jī)制將應(yīng)用的數(shù)據(jù)嚴(yán)格隔離開(kāi)來(lái)。
- Android并沒(méi)有使用/etc/passwd配置文件以及useradd、usermod和userdel等二進(jìn)制來(lái)管理用戶,這些東西對(duì)Android來(lái)說(shuō)過(guò)于復(fù)雜。實(shí)際上Android應(yīng)用到uid的映射是由PackageManagerService完成的,也就是PMS,并且存儲(chǔ)在/data/system/packages.xml中。
- 將Android應(yīng)用使用DAC隔離開(kāi)之后,如果應(yīng)用要訪問(wèn)任何系統(tǒng)資源,便會(huì)被拒絕,所以Android設(shè)計(jì)了應(yīng)用權(quán)限機(jī)制來(lái)向應(yīng)用提供訪問(wèn)系統(tǒng)資源的通道,同時(shí)保護(hù)系統(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
可以看到相冊(cè)應(yīng)用的用戶為u0_a161,而Chrome瀏覽器應(yīng)用的用戶為u0_a138
二、Android應(yīng)用權(quán)限
Android應(yīng)用權(quán)限的核心類(lèi)型分為四種:普通權(quán)限、危險(xiǎn)權(quán)限、簽名權(quán)限、簽名或系統(tǒng)權(quán)限
| 權(quán)限類(lèi)型 | 權(quán)限行為 |
|---|---|
| 普通權(quán)限(Normal) | 普通權(quán)限是只需要在AndroidManifest.xml中聲明后就可以使用的權(quán)限。 |
| 危險(xiǎn)權(quán)限(dangerous) | 危險(xiǎn)權(quán)限除了需要在AndroidManifest.xml中聲明之外,在Android 6.0或更高版本還需要使用動(dòng)態(tài)權(quán)限API進(jìn)行申請(qǐng),并且用戶點(diǎn)擊同意之后才能使用;在Android 5.1以及更早版本,會(huì)在安裝時(shí)單獨(dú)列出危險(xiǎn)權(quán)限以特別提醒用戶。注意,如果自定義權(quán)限設(shè)置為了危險(xiǎn)權(quán)限,無(wú)論Android版本是多少都只是會(huì)在安裝時(shí)單獨(dú)列出危險(xiǎn)權(quán)限。 |
| 簽名權(quán)限(signature) | 簽名權(quán)限僅會(huì)授予給與定義這個(gè)權(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)限來(lái)保護(hù)敏感的接口,使其只能被可信的應(yīng)用調(diào)用——那些具備和定義權(quán)限者相同簽名的應(yīng)用。
三、應(yīng)用信息的存儲(chǔ)
應(yīng)用信息的存儲(chǔ)上文已經(jīng)提到,位于/data/system/packages.xml中,這里面存儲(chǔ)了應(yīng)用的各種信息,下面是一個(gè)示例:
<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>
- 可以看到這個(gè)文件中存儲(chǔ)有很多內(nèi)容,最關(guān)鍵的信息包括應(yīng)用的uid、包名、各類(lèi)路徑,以及定義和授予的權(quán)限。
- 例如StorageManager這個(gè)應(yīng)用的uid是10036,而設(shè)置的uid是1000,也就是system的uid。
四、應(yīng)用權(quán)限的映射
- 我們知道Android使用的是Linux內(nèi)核,而在Linux的安全模型中,如果需要訪問(wèn)系統(tǒng)資源,訪問(wèn)系統(tǒng)資源的用戶和進(jìn)程必須具備相應(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的兩個(gè)藍(lán)牙權(quán)限,分別對(duì)應(yīng)了net_bt_admin和net_bt兩個(gè)Linux組,在應(yīng)用被授予相應(yīng)的權(quán)限時(shí),PMS會(huì)自動(dòng)將應(yīng)用uid加入這兩個(gè)組中,這樣應(yīng)用就擁有了相應(yīng)系統(tǒng)資源的訪問(wèn)權(quán)限了。
五、應(yīng)用的SELinux標(biāo)簽
在Android引入SELinux之后,對(duì)應(yīng)用權(quán)限的劃分更為細(xì)致,Android默認(rèn)將應(yīng)用分為四種:不可信應(yīng)用、特權(quán)應(yīng)用、平臺(tái)應(yīng)用和系統(tǒng)應(yīng)用。
| SELinux標(biāo)簽 | 標(biāo)簽行為 |
|---|---|
| 不可信應(yīng)用(untrusted_app) | 不可信應(yīng)用擁有最少的特權(quán),訪問(wèn)系統(tǒng)資源受到嚴(yán)格限制,所有用戶安裝的應(yīng)用以及部分預(yù)裝應(yīng)用都屬于此標(biāo)簽。 |
| 特權(quán)應(yīng)用(priv-app) | 特權(quán)應(yīng)用位于/system/priv-app目錄或OEM定義的其它目錄下,不可卸載,但不以system uid運(yùn)行。 |
| 平臺(tái)應(yīng)用(platform_app) | 平臺(tái)應(yīng)用具備平臺(tái)簽名,但不以system uid運(yùn)行。除了AOSP和部分第三方ROM之外,幾乎所有的OEM都不會(huì)公開(kāi)其平臺(tái)私鑰,所以一般情況下平臺(tái)應(yīng)用只能是OEM提供的。 |
| 系統(tǒng)應(yīng)用(system_app) | 系統(tǒng)應(yīng)用既具備平臺(tái)簽名,又以system uid運(yùn)行(配置android:sharedUserId=”android.uid.system”)。使用system uid運(yùn)行意味著它們可以不受應(yīng)用沙盒的限制,并能訪問(wèn)絕大部分Android框架中的系統(tǒng)資源。 |
下面是在Pixel 2 XL (RP1A.201005.004.A1) 上面的一些例子
可以得出以下結(jié)論:
- Chrome在這臺(tái)手機(jī)上是untrusted_app
- 啟動(dòng)器nexuslauncher在這臺(tái)手機(jī)上是priv_app
- systemui在這臺(tái)手機(jī)上是platform_app
- 設(shè)置settings在這臺(tái)手機(jī)上是system_app
顯然其中只有設(shè)置是以system uid運(yùn)行的,其它進(jìn)程使用的都是普通的應(yīng)用uid。
六、Android應(yīng)用MAC沙盒
上面所說(shuō)的SELinux標(biāo)簽,Android在源代碼中為它們定義了不同的SELinux政策,這便實(shí)現(xiàn)了MAC層面的沙盒增強(qiáng)。
以上就是詳解Android應(yīng)用沙盒機(jī)制的詳細(xì)內(nèi)容,更多關(guān)于Android應(yīng)用沙盒機(jī)制的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android TV listview及焦點(diǎn)處理
這篇文章主要介紹了Android TV listview及焦點(diǎn)處理的相關(guān)資料,需要的朋友可以參考下2017-06-06
Android Studio導(dǎo)入so文件到項(xiàng)目中的實(shí)例詳解
這篇文章主要介紹了Android Studio導(dǎo)入so文件到項(xiàng)目中的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-09-09
Android 3.0引入的異步加載機(jī)制Loader
Loader裝載器從android3.0開(kāi)始引進(jìn)。它使得在activity或fragment中異步加載數(shù)據(jù)變得簡(jiǎn)單。下面我們就來(lái)詳細(xì)講解下2017-12-12
Android中多個(gè)ContentProvider的初始化順序詳解
在日常Android開(kāi)發(fā)中經(jīng)常會(huì)寫(xiě)一些sdk來(lái)供他人或者自己調(diào)用,一般這些sdk都涉及到初始化,下面這篇文章主要給大家介紹了關(guān)于Android中多個(gè)ContentProvider的初始化順序的相關(guān)資料,需要的朋友可以參考下2022-04-04
Android視圖控件架構(gòu)分析之View、ViewGroup
這篇文章主要為大家詳細(xì)介紹了Android視圖控件架構(gòu)分析之View、ViewGroup,感興趣的朋友可以參考一下2016-05-05
Android 使用Intent傳遞數(shù)據(jù)的實(shí)現(xiàn)思路與代碼
Intent是Android中一個(gè)非常重要的概念,跟這個(gè)詞的本意(意圖,目的)一樣,這個(gè)類(lèi)在Android中的作用就是要調(diào)用某個(gè)組建去做某一件事,接下來(lái)詳細(xì)介紹,感興趣的朋友可以參考下2013-01-01

