保護你的隱私,五種控制Android應用的權限的方法

這篇文章目的在於介紹Android系統上控制權限的方法,讀者只要使用過Android,或是對智能機平臺有所瞭解,就能看懂,不須要專門的編程知識。 javascript

1 爲何Android老是事無鉅細地告訴你應用索取的每一項權限? java

相比Apple,Microsoft嚴格控制生態系統(從蘋果給開發者的」App Store Guideline」可見一斑),只容許經過官方應用商店安裝應用,並對每份上傳進行仔細地審查而言,Android的開放就意味着,Google須要向用戶提供一系列用於爲本身負責的流程、工具。因此在安裝應用前,Android老是要事無鉅細地告訴你,應用肯須要控制什麼權限。 android

一樣,開發者也製做了一系列易用的工具,用以鑑別可疑的應用程序,或是控制權限。 web

 

 

圖1 Android 官方市場會強制提醒用 編程

Andoird哪裏開放了? 瀏覽器

在Android中,用戶能自由從本地安裝應用,自由地對SD卡進行操做,自由選擇應用市場。 緩存

若是願意放棄保修,用戶還能輕易地實行root,解鎖基帶(baseband)。只有一些產品會嚴密地鎖定bootloader(如摩托羅拉)。 安全

最重要的是,由於ASOP(Android源代碼開放計劃)的存在,絕大部分的Android代碼都是開源的,開發者能夠由此對Android系統進行深刻的修改,甚至能夠自行編寫一個符合Android規範的系統實例(如Cyanogen Mod)。正是由於ASOP,這篇文章纔可能介紹多達5種原理不一樣的權限控制方法。 網絡

 

開放的風險不考慮Symbian,Windows Phone 6.5(及如下)平臺,那麼幾乎全部的智能手機病毒都是Android平臺的,甚至官方Android Market也鬧過幾回烏龍。在國內水貨橫行的市場,狀況更是火上澆油,不法業者能夠在手機的ROM,甚至是bootloader中作好手腳,讓用戶有病沒法醫。 app

在Android中,用戶能夠容許系統安裝來自」未知源」(也就是非Google官方的,或手機預置市場的)應用程序。因而,移動平臺最重要的門神——數字簽名就被繞過了。

 

 

圖3 Android 容許未知安裝未知來源的應用程

出於Android的開放性,也有不容許」未知源」的反例:亞馬遜的Kindle Fire平板使用了深度定製的Android,它只容許安裝來自亞馬遜官方商店的應用程序。

 

 Android有哪些」權限」首先須要明確一下Android中的種種」權限」。Android是在Linux內核上創建一個硬件抽象層(Android HAL),經過Dalvik以及各類庫來執行android應用的。在手機啓動時,首先須要由Bootloader(HTC手機上稱做Hboot)引導Linux及手機上各個硬件設備的驅動程序,以後才啓動Android系統。因此其實咱們會涉及到四種不一樣涵義的權限:

Android權限(Permission)

這指Android中的一系列」Android.Permission.*」對象,是本文的中心內容。

Google在Android框架內把各類對象(包括設備上的各種數據,傳感器,撥打電話,發送信息,控制別的應用程序等)的訪問權限進行了詳細的劃分,列出了約一百條」Android.Permission」。應用程序在運行前必須向Android系統聲明它將會用到的權限,不然Android將會拒絕該應用程序訪問經過該」Permission」許可的內容。

比方說,搜狗輸入法提供了一個智能通信錄的功能,用戶能夠在輸入聯繫人拼音的前幾個字符,或首字母,輸入法就能自動呈現相關聯繫人的名字。爲了實現這個功能,輸入法必須聲明它須要讀取手機中聯繫人的能力,也就是在相關代碼中加上聲明」android.permission.READ_CONTACTS」對象。

 

原生Android只提供了對」一刀切」式的管理,要麼贊成使用,不然就根本就不安裝應用程序。當用戶遇到但願使用程序的同時,又想禁止部分Permission的場合,他就無路可走。因而,很多開發者就搗鼓出了」第三條道路」;惋惜的是,沒有一種方法能同時作到既不須要將手機固件Root,又徹底不涉及對原始應用程序進行反向工程的方法。

