版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
FDMSE信息系統(tǒng)安全防護(hù)第(PAGE30)頁共(NUMPAGES30)頁可信賴的安全手機北京頂魁科技有限公司移動操作系統(tǒng)--Android系統(tǒng)及應(yīng)用安全防護(hù)目錄目錄 21 概述 42 android系統(tǒng)架構(gòu) 42.1 應(yīng)用程序?qū)觓pplications 42.2 應(yīng)用程序框架層applicationframework 42.3 本地庫及運行環(huán)境libraries(核心庫)和androidrunime(虛擬機) 52.4 linux內(nèi)核層linuxkernel 53 安全機制 63.1 系統(tǒng)安全機制 63.2 數(shù)據(jù)安全機制 63.3 安全機制分析 63.3.1 hids(host-basedintrusion-detectionsystem) 73.3.2 selinux(security-enhancedlinux) 74 具體分析 74.1 總體說明 74.2 沙箱、進(jìn)程和權(quán)限 84.3 應(yīng)用程序開發(fā)用例 94.4 應(yīng)用程序簽名 104.4.1 手動創(chuàng)建私有、公共密鑰和公共密鑰證書 114.4.2 手動簽署應(yīng)用程序 124.4.3 手動優(yōu)化應(yīng)用程序 124.4.4 手動驗證應(yīng)用程序已經(jīng)簽署 124.5 使用EclipseADT創(chuàng)建密鑰和證書、簽署和優(yōu)化應(yīng)用程序 134.5.1 導(dǎo)出未簽署的應(yīng)用程序 134.5.2 導(dǎo)出已簽署的應(yīng)用程序 144.6 使用Android權(quán)限 204.6.1 聲明(請求)權(quán)限 214.6.2 聲明定制權(quán)限 214.6.3 定義一個活動的權(quán)限 224.7 內(nèi)容提供者和文件權(quán)限 224.8 運行時
Permission
API 235 Android應(yīng)用安全防御 245.1 代碼安全 245.1.1 代碼混淆 245.1.2 Apk簽名校驗 245.1.3 Dex文件校驗 245.1.4 逆向工具對抗 245.1.5 調(diào)試器檢測 255.1.6 加殼保護(hù) 255.2 數(shù)據(jù)安全 255.2.1 存儲安全問題 255.2.2 傳輸安全問題 265.3 組件安全 266 Android系統(tǒng)安全防御 276.1 操作系統(tǒng)安全問題 276.2 系統(tǒng)安全解決方案 276.2.1 權(quán)限管理與隔離 276.2.2 內(nèi)核與應(yīng)用層漏洞防護(hù) 286.2.3 惡意程序檢測與防護(hù) 286.2.4 數(shù)據(jù)安全存儲與傳輸: 287 結(jié)束語: 28移動操作系統(tǒng)—Android系統(tǒng)及應(yīng)用安全防護(hù)概述android做為全球最受歡迎的智能手機平臺,由于源碼開放、可編程軟件框架、網(wǎng)絡(luò)化設(shè)備的特點,很易受到智能手機病毒的攻擊,從linux機制、android特有的安全機制、其它保護(hù)機制三個角度分析android安全機制,為加強惡意軟件檢測和系統(tǒng)底層訪問控制,提出基于主機的入侵檢測系統(tǒng)(hids)和selinux(security-enhancedlinux)。
關(guān)鍵詞:android;安全機制;權(quán)限
android平臺是google于2007年推出的一種基于linux2.6核心的開源智能手機操作系統(tǒng)。在智能機平臺的競爭中android目前占有較大的優(yōu)勢,受到了業(yè)界的廣泛關(guān)注。它主要有操作系統(tǒng)、用戶界面和應(yīng)用程序三部分組成,不僅包括移動電話工作所需的全部軟件,而且不存在任何以往像專有權(quán)等阻礙移動產(chǎn)業(yè)創(chuàng)新的障礙。由于該系統(tǒng)自身具備的開放源碼的特征,所以它的安全性能正在成為信息安全領(lǐng)域研究的一個重要課題。android系統(tǒng)架構(gòu)androidos的整體架構(gòu)分為以下4個層次:應(yīng)用程序?qū)觓pplicationsapplication層是androidos的用戶應(yīng)用層,它包括一系列核心應(yīng)用程序包,應(yīng)用程序是用java語言編寫的,且運行在虛擬機上的程序,例如email客戶端、sms短消息程序、瀏覽器等。應(yīng)用程序框架層applicationframework該層是android平臺專門為應(yīng)用程序的開發(fā)而設(shè)計的,應(yīng)用程序框架都是由java語言編寫,允許開發(fā)人員完全訪問核心應(yīng)用程序所使用的api框架,它是開發(fā)者進(jìn)行android開發(fā)的基礎(chǔ)。它由一系列的服務(wù)和系統(tǒng)構(gòu)成,主要由view、通知管理器、活動管理器等由開發(fā)人員直接調(diào)用的組件組成。本地庫及運行環(huán)境libraries(核心庫)和androidrunime(虛擬機)android本地庫居于linux內(nèi)核上面,是一套c/c++庫,被上層各種各樣的系統(tǒng)組件調(diào)用。在android應(yīng)用程序內(nèi)通過java本地調(diào)用(jni)實現(xiàn)合并這些庫。android運行環(huán)境包括libraries(核心庫)和androidrutime(虛擬機)。核心庫由java語言編寫,提供了大量的java5se包的子類和一些android特有的庫。androidrutime(虛擬機)運行.dex(dalvik-executable)文件,一種被認(rèn)為比java類文件更加簡潔和節(jié)省內(nèi)存的文件。linux內(nèi)核層linuxkernelandroid的內(nèi)核為linux2.6內(nèi)核,它主要提供安全性、驅(qū)動、進(jìn)程管理、內(nèi)存管理、網(wǎng)絡(luò)協(xié)議棧等核心系統(tǒng)服務(wù)等等。android框架詳細(xì)結(jié)構(gòu)如下圖1所示。安全機制系統(tǒng)安全機制android一開始采用的是經(jīng)過定制的linux2.6的內(nèi)核,android的系統(tǒng)安全通過linux2.6的安全機制來實現(xiàn)。linux2.6版的內(nèi)核又加入了安全模塊的安全機制來增強linux系統(tǒng)的安全性從而提供諸如安全、內(nèi)存管理、進(jìn)程管理、網(wǎng)絡(luò)管理、驅(qū)動模型等多種核心服務(wù)。android系統(tǒng)的應(yīng)用軟件都是運行dalvik之上的java軟件,而dalvik是運行在linux中的,在一些底層功能比如線程和低內(nèi)存管理方面,dalvik虛擬機是依賴linux內(nèi)核的。
在linux2.6中,內(nèi)核已經(jīng)可以搶占,因而實時性得到了加強,但是內(nèi)核中仍有大量的不可搶占區(qū)域,如果當(dāng)前任務(wù)運行在內(nèi)核態(tài),即使當(dāng)前有更緊急的任務(wù)需要運行,目前正在運行的任務(wù)也不能被搶占,很大程度上,搶占延遲具有非常大的不確定性和不穩(wěn)定性。數(shù)據(jù)安全機制android的數(shù)據(jù)安全機制涉及到兩個概念:用戶標(biāo)識和權(quán)限許可,并且應(yīng)用層安全機制也是圍繞著這兩個安全標(biāo)識來實現(xiàn)的。
用戶標(biāo)識,useridentifieation,即uid。安裝在android中的每個程序都會被分配給一個屬于自己的linux用戶id,并且為它創(chuàng)建一個沙箱,以防止影響其它程序(或者其它程序影響它)。每個應(yīng)用程序都自己的uid,只有帶著此uid,才一能存取該uid所涵蓋的有關(guān)資料。
權(quán)限許可,permission,權(quán)限許可是android為保障安全而設(shè)定的安全標(biāo)識,同時也是程序?qū)崿F(xiàn)某些特殊操作的基礎(chǔ)。一個基本的android應(yīng)用程序沒有與其相關(guān)聯(lián)的權(quán)限,意味著它不能做任何影響用戶體驗或設(shè)備中的數(shù)據(jù)的有害操作,藉此用戶一些“敏感”數(shù)據(jù)不被某些未經(jīng)授權(quán)的程序所損害。
盡管android的安全機制經(jīng)過良好設(shè)計,但仍然存在以下幾種攻擊方式:基于硬件的攻擊、基于linux內(nèi)核的攻擊、基于系統(tǒng)核心程序的攻擊和基于應(yīng)用程序的攻擊。
安全機制分析android的安全防護(hù)不應(yīng)僅僅局限于單一攻擊方式,需從硬件到應(yīng)用程序各個層次進(jìn)行防護(hù)。以下將從基于主機的入侵檢測框架(hids),selinux在android上的實施兩個方面探討android的安全解決方案。hids(host-basedintrusion-detectionsystem)基于主機的入侵檢測系統(tǒng)包括異常檢測(anomalydetection)和基于知識的時間抽象方法(knowledge-basedtemporalabstraction)。
異常檢測是指入侵檢測系統(tǒng)框架持續(xù)采樣各種各樣的系統(tǒng)參數(shù)指標(biāo),采用機器學(xué)習(xí)(machinelearning)和時序推理(temporalreasoning)的方法分析采集的數(shù)據(jù)。通過收集系統(tǒng)參數(shù)指標(biāo),與已知的惡意軟件引發(fā)的系統(tǒng)參數(shù)指標(biāo)作對比,檢測相同點,進(jìn)而發(fā)現(xiàn)先前未曾遇到的新的惡意軟件。
基于知識的時間抽象方法(kbta)是指使用kbta,結(jié)合時間抽象知識基礎(chǔ),持續(xù)測量數(shù)據(jù)和事件,用來從面向時間的原始的安全數(shù)據(jù)抽象得出高層次的有意義的概念和模式。selinux(security-enhancedlinux)selinux是基于“域一類型”模型的用于強制訪問控制的安全系統(tǒng)是一種混合的安全性策略,安全性策略的邏輯和通用接口一起封裝在與操作系統(tǒng)獨立的安全服務(wù)器中,通過替換安全服務(wù)器,可以支持兩種不同的安全策略:目標(biāo)(targeted)策略,嚴(yán)格(strict)策略。目標(biāo)策略僅針對部分系統(tǒng)網(wǎng)絡(luò)服務(wù)和進(jìn)程執(zhí)行selinux策略。嚴(yán)格策略是執(zhí)行全局的nsa默認(rèn)策略,此時幾乎所有的網(wǎng)絡(luò)服務(wù)都受控。具體分析總體說明Android包括一個應(yīng)用程序框架、幾個應(yīng)用程序庫和一個基于Dalvik虛擬機的運行時,所有這些都運行在Linux?內(nèi)核之上。通過利用Linux內(nèi)核的優(yōu)勢,Android得到了大量操作系統(tǒng)服務(wù),包括進(jìn)程和內(nèi)存管理、網(wǎng)絡(luò)堆棧、驅(qū)動程序、硬件抽象層以及與本文主題——安全性——相關(guān)的服務(wù)。常用縮寫詞ADT:Android開發(fā)工具API:應(yīng)用程序編程接口IDE:集成開發(fā)環(huán)境JDK:Java開發(fā)包URL:統(tǒng)一資源標(biāo)識符XML:可擴展標(biāo)記語言前提條件要跟隨本文,需要具備以下技能和工具:基本了解Java?技術(shù)和如何使用Eclipse(或者您喜歡的IDE)JavaDevelopmentKit(需要版本5或6)Eclipse(版本3.4或3.5)AndroidSDK和ADT插件沙箱、進(jìn)程和權(quán)限用戶ID:Linux與Android在Linux中,一個用戶ID識別一個給定用戶;在Android上,一個用戶ID識別一個應(yīng)用程序。應(yīng)用程序在安裝時被分配用戶ID,應(yīng)用程序在設(shè)備上的存續(xù)期間內(nèi),用戶ID保持不變。權(quán)限是關(guān)于允許或限制應(yīng)用程序(而不是用戶)訪問設(shè)備資源。Android使用沙箱的概念來實現(xiàn)應(yīng)用程序之間的分離和權(quán)限,以允許或拒絕一個應(yīng)用程序訪問設(shè)備的資源,比如說文件和目錄、網(wǎng)絡(luò)、傳感器和API。為此,Android使用一些Linux實用工具(比如說進(jìn)程級別的安全性、與應(yīng)用程序相關(guān)的用戶和組ID,以及權(quán)限),來實現(xiàn)應(yīng)用程序被允許執(zhí)行的操作。概念上講,沙箱可以表示為
圖1
所示。圖1.兩個Android應(yīng)用程序,各自在其自己的基本沙箱或進(jìn)程上
Android應(yīng)用程序運行在它們自己的Linux進(jìn)程上,并被分配一個惟一的用戶ID。默認(rèn)情況下,運行在基本沙箱進(jìn)程中的應(yīng)用程序沒有被分配權(quán)限,因而防止了此類應(yīng)用程序訪問系統(tǒng)或資源。但是Android應(yīng)用程序可以通過應(yīng)用程序的manifest文件請求權(quán)限。通過做到以下兩點,Android應(yīng)用程序可以允許其他應(yīng)用程序訪問它們的資源:聲明適當(dāng)?shù)膍anifest權(quán)限與其他受信任的應(yīng)用程序運行在同一進(jìn)程中,從而共享對其數(shù)據(jù)和代碼的訪問后者演示在
圖2
中。圖2.兩個Android應(yīng)用程序,運行在同一進(jìn)程上
不同的應(yīng)用程序可以運行在相同的進(jìn)程中。對于此方法,首先必須使用相同的私鑰簽署這些應(yīng)用程序,然后必須使用manifest文件給它們分配相同的Linux用戶ID,這通過用相同的值/名定義manifest屬性
android:sharedUserId
來做到。應(yīng)用程序開發(fā)用例圖3
演示了很多在開發(fā)Android應(yīng)用程序時會發(fā)現(xiàn)的與安全性相關(guān)的用例。圖3.編寫Android應(yīng)用程序時出現(xiàn)的安全領(lǐng)域
應(yīng)用程序或代碼簽名是這樣一個過程,即生成私有、公共密鑰和公共密鑰證書,簽署和優(yōu)化應(yīng)用程序。權(quán)限是Android平臺的一種安全機制,以允許或限制應(yīng)用程序訪問受限的API和資源。默認(rèn)情況下,Android應(yīng)用程序沒有被授予任何權(quán)限,不允許它們訪問設(shè)備上受保護(hù)的API或資源,從而保證了它們的安全。權(quán)限必須被請求,定義了定制的權(quán)限,文件和內(nèi)容提供者就可以受到保護(hù)。確保在運行時檢查、執(zhí)行、授予和撤銷權(quán)限。接下來,更加詳細(xì)地來看一下每個安全領(lǐng)域。應(yīng)用程序簽名所有Android應(yīng)用程序都必須被簽名。應(yīng)用程序或代碼簽名是一個這樣的過程,即使用私有密鑰數(shù)字地簽署一個給定的應(yīng)用程序,以便:識別代碼的作者檢測應(yīng)用程序是否發(fā)生了改變在應(yīng)用程序之間建立信任基于這一信任關(guān)系,應(yīng)用程序可以安全地共享代碼和數(shù)據(jù)。使用相同數(shù)字簽名簽署的兩個應(yīng)用程序可以相互授予權(quán)限來訪問基于簽名的API,如果它們共享用戶ID,那么也可以運行在同一進(jìn)程中,從而允許訪問對方的代碼和數(shù)據(jù)。應(yīng)用程序簽名首先是生成一個私有、公共密鑰對和一個相關(guān)公共密鑰證書,簡稱為公共密鑰證書。構(gòu)建Android應(yīng)用程序時可以采用調(diào)試模式和發(fā)布模式:使用Android構(gòu)建工具(命令行和EclipseADT)構(gòu)建的應(yīng)用程序是用一個調(diào)試私有密鑰自動簽名的;這些應(yīng)用程序被稱為調(diào)試模式應(yīng)用程序。調(diào)試模式應(yīng)用程序用于測試,不能夠發(fā)布。注意,未簽名的或者使用調(diào)試私有密鑰簽名的應(yīng)用程序不能夠通過AndroidMarket發(fā)布。您準(zhǔn)備發(fā)布自己的應(yīng)用程序時,必須構(gòu)建一個發(fā)布模式的版本,這意味著用私有密鑰簽署應(yīng)用程序。Android中的代碼簽名采用一種比其他移動平臺中要簡單得多的方式。在Android上,證書可以是自簽名的,這就是說,無需證書授權(quán)。這種方法簡化了發(fā)布過程和相關(guān)的成本。接下來,介紹如何從命令行以及通過使用EclipseADT手動簽署Android應(yīng)用程序。本文中不介紹第三種方法,即使用Ant。手動創(chuàng)建私有、公共密鑰和公共密鑰證書回想一下,調(diào)試模式應(yīng)用程序是使用調(diào)試密鑰/證書由構(gòu)建工具自動簽名的。要簽署一個發(fā)布模式的應(yīng)用程序,首先必須生成私有、公共密鑰對和公共密鑰證書。可以手動地或者通過使用EclipseADT簽署應(yīng)用程序。兩種方法中都使用了JavaDeveloperKit(JDK)keytool密鑰和證書管理實用工具。要手動生成私有、公共密鑰信息,可以從命令行使用
keytool,如
清單1
所示。清單1.使用
keytool
生成私有/公共密鑰和證書 keytool-genkey-v-alias<alias_name>-keystore<>-keyalgRSA-keysize2048-validity<numberofdays>注意:清單1
假設(shè)JDK已安裝在您的計算機上,并且
JAVA_HOME
路徑被正確定義為指向您的JDK目錄(參見
參考資料,獲得下載和設(shè)置信息)。在
清單1
中,-genkey
表示一個公共、私有密鑰對項,以及一個X.509v1自簽署的單個元素證書鏈,其中包含生成的公共密鑰。-v表示冗長模式。-alias
是用于keystore項的別名,keystore存儲生成的私有密鑰和證書。-keystore
表示使用的密鑰倉庫的名稱。-keyalg
是用來生成密鑰對的算法。-keysize
是生成的密鑰大小,其中默認(rèn)大小是1024,但是推薦大小是2048。-validity
是有效天數(shù);推薦采用大于1000的值。注意:生成密鑰之后,一定要保證密鑰的安全。不要共享私有密鑰,也不要在命令行或腳本中指定密鑰;注意,keytool和jarsigner會提示輸入密碼。關(guān)于這一技巧和其他技巧,請參考AndroidDevelopers網(wǎng)站的“SecuringYourPrivateKey”(參見
參考資料
中的鏈接)。Keytool
提示您輸入名和姓、公司、城市、州、國家,從這些信息生成一個X.500DistinguishedName(更多信息請參見
參考資料),還要輸入保護(hù)私有密鑰和密鑰倉庫本身的密碼。對于有效期,請確保使用超出應(yīng)用程序本身和相關(guān)應(yīng)用程序預(yù)期生命期的時期。如果您是在AndroidMarket上發(fā)布應(yīng)用程序,那么有效期必須晚于2033年10月22日結(jié)束;否則不能上載。此外,擁有長壽命的證書讓升級應(yīng)用程序更為容易。幸運的是,AndroidMarket強制采用長壽命的證書,以幫助您避免此類問題。手動簽署應(yīng)用程序接下來,使用
jarsigner
工具(它是JDK的一部分)簽署未簽名的應(yīng)用程序:jarsigner-verbose-keystore<><my_application.apk><alias_name>在上述代碼中,-verbose
表示冗長模式,-keystore
表示使用的密鑰倉庫的名稱。接下來是應(yīng)用程序的名稱(.apk),最后是用于私有密鑰的別名。Jarsigner
提示您輸入使用密鑰倉庫和私有密鑰時的密碼。應(yīng)用程序可以使用不同的密鑰進(jìn)行多次簽名,用相同私有密鑰簽名的應(yīng)用程序之間可以建立一種信任關(guān)系,并且可以運行在同一進(jìn)程中,共享代碼和數(shù)據(jù)。手動優(yōu)化應(yīng)用程序簽署過程的最后一步是優(yōu)化應(yīng)用程序,以便數(shù)據(jù)邊界與文件的開始是內(nèi)存對齊的,這種技術(shù)有助于改善運行時性能和內(nèi)存利用率。要簽署應(yīng)用程序,可以使用
zipalign:zipalign-v4your_project_name-unaligned.apkyour_project_name.apk在前面的代碼中,-v
表示冗長輸出。數(shù)字4表示使用四字節(jié)對齊(總是使用四字節(jié))。下一個參數(shù)是輸入已簽署應(yīng)用程序的文件名(.apk),它必須用您的私有密鑰簽署。最后一個參數(shù)是輸出文件名;如果覆蓋現(xiàn)有應(yīng)用程序,則添加一個
-f。手動驗證應(yīng)用程序已經(jīng)簽署要驗證應(yīng)用程序已經(jīng)簽署,可以使用
Jarsigner,這次傳遞
-verify
標(biāo)志:jarsigner-verify-verbose-certsmy_application.apk在前面的代碼中,-verify
表示驗證應(yīng)用程序;-verbose
表示冗長模式;-certs
表示展示創(chuàng)建密鑰的CN字段,最后一個參數(shù)是要驗證的Android應(yīng)用程序包的名稱。注意:如果CN讀入"AndroidDebug",那么意味著應(yīng)用程序是用調(diào)試密鑰簽署的,這表明不能發(fā)布;如果您計劃在AndroidMarket上發(fā)布您的應(yīng)用程序,一定要記得使用私有密鑰。剛才學(xué)習(xí)了如何手動創(chuàng)建私有、公共密鑰,以及簽署和優(yōu)化應(yīng)用程序。接下來,了解如何使用EclipseADT自動創(chuàng)建私有、公共密鑰,以及簽署和優(yōu)化應(yīng)用程序。使用EclipseADT創(chuàng)建密鑰和證書、簽署和優(yōu)化應(yīng)用程序要使用EclipseADT生成密鑰,必須導(dǎo)出應(yīng)用程序。有兩種方法從Eclipse導(dǎo)出應(yīng)用程序:導(dǎo)出您必須手動簽署的應(yīng)用程序的未簽署
版本導(dǎo)出應(yīng)用程序的已簽署
版本,其中所有步驟都由ADT為您代勞導(dǎo)出未簽署的應(yīng)用程序您可以導(dǎo)出您必須手動簽署的應(yīng)用程序的未簽署版本。就是說,您需要手動運行keytool(如前所述,是為了生成密鑰)和Jarsigner(為了簽署應(yīng)用程序),并使用zipalign工具優(yōu)化應(yīng)用程序,跟前面解釋的那樣。要使用ADT導(dǎo)出應(yīng)用程序的未簽署版本,可以右鍵單擊項目并選擇
AndroidTools>ExportUnsignedApplicationPackage(參見圖4)。
圖4.導(dǎo)出未簽署的應(yīng)用程序
選中之后,ADT提示您選擇將未簽署應(yīng)用程序?qū)С龅降哪夸?。記住,一旦?yīng)用程序被導(dǎo)出,您就必須手動簽署和優(yōu)化應(yīng)用程序,跟前面介紹的那樣。導(dǎo)出已簽署的應(yīng)用程序利用EclipseADT,您可以導(dǎo)出應(yīng)用程序的已簽署版本。使用這種方法,ADT提示您輸入以下內(nèi)容:使用現(xiàn)有KeyStore或者創(chuàng)建新的受保護(hù)KeyStore所需的信息創(chuàng)建受保護(hù)私有密鑰所需的信息生成公共密鑰證書所需的信息要導(dǎo)出已簽署的應(yīng)用程序,可以右鍵單擊項目,但是這一次選擇菜單項
AndroidTools->ExportSignedApplicationPackage,如圖5
所示。
圖5.導(dǎo)出已簽署的應(yīng)用程序
此時,ExportWizard執(zhí)行,如
圖6
所示。
圖6.ExportWizard
在
圖7
中,選擇一個現(xiàn)有的密鑰倉庫(或者創(chuàng)建一個新的)和證書。
圖7.ExportWizard:密鑰倉庫選擇
在
圖8
中,輸入信息以創(chuàng)建私有密鑰和數(shù)字證書。
圖8.ExportWizard:創(chuàng)建私有密鑰和數(shù)字證書
在
圖9
中,輸入目標(biāo)文件的路徑和名稱,并驗證有效期間。
圖9.輸入目標(biāo)文件的路徑和名稱
完成時,您就有了一個發(fā)布模式的已簽署和已優(yōu)化的應(yīng)用程序,您可以發(fā)布它。另外,您也可以使用AndroidManifest工具調(diào)用ExportWizard,如
圖10
所示。
圖10.使用AndroidManifest工具調(diào)用ExportWizard
應(yīng)用程序簽署之后,下一步由您在manifest中定義應(yīng)用程序需要的權(quán)限。接下來將描述這一過程。注意,AndroidDeveloper網(wǎng)站有非常好的關(guān)于應(yīng)用程序簽署的文檔,當(dāng)有Android平臺的新版本可用時,這些文檔都會更新(參見參考資料,了解更多信息)。使用Android權(quán)限權(quán)限是一種Android平臺安全機制,旨在允許或限制應(yīng)用程序訪問受限的API和資源。默認(rèn)情況下,Android應(yīng)用程序沒有被授予權(quán)限,這通過不允許它們訪問設(shè)備上的受保護(hù)API或資源,確保了它們的安全。權(quán)限在安裝期間通過manifest文件由應(yīng)用程序請求,由用戶授予或不授予。Android定義長長的一系列manifest權(quán)限,以保護(hù)系統(tǒng)或其他應(yīng)用程序的各個方面。要請求權(quán)限,可以在manifest文件中聲明一個<user-permission>
屬性:<uses-permissionandroid:name="string"/>其中
android:name
指定權(quán)限的名稱。要得到所有Android定義的manifest權(quán)限的列表,請參見Manifest.permisson頁面。清單2
是一個manifest文件的例子,它請求使用Internet的權(quán)限和寫到外部存儲器的權(quán)限:聲明(請求)權(quán)限 <?xmlversion="1.0"encoding="utf-8"?><manifestxmlns:android="/apk/res/android"android:versionCode="1"android:versionName="1.0"package="com.cenriqueortiz.tutorials.datastore"android:installLocation="auto"><application:::</application><uses-permissionandroid:name="android.permission.INTERNET"/><uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/></manifest>應(yīng)用程序可以定義它們自己的定制權(quán)限,以保護(hù)應(yīng)用程序資源。其他應(yīng)用程序想要訪問一個應(yīng)用程序的受保護(hù)資源,就必須通過它們自己的manifest文件請求適當(dāng)?shù)臋?quán)限。清單3
展示了一個如何定義權(quán)限的例子。聲明定制權(quán)限 <permissionxmlns:android="/apk/res/android"android:name="com.cenriqueortiz.android.ACCESS_FRIENDS_LIST"android:description="@string/permission_description"android:label="@string/permission_label"android:protectionLevel="normal"></permission>在
清單3
中,通過指定最少的屬性,即
name、description、label
和
protectionLevel,定義了一個定制權(quán)限。也可以定義其他屬性,但是這里沒做介紹。特別有趣的是
android:protectionLevel
屬性,它表示系統(tǒng)向一個請求權(quán)限的應(yīng)用程序授予(或不授予)給定的權(quán)限時應(yīng)該遵循的方法。保護(hù)級別有普通
和危險。前者自動授予權(quán)限(盡管用戶在安裝之前總是可以重審),基于簽名授予權(quán)限(就是說,如果請求權(quán)限的應(yīng)用程序是用同一證書簽署的);后者表示權(quán)限給予私有數(shù)據(jù)的訪問權(quán),或者具有另一個潛在的負(fù)面影響。有關(guān)
<permission>manifest屬性的更多信息,請參見<permission>頁面(參見
參考資料)。應(yīng)用程序可以限制對應(yīng)用程序及其使用的系統(tǒng)組件(比如Activity、Service、ContentProvider和BroadcastReceiver)的訪問。通過像
清單4
中那樣定義
android:permission
屬性,很容易實現(xiàn)這種限制。這種級別的保護(hù)讓應(yīng)用程序允許或限制其他應(yīng)用程序訪問系統(tǒng)資源。定義一個活動的權(quán)限 <activityandroid:name=".FriendsListActivity"android:label="FriendsList">android:permission="com.cenriqueortiz.android.ACCESS_FRIENDS_LIST"<intent-filter>::</intent-filter></activity>內(nèi)容提供者和文件權(quán)限內(nèi)容提供者暴露一個公共URI,用于惟一地識別它們的數(shù)據(jù)(參見
參考資料)。要保護(hù)此內(nèi)容提供者,當(dāng)開始時或者從活動返回結(jié)果時,調(diào)用者可以設(shè)置
Intent.FLAG_GRANT_READ_URI_PERMISSION
和
Intent.FLAG_GRANT_WRITE_URI_PERMISSION,以便授予接收活動權(quán)限,以訪問特定的數(shù)據(jù)URI。應(yīng)用程序文件默認(rèn)是受保護(hù)的。文件基于用戶ID受保護(hù),因而只對所有者應(yīng)用程序是可訪問的(此應(yīng)用程序具有相同的用戶ID)。正如前面介紹的,共享相同用戶ID(并使用相同數(shù)字證書簽署)的應(yīng)用程序運行在相同進(jìn)程上,因而共享對它們的應(yīng)用程序的訪問。應(yīng)用程序可以允許其他應(yīng)用程序或進(jìn)程訪問它們的文件。這種允許是通過指定適當(dāng)?shù)?/p>
MODE_WORLD_READABLE
和
MODE_WORLD_WRITEABLE操作模式(以便允許對文件的讀或?qū)懺L問)或
MODE_PRIVATE(以便以私有模式打開文件)而做到的。您可以在創(chuàng)建或打開文件時利用以下方法指定操作模式:getSharedPreferences(filename,operatingMode)openFileOutput(filename,operatingMode)openOrCreateDatabase(filename,operatingMode,SQLiteDatabase.CursorFactory)運行時
Permission
APIAndroid提供各種API來在運行時檢查、執(zhí)行、授予和撤銷權(quán)限。這些API是
android.content.Context
類的一部分,這個類提供有關(guān)應(yīng)用程序環(huán)境的全局信息。例如,假設(shè)您想要優(yōu)雅地處理權(quán)限,您可以確定您的應(yīng)用程序是否被授予了訪問Internet的權(quán)限(參見確定5)。
清單5.使用運行時
Permission
API在運行時檢查權(quán)限 if(context.checkCallingOrSelfPermission(Manifest.permission.INTERNET)!=PackageManager.PERMISSION_GRANTED){//TheApplicationrequirespermissiontoaccessthe//Internet");}else{//OKtoaccesstheInternet}要了解其他在運行時檢查、執(zhí)行、授予和撤銷權(quán)限的權(quán)限API,請參考上下文類。Android應(yīng)用安全防御代碼安全代碼安全主要是指Android
apk有被篡改、盜版等風(fēng)險,產(chǎn)生代碼安全的主要原因是apk很容易被反編譯、重打包。我們可以采用以下方法對apk進(jìn)行保護(hù):代碼混淆代碼混淆可以在一定程度上增加apk逆向分析的難度。Android
SDK從2.3開始就加入了ProGuard代碼混淆功能,開發(fā)者只需進(jìn)行簡單的配置就可以實現(xiàn)對代碼的混淆。Apk簽名校驗每一個軟件在發(fā)布時都需要開發(fā)人員對其進(jìn)行簽名,而簽名使用的密鑰文件時開發(fā)人員所獨有的,破解者通常不可能擁有相同的密鑰文件,因此可以使用簽名校驗的方法保護(hù)apk。Android
SDK中PackageManager類的getPackageInfo()方法就可以進(jìn)行軟件簽名檢測。Dex文件校驗重編譯apk其實就是重編譯了classes.dex文件,重編譯后,生成的classes.dex文件的hash值就改變了,因此我們可以通過檢測安裝后classes.dex文件的hash值來判斷apk是否被重打包過。(1)讀取應(yīng)用安裝目錄下/data/app/xxx.apk中的classes.dex文件并計算其哈希值,將該值與軟件發(fā)布時的classes.dex哈希值做比較來判斷客戶端是否被篡改。(2)讀取應(yīng)用安裝目錄下/data/app/xxx.apk中的META-INF目錄下的MANIFEST.MF文件,該文件詳細(xì)記錄了apk包中所有文件的哈希值,因此可以讀取該文件獲取到classes.dex文件對應(yīng)的哈希值,將該值與軟件發(fā)布時的classes.dex哈希值做比較就可以判斷客戶端是否被篡改。為了防止被破解,軟件發(fā)布時的classes.dex哈希值應(yīng)該存放在服務(wù)器端。另外由于逆向c/c++代碼要比逆向Java代碼困難很多,所以關(guān)鍵代碼部位應(yīng)該使用Native
C/C++來編寫。逆向工具對抗對apk進(jìn)行重打包常用的工具是apktool,apktool對于后綴為PNG的文件,會按照PNG格式進(jìn)行處理,如果我們將一個非PNG格式文件的文件后綴改為PNG,再使用apktool重打包則會報錯。以上是使用比較多的幾種保護(hù)方法,單獨使用其中一種效果不大,應(yīng)該綜合運用。調(diào)試器檢測為了防止apk被動態(tài)調(diào)試,可以檢測是否有調(diào)試器連接。在Application類中提供了isDebuggerConnected()方法用于檢測是否有調(diào)試器連接,如果發(fā)現(xiàn)有調(diào)試器連接,可以直接退出程序。加殼保護(hù)使用加殼程序防止apk逆向是一種非常有效的方式,也是一個趨勢。Jack_Jia在《Android
APK加殼技術(shù)方案》一文中詳細(xì)闡述了Android
apk加殼原理以及幾種加殼方案的具體實現(xiàn)。我們可以利用這幾種方案對apk進(jìn)行加殼。不過這種加殼方式是在Java層實現(xiàn)的,被反編譯的風(fēng)險仍然很大。為了克服這個缺點,今后可以研究采用如下思路來進(jìn)行保護(hù):將核心業(yè)務(wù)邏輯代碼放入加密的.jar或者.apk文件中,在需要調(diào)用時使用Native
C/C++代碼進(jìn)行解密,同時完成對解密后文件的完整性校驗。如果需要更加安全的保護(hù)方法,可以考慮對so文件(Native
C/C++代碼編譯得到的文件)進(jìn)行加殼。Android
so加殼主要需要解決兩個問題:(1)對ELF文件加殼;(2)對Android
SO的加載、調(diào)用機制做特殊處理。這將是以后Android應(yīng)用安全研究的一個方向。數(shù)據(jù)安全存儲安全問題關(guān)于數(shù)據(jù)存儲可能出現(xiàn)的問題包括如下幾點:(1)明文存儲敏感數(shù)據(jù),導(dǎo)致直接被攻擊者復(fù)制或篡改。將隱私數(shù)據(jù)明文保存在外部存儲將系統(tǒng)數(shù)據(jù)明文保存在外部存儲將軟件運行時依賴的數(shù)據(jù)保存在外部存儲將軟件安裝包或者二進(jìn)制代碼保存在外部存儲全局可讀寫的內(nèi)部文件存儲(2)不恰當(dāng)存儲登陸憑證,導(dǎo)致攻擊者利用此數(shù)據(jù)竊取網(wǎng)絡(luò)賬戶隱私數(shù)據(jù)。解決方案:對這些數(shù)據(jù)進(jìn)行加密,密碼保存在內(nèi)部存儲,由系統(tǒng)托管或者由用戶使用時輸入。對應(yīng)用配置文件,較安全的方法是保存到內(nèi)部存儲;如果必須存儲到SD卡,則應(yīng)該在每次使用前檢驗它是否被篡改,與預(yù)先保存在內(nèi)部的文件哈希值進(jìn)行比較。應(yīng)用如果需要安裝或加載位于SD卡的任何文件,應(yīng)該先對其完整性做驗證,判斷其與實現(xiàn)保存在內(nèi)部存儲中的(或從服務(wù)器下載來的)哈希值是否一致。如果要跨應(yīng)用進(jìn)行數(shù)據(jù)共享,有種較好的方法是實現(xiàn)一個Content
Provider
組件,提供數(shù)據(jù)的讀寫接口并為讀寫操作分別設(shè)置一個自定義的權(quán)限。對于登錄憑證的存儲,使用基于憑據(jù)而不是密碼的協(xié)議滿足這種資源持久訪問的需求,例如OAuth。傳輸安全問題?
不使用加密傳輸?
使用加密傳輸?shù)雎宰C書驗證環(huán)節(jié)如開發(fā)者在代碼中不檢查服務(wù)器證書的有效性,或選擇接受所有的證書時,這種做法可能會導(dǎo)致中間人攻擊。我們在對敏感數(shù)據(jù)進(jìn)行傳輸時應(yīng)該采用基于SSL/TLS的HTTPS進(jìn)行傳輸。由于移動軟件大多只和固定的服務(wù)器通信,我們可以采用“證書鎖定”(certificate
pinning)方式在代碼更精確地直接驗證服務(wù)器是否擁有某張?zhí)囟ǖ淖C書。組件安全android應(yīng)用內(nèi)部的Activity、Service、Broadcast
Receiver等組件是通過Intent通信的,組件間需要通信就需要在Androidmanifest.xml文件中配置,不恰當(dāng)?shù)慕M件配置則會帶來風(fēng)險。可能產(chǎn)生的風(fēng)險:
(1)惡意調(diào)用(2)惡意接受數(shù)據(jù)(3)仿冒應(yīng)用,例如(惡意釣魚,啟動登錄界面)(4)惡意發(fā)送廣播、啟動應(yīng)用服務(wù)。(5)調(diào)用組件,接受組件返回的數(shù)據(jù)(6)攔截有序廣播解決辦法:
(1)最小化組件暴露
不參與跨應(yīng)用調(diào)用的組件添加android:exported="false"屬性,這個屬性說明它是私有的,只有同一個應(yīng)用程序的組件或帶有相同用戶ID的應(yīng)用程序才能啟動或綁定該服務(wù)。
(2)設(shè)置組件訪問權(quán)限
對參與跨應(yīng)用調(diào)用的組件或者公開的廣播、服務(wù)設(shè)置權(quán)限。只有具有該權(quán)限的組件才能調(diào)用這個組件。
(3)暴露組件的代碼檢查
Android
提供各種API來在運行時檢查、執(zhí)行、授予和撤銷權(quán)限。這些
API
是
android.content.Context
類的一部分,這個類提供有關(guān)應(yīng)用程序環(huán)境的全局信息。另外,Android應(yīng)用也會存在很多傳統(tǒng)web漏洞,比如SQL注入,xss漏洞等,代碼級防止出現(xiàn)這些漏洞的方法與web應(yīng)用防御方法相同。Android系統(tǒng)安全防御操作系統(tǒng)安全問題Android
root問題系統(tǒng)漏洞,補丁更新不及時認(rèn)證機制問題系統(tǒng)安全解決方案權(quán)限管理與隔離對運行在Android系統(tǒng)上的應(yīng)用程序進(jìn)行權(quán)限的細(xì)粒度管理和隔離,防止越權(quán)行為的發(fā)生和濫用權(quán)限獲取敏感數(shù)據(jù)??梢圆捎肕AC(Mandatory
Access
Control)強制訪問控制模型實現(xiàn)。它是一個針對Linux的安全加強系統(tǒng)SELinux中使用的安全模型,即任何進(jìn)程想在SELinux系統(tǒng)中干任何事情,都必須先在安全策略配置文件中賦予權(quán)限。凡是沒有出現(xiàn)在安全策略配置文件中的權(quán)限,進(jìn)程就沒有該權(quán)限。Google在Android
4.4上正式推出了一套以SELinux為基礎(chǔ)的系統(tǒng)安全機制SEAndroid。所以如果我們要定制一個Android系統(tǒng),可以采用具有SEAndroid安全機制的Android
4.4版本。內(nèi)核與應(yīng)用層漏洞防護(hù)增加補丁更新功能,如果發(fā)現(xiàn)漏洞,及時提醒用戶進(jìn)行系統(tǒng)補丁更新。惡意程序檢測與防護(hù)建立一套惡意代碼防護(hù)模型,對運行在Android系統(tǒng)上的惡意程序進(jìn)行檢測,抵御惡意代碼的入侵。數(shù)據(jù)安全存儲與傳輸:結(jié)束語:對Android系統(tǒng)上的數(shù)據(jù)存儲和數(shù)據(jù)傳輸進(jìn)行加密保護(hù),保證終端上數(shù)據(jù)能夠安全地使用。本文介紹了Android平臺上的安全性,包括沙箱、應(yīng)用程序簽名、應(yīng)用程序權(quán)限,以及文件和內(nèi)容提供者權(quán)限。閱讀完這篇介紹性文章之后,您將能夠使用Eclipse手動創(chuàng)建數(shù)字證書,請求應(yīng)用程序權(quán)限,以及允許或不允許應(yīng)用程序訪問文件和內(nèi)容提供者。此外,您還簡要了解了權(quán)限運行時API,這些API允許您在運行時檢查、執(zhí)行、授予和撤銷權(quán)限。參考文獻(xiàn):
[1]羅伯特萊莫斯,android手機安全性成難題[j].麻省理工科技創(chuàng)業(yè),2011(3).
[2]shabtaia,wiessy,kanonovu,etal.andromaly:abehavioralmal-waredetectionframeworkforandroidelligentinformation
systems,2011:7-22.
[3]楊杰,基于linux的強制訪問控制研究[j].電腦與電信,2008(11):48-51.WhatisAndroid?:在AndroidDevelopers網(wǎng)站閱讀此概述性文章。用Eclipse開發(fā)Android應(yīng)用程序(FrankAbleson,developerWorks,2008年2月):在這篇教程中全面了解開發(fā)Android應(yīng)用程序最容易的方法是使用Eclipse。Android開發(fā)簡介(FrankAbleson,developerWorks,2009年5月):獲得對Android平臺的介紹,并學(xué)習(xí)如何編寫基本的Android應(yīng)用程序。X.509Certificates:閱讀X.509標(biāo)準(zhǔn),它定義了哪些信息可以進(jìn)入證書,并描述了如何將之寫下來(數(shù)據(jù)格式)。擴展的權(quán)限:如果您的應(yīng)用程序需要訪問用戶profile的其他部分(可能是私有的),或者需要代表用戶將內(nèi)容發(fā)布到Facebook,那么就為它請求擴展的權(quán)限。SecuringYo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 汽車行業(yè):26年數(shù)據(jù)點評系列之一:乘用車25年復(fù)盤和26年展望:從“量穩(wěn)價緩”到“價升量穩(wěn)”
- 成人司法考試試卷及答案
- 恩施保安考試試題及答案
- 廣西柳州市2026年中考語文三模試卷附答案
- 2025-2026人教版一年級語文上學(xué)期測試
- 2026年四川省高中自主招生考試化學(xué)試卷試題(含答案詳解)
- 2025-2026一年級體育上學(xué)期測試卷
- 商鋪衛(wèi)生間管理制度
- 美發(fā)店門店衛(wèi)生制度
- 社區(qū)衛(wèi)生院五險一金制度
- 2026中俄數(shù)字經(jīng)濟研究中心(廈門市人工智能創(chuàng)新中心)多崗位招聘備考題庫及1套完整答案詳解
- 2026云南保山電力股份有限公司校園招聘50人筆試參考題庫及答案解析
- 《智能網(wǎng)聯(lián)汽車先進(jìn)駕駛輔助技術(shù)》課件 項目1 先進(jìn)駕駛輔助系統(tǒng)的認(rèn)知
- 2024-2025學(xué)年北京清華附中高一(上)期末英語試卷(含答案)
- 引水壓力鋼管制造及安裝工程監(jiān)理實施細(xì)則
- 2025年全行業(yè)薪酬報告
- 輔助生殖項目五年發(fā)展計劃
- (2025年)qc培訓(xùn)考試試題(含答案)
- DBJ50-T-271-2017 城市軌道交通結(jié)構(gòu)檢測監(jiān)測技術(shù)標(biāo)準(zhǔn)
- 2025河南中原再擔(dān)保集團股份有限公司社會招聘9人考試參考題庫及答案解析
- 中醫(yī)醫(yī)院等級評審材料準(zhǔn)備全攻略
評論
0/150
提交評論