Android安全—深入理解各層級(jí)

請(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)允乐。

Framework Managers.png

通過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.rccat /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ù)洞焙。

Android Property Service.png

通過getpropsetprop獲取和設(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做了一些修改。

Linux Changes by Android.png

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。

Android logging system.png

其中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ù)雜性鳍置。

仁者見仁辽剧,智者見智。

?
?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末税产,一起剝皮案震驚了整個(gè)濱河市怕轿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辟拷,老刑警劉巖撞羽,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異衫冻,居然都是意外死亡诀紊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門隅俘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來邻奠,“玉大人,你說我怎么就攤上這事为居÷笛纾” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵蒙畴,是天一觀的道長(zhǎng)贰镣。 經(jīng)常有香客問我,道長(zhǎng)膳凝,這世上最難降的妖魔是什么碑隆? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮蹬音,結(jié)果婚禮上干跛,老公的妹妹穿的比我還像新娘。我一直安慰自己祟绊,他們只是感情好楼入,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著牧抽,像睡著了一般嘉熊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扬舒,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天阐肤,我揣著相機(jī)與錄音,去河邊找鬼。 笑死孕惜,一個(gè)胖子當(dāng)著我的面吹牛愧薛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播衫画,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼毫炉,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了削罩?” 一聲冷哼從身側(cè)響起瞄勾,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎弥激,沒想到半個(gè)月后进陡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡微服,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年趾疚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片以蕴。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡糙麦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出舒裤,到底是詐尸還是另有隱情,我是刑警寧澤觉吭,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布腾供,位于F島的核電站,受9級(jí)特大地震影響鲜滩,放射性物質(zhì)發(fā)生泄漏伴鳖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一徙硅、第九天 我趴在偏房一處隱蔽的房頂上張望榜聂。 院中可真熱鬧,春花似錦嗓蘑、人聲如沸须肆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽豌汇。三九已至,卻和暖如春泄隔,著一層夾襖步出監(jiān)牢的瞬間拒贱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逻澳,地道東北人闸天。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像斜做,于是被迫代替她去往敵國和親苞氮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容