Root

Root指得到Android所在的Linux系統的Root(根)權限,有了根權限,你才能對Linux作出任意的修改。iOS中的越獄(Jailbreak) 至關於得到iOS系統的Root權限(iOS是一種類Unix系統,和Linux都使用Root的概念)。在已Root的設備中,一般都是使用一個叫」Superuser」(簡稱SU)的應用程序來向許可的程序授以Root權限。

Bootloader的解鎖(Unlock)

利用數字簽名,Bootloader能夠限定只有正確簽名的系統能夠被引導。在修改固件以得到Root之前,解鎖Bootloader一般是必須的。安裝第三方修改、編譯的固件也須要解鎖Bootloader。

基帶(Radio)解鎖

在Android系統中,基帶是上層軟件與手機中無線設備(手機網絡,Wi-Fi,藍牙等)的驅動程序之間的中介。國外的網絡運營商很喜歡鎖定基帶,從而保證用戶只能使用運營商本身指定的sim卡。在我國,鎖定基帶是非法的,手機制造商、網絡運營商也不能夠經過鎖定基帶的方法對待違約客戶。iOS的」解鎖」就是解鎖iOS中的基帶軟件。

爲何要控制Android權限

魚和熊掌不可兼得,Android的世界有不少自由,壞人也能自由地作壞事。它的生態系統很強調自主:用戶能夠自主地減少風險,僅使用官方市場的應用程序,也能夠自主地解除安全限制,從而得到更多自由。所以,在遇到壞事的時候,用戶也不得不自主一下:

1, 抵制不道德,乃至非法行爲

幾乎全部的Android安全軟件都能對來電、信息進行控制,以減小騷擾。

另外一方面,不少應用都會要求它們實際功能之外的權限,表如今非(主動)告知地蒐集設備序列號,位置信息,誘使用戶默認地上傳聯繫人列表等方面。

更壞一點的應用程序,則會踏入犯罪的範疇,好比能偷偷發出扣費信息,或是做爲黑客的偷窺工具。

2, 減小惡意軟件的損害

惡意軟件即使潛伏成功,也難以得到權限,從而減小損失。

3, 用戶有權自主地在抑制應用程序的部分權限時,繼續使用該應用程序,而只承擔因爲自行設置不當而帶來的後果。

用戶擁有設備的全部權,所以有權自主控制設備上的內容、傳感器等對象的訪問;同時有權(不)運行,(不)編譯設備上的應用程序。

大多數應用程序在運行時,並未達成主動告知的義務,是失誤;然而即便主動告知,用戶仍是能夠不理會。

爲何Android官方市場的強制提醒權限的行爲不屬於主動告知:

經過Android官方市場,」打包安裝器」安裝應用程序時,所顯示的」權限」僅是在安裝包內AndroidManifest.xml聲明的值,而非應用程序實際上會調用的內容。該值僅用來代表Android系統能嚮應用授予的最大可能的權限。即使一個」Hello World」式的應用程序,也能夠在AndroidManifest.xml中聲明全部可能的Android Permission。

這就是說,在AndroidManifest.xml中聲明的值與應用程序實際調用的權限有關聯,但不等同,且這種提示是由Android系統負責實施的強制行爲。

正確的理解是:」應用程序(被迫地)讓Android系統告知用戶,它在AndroidManifest.xml中所聲明的事項。」

這意味着應用程序在使用重要權限前,依然須要自行、主動地通知用戶相關事宜。

然而,即使只是讓一半的應用程序達到以上的標準,也是不可能的。應用程序須要經過收集用戶信息,程序的錯誤日誌。從而統計用戶的喜愛,改進程序。另外一方面,這也是發送精確廣告但不追溯到用戶身份信息的方式,這一點對於免費應用而言,是極其重要的。咱們之因此能知道不一樣型號手機的佔有率,應用軟件的流行度,是與這樣的統計不可分離的。

