為什么Android總是事無巨細地告訴你應用索取的每一項權(quán)限?本文將分析這個問題,并就如何控制權(quán)限提出一些方法。
相比Apple,Microsoft嚴格控制生態(tài)系統(tǒng)(從蘋果給開發(fā)者的"App Store Guideline"可見一斑),只允許通過官方應用商店安裝應用,并對每份上傳進行仔細地審查而言,Android的開放就意味著,Google需要向 用戶提供一系列用于為自己負責的流程、工具。所以在安裝應用前,Android總是要事無巨細地告訴你,應用肯需要控制什么權(quán)限。
同樣,開發(fā)者也制作了一系列易用的工具,用以鑒別可疑的應用程序,或是控制權(quán)限。
Andoird哪里開放了?
在Android中,用戶能自由從本地安裝應用,自由地對SD卡進行操作,自由選擇應用市場。
如果愿意放棄保修,用戶還能輕易地實行root,解鎖基帶(baseband)。只有一些產(chǎn)品會嚴密地鎖定bootloader(如摩托羅拉)。
最重要的是,因為ASOP(Android源代碼開放計劃)的存在,絕大部分的Android代碼都是開源的,開發(fā)者可以由此對Android系統(tǒng)進行 深入的修改,甚至可以自行編寫一個符合Android規(guī)范的系統(tǒng)實例(如Cyanogen Mod)。正是因為ASOP,這篇文章才可能介紹多達5種原理不同的權(quán)限控制方法。
開放的風險
不考慮Symbian,Windows Phone 6.5(及以下)平臺,那么幾乎所有的智能手機病毒都是Android平臺的,甚至官方Android Market也鬧過幾次烏龍。在國內(nèi)水貨橫行的市場,情況更是火上澆油,不法業(yè)者可以在手機的ROM,甚至是bootloader中做好手腳,讓用戶有病無法醫(yī)。
在Android中,用戶可以允許系統(tǒng)安裝來自"未知源"(也就是非Google官方的,或手機預置市場的)應用程序。于是,移動平臺最重要的門神------數(shù)字簽名就被繞過了。
出于Android的開放性,也有不允許"未知源"的反例:亞馬遜的Kindle Fire平板使用了深度定制的Android,它只允許安裝來自亞馬遜官方商店的應用程序。
2 Android有哪些"權(quán)限"
首先需要明確一下Android中的種種"權(quán)限"。Android是在Linux內(nèi)核上建立一個硬件抽象層(Android HAL),通過Dalvik以及各種庫來執(zhí)行android應用的。在手機啟動時,首先需要由Bootloader(HTC手機上稱作Hboot)引導 Linux及手機上各個硬件設備的驅(qū)動程序,之后才啟動Android系統(tǒng)。所以其實我們會涉及到四種不同涵義的權(quán)限:
Android權(quán)限(Permission)
這指Android中的一系列"Android.Permission.*"對象,是本文的中心內(nèi)容。
Google在Android框架內(nèi)把各種對象(包括設備上的各類數(shù)據(jù),傳感器,撥打電話,發(fā)送信息,控制別的應用程序等)的訪問權(quán)限進行了詳細的劃 分,列出了約一百條"Android.Permission"。應用程序在運行前必須向Android系統(tǒng)聲明它將會用到的權(quán)限,否則Android將會 拒絕該應用程序訪問通過該"Permission"許可的內(nèi)容。
比方說,搜狗輸入法提供了一個智能通訊錄的功能,用戶可以在輸入聯(lián)系人 拼音的前幾個字符,或首字母,輸入法就能自動呈現(xiàn)相關(guān)聯(lián)系人的名字。為了實現(xiàn)這個功能,輸入法必須聲明它需要讀取手機中聯(lián)系人的能力,也就是在相關(guān)代碼中 加上聲明"android.permission.READ_CONTACTS"對象。
原生Android只提供了對"一刀切"式的管理,要么同意使用,否則就根本就不安裝應用程序。當用戶遇到希望使用程序的同時,又想禁止部分Permission的場合,他就無路可走。
于是,不少開發(fā)者就搗鼓出了"第三條道路";可惜的是,沒有一種方法能同時做到既不需要將手機固件Root,又完全不涉及對原始應用程序進行反向工程的方法。
Root
Root指獲得Android所在的Linux系統(tǒng)的Root(根)權(quán)限,有了根權(quán)限,你才能對Linux做出任意的修改。iOS中的越獄 (Jailbreak) 相當于獲得iOS系統(tǒng)的Root權(quán)限(iOS是一種類Unix系統(tǒng),和Linux都使用Root的概念)。在已Root的設備中,通常都是使用一個 叫"Superuser"(簡稱SU)的應用程序來向許可的程序授以Root權(quán)限。
Bootloader的解鎖(Unlock)
利用數(shù)字簽名,Bootloader可以限定只有正確簽名的系統(tǒng)可以被引導。在修改固件以獲得Root以前,解鎖Bootloader通常是必須的。安裝第三方修改、編譯的固件也需要解鎖Bootloader。
基帶(Radio)解鎖
在Android系統(tǒng)中,基帶是上層軟件與手機中無線設備(手機網(wǎng)絡,Wi-Fi,藍牙等)的驅(qū)動程序之間的中介。國外的網(wǎng)絡運營商很喜歡鎖定基帶,從 而保證用戶只能使用運營商自己指定的sim卡。在我國,鎖定基帶是非法的,手機制造商、網(wǎng)絡運營商也不可以通過鎖定基帶的方法對待違約客戶。iOS的"解 鎖"就是解鎖iOS中的基帶軟件。
為什么要控制Android權(quán)限
魚和熊掌不可兼得,Android的世界有很多自由,壞人也能自由地做壞事。它的生態(tài)系統(tǒng)很強調(diào)自主:用戶可以自主地減小風險,僅使用官方市場的應用程序,也可以自主地解除安全限制,從而獲得更多自由。因此,在遇到壞事的時候,用戶也不得不自主一下:
1, 抵制不道德,乃至非法行為
幾乎所有的Android安全軟件都能對來電、信息進行控制,以減少騷擾。
另一方面,很多應用都會要求它們實際功能以外的權(quán)限,表現(xiàn)在非(主動)告知地搜集設備序列號,位置信息,誘使用戶默認地上傳聯(lián)系人列表等方面。
更壞一點的應用程序,則會踏入犯罪的范疇,比如能偷偷發(fā)出扣費信息,或是作為黑客的偷窺工具。
2, 減少惡意軟件的損害
惡意軟件即便潛伏成功,也難以獲得權(quán)限,從而減少損失。
3, 用戶有權(quán)自主地在抑制應用程序的部分權(quán)限時,繼續(xù)使用該應用程序,而只承擔由于自行設置不當而帶來的后果。
用戶擁有設備的所有權(quán),因此有權(quán)自主控制設備上的內(nèi)容、傳感器等對象的訪問;同時有權(quán)(不)運行,(不)編譯設備上的應用程序。
大多數(shù)應用程序在運行時,并未達成主動告知的義務,是失誤;然而即使主動告知,用戶還是可以不理會。
為什么Android官方市場的強制提醒權(quán)限的行為不屬于主動告知:
通過Android官方市場,"打包安裝器"安裝應用程序時,所顯示的"權(quán)限"僅是在安裝包內(nèi)AndroidManifest.xml聲明的值,而非應 用程序?qū)嶋H上會調(diào)用的內(nèi)容。該值僅用來表明Android系統(tǒng)能向應用授予的最大可能的權(quán)限。即便一個"Hello World"式的應用程序,也可以在AndroidManifest.xml中聲明所有可能的Android Permission。
這就是說,在AndroidManifest.xml中聲明的值與應用程序?qū)嶋H調(diào)用的權(quán)限有關(guān)聯(lián),但不等同,且這種提示是由Android系統(tǒng)負責實施的強制行為。
正確的理解是:"應用程序(被迫地)讓Android系統(tǒng)告知用戶,它在AndroidManifest.xml中所聲明的事項。"
這意味著應用程序在使用重要權(quán)限前,依然需要自行、主動地通知用戶相關(guān)事宜。
3 權(quán)限控制的方法
這里開始介紹各種控制Android權(quán)限的辦法??上У氖?,幾乎所有的手段都需要對設備進行Root,如果不這么做,則需要付出不小代價。
App Shield(國內(nèi)常見的名字:權(quán)限修改器)
它是一個需要付費的Android應用,其原理是修改應用程序的apk安裝包,刪除其中AndroidManifest.xml文件內(nèi),用于聲明權(quán)限的 對應"Android.Permission.*"條目,然后再用一個公開的證書對安裝包重新簽名(需要允許"未知源"),這樣一來,應用程序就不會向系 統(tǒng)申請原先所需的權(quán)限。當應用運行至相應的流程時,系統(tǒng)將直接拒絕,從而達到用戶控制權(quán)限的目的。
對于已安裝的應用,AppShield也會按照同樣方法制作好apk安裝包,然后讓用戶先卸載原始的應用,再安裝調(diào)整過的應用。除了該應用數(shù)字簽名外,用戶可以隨時通過執(zhí)行同樣的流程,將吊銷的權(quán)限恢復。
CyanogenMod 7.1(及以上版本)Cyanogenmod是一款著名的第三方編寫的開源Android ROM。
CM7.1加入了控制權(quán)限的開關(guān),官方的名稱是"Permission Revoking",任何非系統(tǒng)/保護應用在安裝后,可直接吊銷任意一項權(quán)限,其效果等價于直接刪除apk包中AndroidManifest.xml的 對應條目,但不會引發(fā)自校驗的問題。CM的權(quán)限工具的作用等同于AppShield,無非是在Android自身的權(quán)限系統(tǒng)中添加了一個開關(guān)。
優(yōu)點:
免費,使用簡便,可隨時,任意地吊銷、恢復非預裝應用的任意一項權(quán)限;不存在數(shù)字簽名的問題,因而不影響使用自校驗的應用程序。
問題:
此功能僅在Cyanogen Mod 7.1及以上版本提供,無法用于其它rom。因為是由Android系統(tǒng)出面吊銷權(quán)限,其實現(xiàn)原理與App Shield完全相同,同樣的,應用程序會因為設計不良而出現(xiàn)崩潰。
Permission Denied
這是可以吊銷任意Android應用(注意,不當?shù)氐蹁N系統(tǒng)應用的權(quán)限可能會導致手機固件損壞,無法啟動)的任意權(quán)限,對權(quán)限的修改在重啟后生效。
實現(xiàn)原理應該與Cyanogen Mod 7.1+完全相同,適用于任何已經(jīng)Root的系統(tǒng),因為一般的Android系統(tǒng)雖然事實上支持權(quán)限吊銷,但沒有像Cyanogen Mod那樣放置接口,因此需要重啟后才能應用權(quán)限配置。同樣也有系統(tǒng)出面拒絕權(quán)限而導致的崩潰現(xiàn)象。
優(yōu)點:
效果與Cyanogen Mod中的權(quán)限吊銷效果一致,且可吊銷系統(tǒng)應用的權(quán)限。同時提供了免費與收費版本,免費版并沒有基本功能的缺失。適用于所有版本號不低于1.6的Android設備。
問題:
調(diào)整后的權(quán)限需要重啟才能生效。設計不良的應用會崩潰。不恰當?shù)臋?quán)限修改會損壞系統(tǒng),導致無法開機。
PDroid
PDroid實際上是一個Android內(nèi)核補丁加上一個用于管理的外部應用。補丁需要在Recover環(huán)境中刷入系統(tǒng),也可以由開發(fā)者自行移植入系 統(tǒng)。該軟件在Android ASOP 2.3.4代碼基礎上開發(fā),僅適用于沒有改動內(nèi)核的Android 2.3系統(tǒng),目前還未支持Android 4。
為了避免Cyanogen Mod 7.1+權(quán)限吊銷(Permission revoking)導致的崩潰問題,以及后臺服務(如LBE,QQ手機管家等,PDroid的作者認為通過后臺服務攔截權(quán)限并不是好辦法),PDroid 并不阻止應用程序聲明權(quán)限,但會在其實際索取相關(guān)信息時,予以阻止。通俗地說,就是簽署協(xié)議但不執(zhí)行。在PDroid的用戶界面,用戶能隨時精確地控制涉 及隱私的各項權(quán)限。對于某些內(nèi)容,除了阻止外,用戶還可以偽造一個隨機或指定的數(shù)據(jù)。
PDroid的內(nèi)核補丁并不通用,每一個Rom都需要特定的補丁。開發(fā)者除了提供了幾個特定機型下Cyanogen Mod,HTC Sense修改版ROM的專用補丁外,還推出了一個補丁生成工具(PDroid Patcher),用戶可以給自己的ROM生成專用的內(nèi)核補丁。使用該Patcher需要安裝JDK(java Development Kit)。
優(yōu)點:
PDroid避免了通過Android系統(tǒng)進行權(quán)限吊銷的導致的潛在崩潰問題,也不需要后臺服務。對隱私信息的控制是最精細的。盡管設備必須Root,但應用本身不需要Root權(quán)限。
問題:
安裝過程是最繁瑣,最不可靠的,容易導致ROM損壞,適用范圍也小,需要用戶有相當?shù)募寄?能安裝JDK,會刷機)才可使用;只提供對隱私有關(guān)權(quán)限的控制,不提供網(wǎng)絡訪問,的控制。以這些為代價,它幾乎沒有其它缺點。
LBE安全大師
實際上最常用的是以LBE為代表的通過一個Root權(quán)限的后臺服務來攔截相關(guān)行為的工具。除了LBE外,還有QQ手機管家等應用。這里以LBE安全大師為例介紹。
優(yōu)點:
使用非常簡單,功能強大而全面,風險很小,可以控制系統(tǒng)應用。適用范圍廣,有很多替代產(chǎn)品。
問題:
需要后臺服務 (盡管蠶豆網(wǎng)有個評測,認為它對能耗幾乎沒有影響),不能控制所有的Android權(quán)限。
4 自啟動的控制
Android對后臺服務有著最好的支持。
在Android中可以自由地開發(fā)一種稱為'Service'的后臺運行的對象,加上沒有蘋果公司對應用程序的嚴格限制。諸如QQ掛機,即時調(diào)用第三方應用程序之類的形式都可以輕易實現(xiàn)。
為了全面支持后臺服務,也為了適應移動設備資源緊張,不得不經(jīng)常清理內(nèi)存的問題,應用可在系統(tǒng)中設置觸發(fā)器,當系統(tǒng)發(fā)生了某個特定特定事件時(系統(tǒng)啟動,撥打電話,收發(fā)信息,安裝、卸載應用,插上電源等,或應用程序自行定義的事件),就會觸發(fā)啟動應用程序。
AutoStarts 自啟動管理
AutoStarts是一個收費應用,通過它,用戶能了解系統(tǒng)中每一項程序會在什么場合下被觸發(fā)運行。如果提供Root權(quán)限,則還能禁止這樣的行為。
這里以Google Maps應用6.2版為例。默認情況下,這款應用總是會保持后臺運行,并每小時向Google發(fā)送一次當前用戶的位置信息。為了阻止這樣的行為,需要聯(lián)合 使用AutoStarts與任意一款進程管理應用:在AutoStarts中,阻止Google Maps的自行啟動(如圖),在每次使用完后,把Google Maps的進程殺掉。
5 其他
Root帶來的風險
有一個鉆牛角尖的說法認為,一旦對設備進行了Root,便無安全一說,只要惡意程序一旦偷偷獲得Root級別,一切都是空談。
這種說法之所以鉆牛角尖,是因為:一方面Android中的Root權(quán)限通常都是需要用戶通過Superuser應用進行授權(quán)的,這已經(jīng)夠用,雖然不能 指望Superuser無懈可擊;另一方面,控制Android權(quán)限主要是為了讓應用程序在"灰色地帶"的行為收斂一些,它們實際顯然不是病毒等犯罪軟件。