請(qǐng)先閱讀Android安全—權(quán)限模型匹舞。
了解各個(gè)層級(jí)的組成褐鸥,對(duì)于評(píng)估應(yīng)用安全性或者進(jìn)行某種攻擊,是非常必要的赐稽。這個(gè)章節(jié)討論的話題是叫榕,應(yīng)用組成部件的安全性浑侥,運(yùn)行時(shí)以及進(jìn)程間通信的機(jī)制。
Android應(yīng)用層
- AndroidManifest
- 唯一包名和版本號(hào)
- Activity, Service, BroadCast Receiver, Instrumentation定義
- 需要權(quán)限的聲明
- 依賴第三庫的聲明
- 優(yōu)先安裝位置以及UI信息
- Intent:應(yīng)用內(nèi)通信的關(guān)鍵晰绎。需要關(guān)注其攜帶內(nèi)容信息锭吨,目標(biāo)組件,標(biāo)志flag和權(quán)限需求寒匙。
- Activities:界面元素,更需要關(guān)注ActivityManager躏将。
- Broadcat Receivers:應(yīng)用間通信的另一種方式锄弱。需要關(guān)注其權(quán)限需求。
- Services:除了應(yīng)用啟動(dòng)的Services外祸憋,還需要關(guān)注系統(tǒng)的公用Service如藍(lán)牙和短信服務(wù)会宪。
- ContentProviders:獲取公用數(shù)據(jù)的接口,需要關(guān)注權(quán)限需求蚯窥。
Android Framework
應(yīng)用層和運(yùn)行時(shí)的粘合劑掸鹅,提供UI,公用數(shù)據(jù)拦赠,信息傳遞功能和與應(yīng)用無關(guān)的代碼巍沙。例如android.*,android.content或java.*等荷鼠。
除此之外句携,F(xiàn)ramework還通過各種manager來管理服務(wù),而下表列出的manager都是由system_server啟動(dòng)允乐。
通過ps命令矮嫉,可以看到manager的PPID都是system_server的PID。
Dalvik虛擬機(jī)
Dalvik是基于寄存器而不是基于棧的牍疏。它專門為嵌入式系統(tǒng)設(shè)計(jì)蠢笋,本省是高效而快速的,但是鳞陨,虛擬機(jī)畢竟是底層CPU寄存器的抽象昨寞,這導(dǎo)致了效率的損耗,這也是谷歌竭力來消除這部分影響的原因炊邦。
為了高效编矾,DEX文件在被虛擬機(jī)解析之前就被已經(jīng)被優(yōu)化了。對(duì)于Android應(yīng)用內(nèi)加載DEX文件馁害,這僅會(huì)發(fā)生在應(yīng)用第一次加載的時(shí)候(在ART是應(yīng)用安裝時(shí)加載)窄俏。
Zygote
Android設(shè)備啟動(dòng)時(shí)執(zhí)行的程序之一,第一個(gè)作用是負(fù)責(zé)啟動(dòng)各種附加服務(wù)和Android Framework需要的libraries碘菜。
Zygote通過創(chuàng)建自身的復(fù)制凹蜈,作為每個(gè)Dalvik進(jìn)程的loder限寞。這種優(yōu)化策略避免重復(fù)加載資源的額外損耗。因此仰坦,核心庫履植,類文件和heap架構(gòu)的Dalvik進(jìn)程實(shí)例都是一樣的次洼。
第二個(gè)作用是啟動(dòng)system_server進(jìn)程震嫉。system_server進(jìn)程運(yùn)行了擁有特權(quán)AID的核心服務(wù)谣蠢,也就是啟動(dòng)上面表格中的Android Framework Manager译秦。
User-Space Native Code
是Android的重要組成部分奴拦,由Libraries和系統(tǒng)核心服務(wù)組成厦凤。
Libraries
通過JNI富蓄,Android Frameword中高層級(jí)的功能可以調(diào)用低層級(jí)的實(shí)現(xiàn)训挡。例如本地?cái)?shù)據(jù)存儲(chǔ)庫SQlite眷蚓;嵌入式瀏覽器引擎Webkit等鼻种,一般存放在/system/lib
目錄下。
核心服務(wù)
核心服務(wù)是指初始化底層操作系統(tǒng)環(huán)境和原生Android組件沙热,這些環(huán)境包括初始化時(shí)啟動(dòng)init進(jìn)程叉钥,和提供各種關(guān)鍵功能例如,debuggerd和adbd篙贸。
init
在Android系統(tǒng)上投队,user-space進(jìn)程通過Linux內(nèi)核啟動(dòng)的第一個(gè)命令就是init。和其他Linux系統(tǒng)相似爵川,init程序執(zhí)行一系列命令進(jìn)行user-space環(huán)境初始化蛾洛,其執(zhí)行文位于/init.rc
。(總的流程:開機(jī)->Boot Process->init->Zygote->System Server->System Process->User Process)
通過cat /init.rc
或cat /etc/init.rc
查看
...
service servicemanager /system/bin/servicemanager
class core
user system
group system
critical
onrestart restart zygote
onrestart restart media
onrestart restart surfaceflinger
onrestart restart drm
service vold /system/bin/vold
class core
socket vold stream 0660 root mount
ioprio be 2
service netd /system/bin/netd
class main
socket netd stream 0660 root system
socket dnsproxyd stream 0660 root inet
socket mdns stream 0660 root system
...
init執(zhí)行的任務(wù)包括
- 初始化必須的Service
- 根據(jù)參數(shù)雁芙,指定每個(gè)Service下應(yīng)該運(yùn)行的用戶和用戶組
- 通過Property Service設(shè)置全局環(huán)境變量
- 注冊(cè)指定事件的監(jiān)聽轧膘,例如修改系統(tǒng)屬性或掛載文件系統(tǒng)
Property Service
在init進(jìn)程中,提供持久化兔甘,內(nèi)存對(duì)應(yīng)的鍵值對(duì)形式的配置參數(shù)谎碍。包括網(wǎng)絡(luò)接口參數(shù),音頻參數(shù)和安全相關(guān)設(shè)置都依賴這些配置參數(shù)洞焙。
通過getprop
或setprop
獲取和設(shè)置蟆淀。
[androVM.inited]: [1]
[androVM.vbox_dpi]: [320]
[androVM.vbox_graph_mode]: [768x1280-16]
[dalvik.vm.heapgrowthlimit]: [64m]ces.txt]
[dev.bootcomplete]: [1]
...
[dhcp.eth1.dns3]: []
[genyd.ac.online.cached]: [1]
[genyd.battery.full.cached]: [50000000]
[genyd.device.id]: [000000000000000]
...
[init.svc.vold]: [running]
[init.svc.zygote]: [running]
[keyguard.no_require_sim]: [true]
[net.bt.name]: [Android]
...
[net.tcp.buffersize.wifi]: [524288,1048576,2097152,262144,524288,1048576]
[persist.service.adb.enable]: [1]
...
[ro.allow.mock.location]: [0]
[ro.boot.hardware]: [vbox86]
[ro.bootloader]: [unknown]
以ro打頭的是只讀屬性,不能被修改澡匪。
Volume Daemon
又被稱為vold熔任,負(fù)責(zé)掛載和卸載Android文件系統(tǒng)。例如唁情,當(dāng)插入SD卡時(shí)疑苔,vold進(jìn)程捕獲到相關(guān)事件,將卡掛載到合適的路徑(/mnt/sdcard )甸鸟。當(dāng)SD卡被拔掉或被手動(dòng)拒絕惦费,vold會(huì)把目標(biāo)卡卸載兵迅。
Kernel
接下來會(huì)討論Android對(duì)標(biāo)準(zhǔn)的Linux Kernel做了一些修改。
Binder
最重要的特性之一薪贫,提供IPC機(jī)制恍箭,允許同步調(diào)用另一個(gè)進(jìn)程中的方法。由于Binder機(jī)制的復(fù)雜性和篇幅所限瞧省,這邊先不作討論扯夭。
ashemem
匿名共享內(nèi)存(Anonymous Shared Memory)。ashemen是一個(gè)基于文件的鞍匾,引用計(jì)數(shù)的共享內(nèi)存接口勉抓。由于ashmem目的就是當(dāng)系統(tǒng)可用內(nèi)存不足時(shí)自動(dòng)收縮和回收內(nèi)存,在Android核心組件中頗為流行候学,如Surface Flinger, Audio Flinger纵散,System Server和DalvikVM梳码。
Logger
Android kernel仍然使用基于Linux的kelnel-logging機(jī)制,同事它也使用另外被稱為logger的子系統(tǒng)伍掀。logger通過logcat命令掰茶,用于查看日志信息,其中包括四種類型:main蜜笤,radio濒蒋,event和sustem。
其中main輸入的日志最多把兔,它也是應(yīng)用日志輸出的來源沪伙。應(yīng)用通過android.util.Log指定日志的優(yōu)先級(jí),Log.i代表information县好,Log.d代表debug围橡,Log.e代表error(分級(jí)與syslog一致)。
系統(tǒng)進(jìn)程打印的日志也傳達(dá)出很多信息缕贡,它們通過android.util.Slog的native方法println_native翁授,調(diào)用native code輸出日志。
總結(jié)
回頭看Android設(shè)計(jì)和架構(gòu)一眼晾咪,這是多復(fù)雜的一個(gè)系統(tǒng)啊收擦。
基于最小特權(quán)法則,應(yīng)用只能申請(qǐng)它所需要的最小權(quán)限谍倦,提高安全性的同時(shí)塞赂,也增加了復(fù)雜性,再加上系統(tǒng)安全的基石——進(jìn)程隔離和降權(quán)操作昼蛀,無論是開發(fā)者還是攻擊者减途,都加大了開發(fā)的難度酣藻。當(dāng)攻擊者想謀劃一次攻擊前,必須花時(shí)間完全理解這其中的復(fù)雜性鳍置。
仁者見仁辽剧,智者見智。
?
?