一旦每一個應用程序都專業地主動發出提醒,不專業的用戶(大多數用戶都是不專業的)一般會將之視爲如同海嘯警報通常的危機。

這麼作對誰都沒有好處——用戶方的隱私權是毋庸置疑的,然而應用程序方面的獲取信息記錄的需求也是無可阻擋的。若是每一個用戶都打算阻止,只會落得被迫接受不平等條約的下場,在溫飽之前,不會有人考慮小康的問題。

因而,現狀就變得有趣:用戶人享受着相同的服務;其中大部分用戶出於不知情/好意,默默地向開發者、廣告商提供了信息,剩下的少數用戶則能阻斷這種勞務。而做爲維持Android平臺的信息商人Google,只確保在它的地盤裏,不會發生觸碰底線的事情。

一句話總結:

設備是個人,無論你怎麼說,反正我說了算,但我說的話大可能是不算數的。

3 權限控制的方法

這裏開始介紹各類控制Android權限的辦法。惋惜的是,幾乎全部的手段都須要對設備進行Root,若是不這麼作,則須要付出不小代價。

App Shield(國內常見的名字:權限修改器)

它是一個須要付費的Android應用,其原理是修改應用程序的apk安裝包,刪除其中AndroidManifest.xml文件內,用於聲明權限的對應」Android.Permission.*」條目,而後再用一個公開的證書對安裝包從新簽名(須要容許」未知源」),這樣一來,應用程序就不會向系統申請原先所需的權限。當應用運行至相應的流程時,系統將直接拒絕,從而達到用戶控制權限的目的。

對於已安裝的應用,AppShield也會按照一樣方法制做好apk安裝包,而後讓用戶先卸載原始的應用,再安裝調整過的應用。除了該應用數字簽名外,用戶能夠隨時經過執行一樣的流程,將吊銷的權限恢復。

Apk文件的結構

Android應用都是打包成以.apk擴展名結尾,其實是zip的文件格式。

一個合法的apk至少須要這些成分:

根目錄下的」AndroidManifest.xml」文件,用以向Android系統聲明所需Android權限等運行應用所需的條件。

根目錄下的classes.dex(dex指Dalvik Exceptionable),應用(application)自己的可執行文件(Dalvik字節碼) 。

根目錄下的res目錄,包含應用的界面設定。(若是僅是一個後臺執行的」service」對象,則沒必要需)

Apk根目錄下的META-INF目錄也是必須的,它用以存放應用做者的公鑰證書與應用的數字簽名。

當應用被安裝後,這個apk文件會原封不動地移至設備的data/app目錄下,實際運行的,則是Dalvik將其中Classes.dex進行編譯後的Classes.odex(存放在Dalvik緩存中,刷機時的’cache wipe就是清除Dalvik的odex文件緩存’)。

優勢:

徹底不須要Root,適用於全部版本的Android設備。不會損壞系統,能夠吊銷任意一項Android權限。

問題:

1,須要從新安裝應用,該行爲可能會丟失應用的配置、歷史記錄。

2,執行權限吊銷的應用的數字簽名會被更改,沒法直接更新。對於那些設計不良(沒有意料到’不聲明權限’狀況的),或有額外自校驗的應用,可能會沒法運行。

3,沒法用於設備上的預裝應用,除非製造商好心地將該應用設置爲」能夠刪除」的狀態。

4,這個方法修改了apk包中的內容——儘管實際上AndroidManifest.xml和數字簽名並不算是應用程序的自己,但修改它們可能引起著做權的問題。

5,須要開啓」未知源」。

6,這是一個收費應用。

CyanogenMod 7.1(及以上版本)

Cyanogenmod是一款著名的第三方編寫的開源Android ROM。

CM7.1加入了控制權限的開關,官方的名稱是」Permission Revoking」,任何非系統/保護應用在安裝後,可直接吊銷任意一項權限,其效果等價於直接刪除apk包中AndroidManifest.xml的對應條目,但不會引起自校驗的問題。CM的權限工具的做用等同於AppShield,無非是在Android自身的權限系統中添加了一個開關。

優勢:

