全面理解 Android 安全機制(元件安全)

發表於2015-09-01

本片部落格主要跟大家談談 Android 基本元件的安全問題。

每個元件都可在 AndroidManifest.xml 裡通過屬性 exported 被設定為私有或公有。私有或公有的預設設定取決於此元件是否被外部使用;例如某元件設定了 intent-filter 意味著該元件可以接收 intent,可以吧被其他應用訪問,則預設的 exported 屬性為 true(沒有 filter 只能通過明確的類名來啟動activity故相當於只有程式本身能啟動),反之為 false(意味著此元件只能由自身的 app (同 userid 或 root也行)啟動)。需要注意的是 ContentProvider 預設為 true,畢竟是共享資料的元件。

公有元件能被任何應用程式的任何元件所訪問。這是非常有必要的,如 MainActivity 通常是公有的,方便 應用啟動;然而大多陣列件需要對其加以限制,下面我們針對不同元件來討論。

Activity安全

私有元件此時Activity只能被自身app啟動。(同user id或者root也能啟動)

私有 Activity 不能被其他應用啟動相對安全。

建立 Activity時:

1、不指定 taskAffinity //task 管理 Activity。task 的名字取決於根 Activity的 affinity。預設設定中 Activity 使用包名做為 affinity。task 由 app 分配,所以一個應用的 Activity 在預設情況下屬於相同 task。跨 task 啟動 Activity 的 intent 有可能被其他 app 讀取到。

2、不指定 lanchMode //預設 standard,建議使用預設。建立新 task 時有可能被其他應用讀取 intent的內容。

3、設定 exported 屬性為false

4、謹慎處理從 intent 中接收的資料,不管是否內部傳送的 intent

5、敏感資訊只能在應用內部操作

使用 Activity時:

6、開啟 Activity 時不設定 FLAG_ACTIVITY_NEW_TASK 標籤 //FLAG_ACTIVITY_NEW_TASK 標籤用於建立新 task(被啟動的 Activity 並未在棧中)。

7、開啟應用內部 Activity 使用顯示啟動的方式

8、當 putExtra() 包含敏感資訊目的應是 app 內的 Activity

9、謹慎處理返回資料,即可資料來自相同應用

公開暴露的 Activity 元件,可以被任意應用啟動:

建立 Activity:

1、設定 exported 屬性為 true

2、謹慎處理接收的 intent

3、有返回資料時不應包含敏感資訊

使用 Activity:

4、不應傳送敏感資訊

5、當收到返回資料時謹慎處理

More information about Secure Activity

Service 安全

通常 Service 執行的操作比較敏感,如更新資料庫,提供事件通知等,因此一定要確保訪問 Service 的元件有一定許可權(也就是給 Service 設定許可權)。

  1. 在 AndroidManifest.xml 裡給 Service 設定許可權(可自定義)。
  2. 一般設定 exported 屬性為 false(或沒有 intent-filter);如果需要給別的 app 訪問即此屬性設定為 true,最好做敏感操作的時候通過 checkCallingPermission() 方法來提供許可權檢測。
  3. 不要輕易把 Intent 傳遞給公有的未知名的 Service;最好在所傳遞的 Intent 中提供完整類名,或者在 ServiceConnection 的 onServiceConnected(ComponentName, Ibinder) 裡檢驗 Service 的包名。

Content Provider 安全

Content Provider 為其他不同應用程式提供資料訪問方式,需要更復雜的安全措施保護。

  1. 讀寫許可權分開。一旦應用程式來訪,Content Provider 需要對許可權檢測,只有擁有隻讀/只寫許可權才允許建立連線,否則丟擲 SecurityException。
  2. 只讀/只寫一旦實施就適用於所有資料,如果播放器只要特定音樂資料,給播放器全部訪問許可權,豈不是許可權很大,為了細分許可權粒度,可以使用 Grant-uri-permission 機制來指定一個資料集。Content Provider 可通過屬性 <grant-uri-permission> 為其內的 URI 設定臨時訪問許可權。

Broadcast Receiver 安全

應用通常用它來監聽廣播訊息。

  1. 廣播傳送方通常選擇給每個傳送 Broadcast Intent 授予 Android 許可權;接收方不但需要符合 Intent filter 的接收條件,還要求 Broadcast Receiver 也必須具有特定許可權(給傳送方授予許可權要一致)才能接收(雙層過濾)。

部分參考自 Android安全機制解析與應用實踐

相關文章