Android組件安全

Android組件安全

做過Android開發的攻城獅都知道Android四大組件,在開發過程中打交道最多的也是這四大組件,在開發Android應用的過程中我們最基本的要求是要對這四大組件有一個清晰的認識,包括組件的功能特性、生命週期、與系統的交互模型,以及組件之間如何配合使用等等。本文內容主要是關於組件的安全模型以及如何正確的使用組件來降低應用的安全風險的一個學習筆記。

一、Android四大組件簡介

1. Service組件

Service是沒有界面且能長時間運行於後臺的應用組件,是Android中實現程序後臺運行的解決方案,非常適合用於去執行那些不需要和用戶交互而且還要求長期運行的任務。這也是爲了不阻塞主進程,然而主進程依然能夠流暢的處理UI事件,提供良好的用戶體驗。

根據Service的生命週期不同又分爲兩種類型:

(1)start類型:應用程序組件(如activity)調用startService()方法啓動服務時,服務處於started狀態
(2)bound類型:組件調用bindService()方法綁定到服務時,服務處於bound狀態

兩者的區別:調用startService()啓動的Service其生命週期與啓動它的組件無關,調用bindService()啓動的Service會在啓動它的組件消亡後消亡

1.1 Service安全

關於Service安全規範請參照博客:http://www.droidsec.cn/android-service-security/

2. Activity組件

Activity是一個Android應用程序和用戶進行交互界面的Android組件,相當於應用程序的一個交互屏幕,Activity之間通過Intent進行通信。下圖是Activity的生命週期變遷圖

2.1 Activity生命週期

onCreate : Activity被創建時調用,是生命週期第一個被調用的方法

onStart :表示Activity正在啓動,還沒有到達可見、交互的地步

onResume :表示Activity已在前臺可見,可與用戶交互

onPause : 表示Activity正在停止

onStop : 一般在onPause方法執行完成直接執行,表示Activity即將停止或者完全被覆蓋,此時Activity不可見,僅在後臺運行

onRestart :表示Activity正在重新啓動,當Activity由不可見變爲可見狀態時,該方法被回調

onDestroy :此時Activity正在被銷燬,也是生命週期最後一個執行的方法,一般我們可以在此方法中做一些回收工作和最終的資源釋放。

2.2 Activity組件的加載模式

  • standard模式:無論Activity棧中是否存在改Activity實例,系統都將創建一個實例
  • singleTop模式:如果目標activity的實例已經存在於棧頂,系統會直接使用該實例,不會重新創建,否則會創建一個實例,入棧
  • singleTask模式:在同一應用程序中,如果目標activity的實例已經存在於棧頂,系統會直接使用該實例,不會重新創建,否則彈出棧頂實例,直到使目標activity位於棧頂,在不同應用程序中啓動Activity時,會創建一個新的task棧,用於保存被啓動的Activity實例
  • singleInstance模式:只有一個實例,並且這個實例獨立運行在一個task棧中,這個task只有這個實例,不允許有別的Activity存在

2.2 Activity組件權限

Activity權限的使用主要用於從其他應用中調用該應用的Activity進行一些操作,比如第三方登錄:進行權限的設置後可以調用該應用中的Activity進行操作。下圖是權限的格式定義:

android:protectionLevel 一共有四種
  • normal:表示權限是低風險的,不會對系統、用戶或其他應用程序造成危害

  • dangerous:比normal級別要高一等級,可能會賦予應用程序訪問敏感數據或控制設備等功能

  • signature:表示只有當應用程序所用數字簽名與聲明該權限的應用程序所用數字簽名相同時,才能將權限授給它

  • signatureOrSystem :表示將權限授給具有相同數字簽名的應用程序或android 系統映像/系統app。這一保護級別適和於非常特殊的情況,比如多個供應商需要通過系統映像共享功能時

2.2 exported屬性

一個Activity組件能否被外部應用啓動取決於此屬性,設置爲true時Activity可以被外部應用啓動,設置爲false則不能,此時Activity只能被自身app啓動。(同user id或者root也能啓動)

沒有配置intent-filter屬性exported默認爲false(沒有filter只能通過明確的類名來啓動activity故相當於只有程序本身能啓動),配置了intent-filter屬性exported默認爲true。

exported屬性只是用於限制Activity是否暴露給其他app,通過配置文件中的權限申明也可以限制外部啓動activity。

2.3 activity的聲明

<activity
        android:name="Activity"
        android:label="@string/title_activity"
        android:permission="packagename.permission.Activity"
        >
        <intent-filter>
            <category android:name="android.intent.category.DEFAULT"/>
            <action android:name="packagename.intent.action.Activity"/>
        </intent-filter>
    </activity>

配置了intent-filter屬性,則exported爲true,說明別的應用程序可以在外部啓動該Activity,可根據action的name發起隱式intent,啓動聲明瞭該action的Activity

2.4 activity的分類

2.4.1 private activity

私有Activity不應被其他應用啓動相對是安全的
關於private activity的使用和設置規範請參照:http://www.bugsec.org/7195.html

2.4.2 public activity

公開暴露的Activity組件,可以被任意應用啓動
關於public activity的使用和設置規範請參照:http://www.bugsec.org/7195.html

3. Broadcast Recevier組件

Broadcast Recevier 廣播接收器是一個專注於接收廣播通知信息,並做出對應處理的組件,廣播機制是一個典型的發佈—訂閱模式,即觀察者模式。 廣播接收器沒有用戶界面。然而,它們可以啓動一個activity來響應它們收到的信息,或者用NotificationManager來通知用戶。通知可以用很多種方式來吸引用戶的注意力──閃動背燈、震動、播放聲音等等。一般來說是在狀態欄上放一個持久的圖標,用戶可以打開它並獲取消息。

3.1 廣播註冊形式

靜態註冊:

靜態註冊是在AndroidManifest.xml中聲明廣播註冊,直接在Manifest.xml文件的節點中配置廣播接收者。

<receiver android:name=".MyBroadCastReceiver">  
        <!-- android:priority屬性是設置此接收者的優先級(從-1000到1000) -->
        <intent-filter android:priority="20">
        <actionandroid:name="android.provider.Telephony.SMS_RECEIVED"/>  
        </intent-filter>  
</receiver>

還要在同級的位置配置可能使用到的權限

<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>

動態註冊:

通過使用代碼進行註冊

區別:

  • 第一種是常駐型,也就是說當應用程序關閉後,如果有信息廣播來,程序也會被系統調用自動運行

  • 第二種是非常駐型廣播,也就是說廣播跟隨程序的生命週期

關於Broadcast Recevier安全編碼規範,參照:http://www.droidsec.cn/android-broadcast-security/

3. Content Provider組件

爲存儲和獲取數據提供統一的接口,可以在不同的應用程序之間共享數據。使用ContentProvider,應用程序可以實現數據共享,android內置的許多數據都是使用ContentProvider形式,供開發者調用的(如視頻,音頻,圖片,通訊錄等)

關於Content Provider組件的安全問題,參照:http://blog.csdn.net/alimobilesecurity/article/details/51564968

參考博文

http://www.cnblogs.com/smyhvae/p/4070518.html

http://blog.csdn.net/javazejian/article/details/51932554

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章