免費,使用簡便,可隨時,任意地吊銷、恢復非預裝應用的任意一項權限;不存在數字簽名的問題,於是不影響使用自校驗的應用程序。

問題:

此功能僅在Cyanogen Mod 7.1及以上版本提供,沒法用於其它rom。由於是由Android系統出面吊銷權限,其實現原理與App Shield徹底相同,一樣的,應用程序會由於設計不良而出現崩潰。

Permission Denied

這是能夠吊銷任意Android應用(注意,不當地吊銷系統應用的權限可能會致使手機固件損壞,沒法啓動)的任意權限,對權限的修改在重啓後生效。

實現原理應該與Cyanogen Mod 7.1+徹底相同,適用於任何已經Root的系統,由於通常的Android系統雖然事實上支持權限吊銷,但沒有像Cyanogen Mod那樣放置接口,所以須要重啓後才能應用權限配置。一樣也有系統出面拒絕權限而致使的崩潰現象。

優勢:

效果與Cyanogen Mod中的權限吊銷效果一致,且可吊銷系統應用的權限。同時提供了免費與收費版本,免費版並無基本功能的缺失。適用於全部版本號不低於1.6的Android設備。

問題:

調整後的權限須要重啓才能生效。設計不良的應用會崩潰。不恰當的權限修改會損壞系統,致使沒法開機。

PDroid

PDroid其實是一個Android內核補丁加上一個用於管理的外部應用。補丁須要在Recover環境中刷入系統,也能夠由開發者自行移植入系統。該軟件在Android ASOP 2.3.4代碼基礎上開發,僅適用於沒有改動內核的Android 2.3系統,目前還未支持Android 4。

爲了不Cyanogen Mod 7.1+權限吊銷(Permission revoking)致使的崩潰問題,以及後臺服務(如LBE,QQ手機管家等,PDroid的做者認爲經過後臺服務攔截權限並非好辦法),PDroid並不阻止應用程序聲明權限,但會在其實際索取相關信息時,予以阻止。通俗地說,就是簽署協議但不執行。在PDroid的用戶界面,用戶能隨時精確地控制涉及隱私的各項權限。對於某些內容,除了阻止外,用戶還能夠僞造一個隨機或指定的數據。

可控制的內容包括:

IMEI(可僞造)

IMSI(可僞造)

SIM卡序列號(可僞造)

手機號碼(可僞造)

來,去電號碼

SIM卡信息

當前蜂窩網絡信息

(以上七者均來自Android.Permission.READ_PHONE_STATE)

GPS定位信息 (可僞造,來自Android.Permission.FINE_LOCATION)

基站定位 (可僞造,來自Android.Permission.COARSE_LOCATION)

系統自帶瀏覽器的歷史,書籤(Android.Permission.BOOKMARKS)

聯繫人 (android.permission.READ_CONTACTS)

通話記錄 (android.permission.READ_CONTACTS)

系統日誌 (android.permission.READ_LOGS)

當前帳戶列表 (android.permission.GET_ACCOUNTS)

當前帳戶的受權碼  android.permission.USE_CREDENTIALS)

短信,彩信 (可能與這5個權限有關)

android.permission.READ_SMS

android.permission.RECEIVE_SMS

android.permission.SEND_SMS

android.permission.WRITE_SMS

android.permission.RECEIVE_MMS

日曆 android.permission.READ_CALENDAR

PDroid的內核補丁並不通用,每個Rom都須要特定的補丁。開發者除了提供了幾個特定機型下Cyanogen Mod,HTC Sense修改版ROM的專用補丁外,還推出了一個補丁生成工具(PDroid Patcher),用戶能夠給本身的ROM生成專用的內核補丁。使用該Patcher須要安裝JDK(java Development Kit)。

優勢:

PDroid避免了經過Android系統進行權限吊銷的致使的潛在崩潰問題,也不須要後臺服務。對隱私信息的控制是最精細的。儘管設備必須Root,但應用自己不須要Root權限。

問題:

安裝過程是最繁瑣,最不可靠的,容易致使ROM損壞,適用範圍也小,須要用戶有至關的技能(能安裝JDK,會刷機)纔可以使用;只提供對隱私有關權限的控制,不提供網絡訪問,的控制。以這些爲代價,它幾乎沒有其它缺點。

LBE安全大師

實際上最經常使用的是以LBE爲表明的經過一個Root權限的後臺服務來攔截相關行爲的工具。除了LBE外,還有QQ手機管家等應用。這裏以LBE安全大師爲例介紹。

LBE是國內一個叫」LBE安全小組」開發的工具,支持Android2.0~4.0。它的核心功能是像殺毒軟件通常,經過一個須要Root權限的後臺服務,劫持全部調用權限的行爲,並放行用戶許可的部分(其官方宣傳爲’API級別攔截’)。它和PDroid同樣幾乎不會引起應用程序崩潰,它支持攔截幾個涉及用戶的關鍵權限(LBE手機管家3.1/3.2):

讀取短信 (android.permission.READ_CONTACTS)

聯繫人記錄 (android.permission.READ_CONTACTS)

通話記錄 (android.permission.READ_CONTACTS)

定位 (Android.Permission.COARSE_LOCATION

Android.Permission.FINE_LOCATION)

手機識別碼 (與Android.Permission.READ_PHONE_STATE有關)

通話狀態 (與Android.Permission.READ_PHONE_STATE有關)

發送短信(具體原理不明,一樣相似於禁止這五個權限

android.permission.READ_SMS

android.permission.RECEIVE_SMS

android.permission.SEND_SMS

android.permission.WRITE_SMS

android.permission.RECEIVE_MMS)

撥打電話 (android.permission.CALL_PHONE)

通話監聽 (android.permission.PROCESS_OUTGOING_CALLS)

除此之外,LBE還能夠分別控制應用在Wifi,手機網絡的聯網權限,其原理是依靠IPtables防火牆,而非經過Android的」Internet」權限。

此外LBE手機管家還提供基於智能內容審查的短信攔截、來電歸屬地顯示,以及禁用系統(保護)應用,進程管理,殺毒等功能。

LBE提供兩個版本,一個叫」LBE安全大師」,是一個全面的手機管家類應用,更新比較頻繁,另外一個版本(LBE手機隱私衛士,LBE Security lite)僅提供權限方面的管理。

考慮到主要市場在國內,LBE的發行策略看上去有些奇怪,它在Google的官方市場並不發行最新版。一般只能只能在LBE的官方網頁,以及國內的應用市場得到最新版本。

優勢:

使用很是簡單,功能強大而全面,風險很小,能夠控制系統應用。適用範圍廣,有不少替代產品。

問題:

須要後臺服務 (儘管蠶豆網有個評測,認爲它對能耗幾乎沒有影響),不能控制全部的Android權限。

4 自啓動的控制

Android對後臺服務有着最好的支持。

在Android中能夠自由地開發一種稱爲’Service’的後臺運行的對象,加上沒有蘋果公司對應用程序的嚴格限制。諸如QQ掛機,即時調用第三方應用程序之類的形式均可以輕易實現。

爲了全面支持後臺服務,也爲了適應移動設備資源緊張,不得不常常清理內存的問題,應用可在系統中設置觸發器,當系統發生了某個特定特定事件時(系統啓動,撥打電話,收發信息,安裝、卸載應用,插上電源等,或應用程序自行定義的事件),就會觸發啓動應用程序。

AutoStarts 自啓動管理

AutoStarts是一個收費應用,經過它,用戶能瞭解系統中每一項程序會在什麼場合下被觸發運行。若是提供Root權限,則還能禁止這樣的行爲。

這裏以Google Maps應用6.2版爲例。默認狀況下,這款應用老是會保持後臺運行,並每小時向Google發送一次當前用戶的位置信息。爲了阻止這樣的行爲,須要聯合使用AutoStarts與任意一款進程管理應用:在AutoStarts中,阻止Google Maps的自行啓動(如圖),在每次使用完後,把Google Maps的進程殺掉。

5 其餘

Root帶來的風險

有一個鑽牛角尖的說法認爲,一旦對設備進行了Root,便無安全一說,只要惡意程序一旦偷偷得到Root級別,一切都是空談。

這種說法之因此鑽牛角尖,是由於:一方面Android中的Root權限一般都是須要用戶經過Superuser應用進行受權的,這已經夠用,雖然不能期望Superuser無懈可擊;另外一方面,控制Android權限主要是爲了讓應用程序在」灰色地帶」的行爲收斂一些,它們實際顯然不是病毒等犯罪軟件。

著做權的問題 (做者不是法律方面的專家,如下言論僅供參考)

咱們知道,Android中的應用程序是基於Java語言編寫的。而爲了達到跨平臺的目的,Java軟件是以字節碼(或叫中間代碼,bytecode),而非計算機能直接執行的機器碼(Machine Code,有時也叫做Binary)的形式存在。所以執行Java軟件時,須要一個Java虛擬機(Android系統中的Java虛擬機就是Dalvik)負責解釋運行,有的時候,虛擬機還會經過即時編譯(JIT)的方法將字節碼編譯爲機器碼後再運行,以提升程序的執行效率。

這就出現一個頗有趣的現象:

除非另行規定,做爲設備的擁有者,用戶老是能夠自行決定如何使用軟件,能自行決定程序可否訪問用戶本身的計算機(移動設備亦然)裏面的各個內容、對象。

由此衍生出,在須要對代碼編譯、解釋的場合,用戶也能經過對編譯器(解釋器)的干預,來影響代碼的執行效果。在Android中,用戶還能夠在Dalvik解釋、編譯的時候動手。

這是由於,著做權僅保護了軟件代碼不受到非受權的反向工程,未受權傳播等侵犯。另外一方面,對於Android上的Java,網頁中的javascript程序,賦予用戶解釋、編譯的權利是程序能執行的先決條件;同時,軟件發行者發一般也會主動提出放棄這種權利(表現爲’軟件按原樣提供’、’不對使用軟件形成的後果負責’等條目)

在編譯、解釋的過程當中,須要經過彙編(Assemble),鏈接(Link)等方法將編譯好的對象(Object)、方法(Function)聯繫起來。默認狀況下,這些行爲是由原始的代碼(源代碼、中間代碼)與編譯器(解釋器)決定的,可是用戶能夠經過制約編譯器(解釋器)的設置,從而影響到最終代碼。這麼作是沒有問題的。

還有一種,應用程序在安裝後,會在系統中產生一些緩存,或註冊一些信息。當其中的內容有關用戶數據時,讀取或修改它們也是沒有問題的。這就是所謂」只要是你的東西老是你的」;也是Cyanogen Mod、Permission Denied不會涉及版權問題的緣由所在。

總之,一個Android應用之因此能運行的前提是:

1,首先,用戶容許使用這個應用

這也能夠理解成:用戶安裝了應用(以及所以設定的後臺對象),購買了預裝應用的手機。這一點即不影響應用程序的主動通知義務,也不影響用戶過後的干預。

2,接下來,用戶容許Dalvik對該應用使用」解釋」,」JIT」的方法,從而該應用程序得以執行。

3,用戶隨時能夠對該應用做出任意不違反版權的干預。

因此,在沒有另行規定的前提下,用戶老是能夠自行決定,經過給應用程序分配自定義的權限;或是在應用程序調取內容,對象時予以阻斷。同時,用戶也須要自行承擔因不當操做產生的後果。

附錄:

一、 數字簽名

數字簽名是一種使用了公鑰加密領域的技術實現,用於鑑別數字信息的方法。一套數字簽名一般定義兩種互補的運算,一個用於簽名,另外一個用於驗證。數字簽名能夠輕易地驗證完整性(正確性),合法簽署的數字簽名具備不能否認性。 (摘錄自維基百科」數字簽名」條目,有修改)

二、 版權聲明

文章中引用的圖標,圖片或圖片的部分,以及部分文字的引用,僅出於合理使用的目的,多是持有人版權全部的。

來源:fcerebel投稿。

相關文章
相關標籤/搜索