天天看點

安卓應用安全指南 4.2.2 建立/使用廣播接收器 規則書

4.2.2 建立/使用廣播接收器 規則書

原書: Android Application Secure Design/Secure Coding Guidebook 譯者: 飛龍 協定: CC BY-NC-SA 4.0

遵循下列規則來發送或接受廣播。

4.2.2.1 僅在應用中使用的廣播接收器必須設定為私有(必需)

僅在應用中使用的廣播接收器應該設定為私有,以避免意外地從其他應用接收任何廣播。 它将防止應用功能濫用或異常行為。

僅在同一應用内使用的接收器,不應設計為設定意圖過濾器。 由于意圖過濾器的特性,即使通過意圖過濾器調用同一應用中的私有接收器,其他應用的公共私有也可能被意外調用。

AndroidManifest.xml(不推薦)

<!-- Private Broadcast Receiver -->
<!-- *** POINT 1 *** Set the exported attribute to false explicitly. -->
<receiver
    android:name=".PrivateReceiver"
    android:exported="false" >
    <intent-filter>
        <action android:name="org.jssec.android.broadcast.MY_ACTION" />
    </intent-filter>
</receiver>           

請參閱“4.2.3.1 導出屬性和意圖過濾器設定的組合(對于接收器)”。

4.2.2.2 小心和安全地處理收到的意圖(必需)

雖然風險因廣播接收器的類型而異,但處理接收到的意圖資料時,首先應該驗證意圖的安全性。 由于公共廣播接收器從未指定的大量應用接收意圖,它可能會收到惡意軟體的攻擊意圖。 私有廣播接收器将永遠不會直接從其他應用接收任何意圖,但公共元件從其他應用接收的意圖資料,可能會轉發到私有廣播接收器。 是以不要認為收到的意圖在沒有任何驗證的情況下,是完全安全的。 内部廣播接收機具有一定程度的風險,是以還需要驗證接收意圖的安全性。

請參考“3.2 小心和安全地處理輸入資料”。

4.2.2.3 驗證簽名權限是否由内部應用定義後,使用内部定義的簽名權限(必需)

隻接收内部應用發送的廣播的内部廣播接收器,應受内部定義的簽名許可保護。

AndroidManifest.xml

中的權限定義/權限請求聲明不足以保護,是以請參閱“5.2.1.2 如何使用内部定義的簽名權限在内部應用之間進行通信”。 通過對

receiverPermission

參數指定内部定義的簽名權限來結束廣播,需要相同的方式的驗證。

4.2.2.4 傳回結果資訊時,清注意來自目标應用的結果資訊洩露(必需)

通過

setResult()

傳回結果資訊的應用的可靠性取決于廣播接收器的類型。 對于公共廣播接收器,目标應用可能是惡意軟體,可能存在惡意使用結果資訊的風險。 對于私有廣播接收器和内部廣播接收器,結果的目的地是内部開發的應用,是以無需介意結果資訊的處理。

如上所述,當從廣播接收器傳回結果資訊時,需要注意從目标應用洩漏的結果資訊。

4.2.2.5 使用廣播發送敏感資訊時,限制能收到的接收器(必需)

廣播是所建立的系統,用于向未指定的大量應用廣播資訊或一次通知其時間。 是以,廣播敏感資訊需要謹慎設計,以防止惡意軟體非法擷取資訊。 對于廣播敏感資訊,隻有可靠的廣播接收器可以接收它,而其他廣播接收器則不能。 以下是廣播發送方法的一些示例。

  • 方法是,通過使用顯式意圖,将廣播僅僅發送給預期的可靠廣播接收器,來固定位址。
    • 當它發送給同一個應用中的廣播接收器時,通過

      Intent#setClass(Context, Class)

      指定位址。 具體代碼,請參閱“4.2.1.1 私有廣播接收器 - 接收/發送廣播”的示例代碼部分。
    • 當它發送到其他應用中的廣播接收器時,通過

      Intent#setClassName(String, String)

      指定位址。 通過比較目标包中 APK 簽名的開發人員密鑰和白名單來發送廣播,來确認允許的應用。 實際上下面的使用隐式意圖的方法更實用。
  • 方法是,通過将

    receiverPermission

    指定為内部定義的簽名權限,并使可靠的廣播接收器聲明使用此簽名權限,來發送廣播。具體代碼請參閱“4.2.1.3 内部廣播接收器 - 接收/發送廣播”的示例代碼部分。 另外,實作這種廣播發送方法,需要應用規則“4.2.2.3 在驗證簽名權限由内部應用定義之後,使用内部定義的簽名權限”。

4.2.2.6 粘性廣播中禁止包含敏感資訊(必需)

通常情況下,廣播由可用的廣播接收器接收後會消失。 另一方面,粘性廣播(以下粘性廣播包括粘性有序廣播)即使由可用的廣播接收器接收也不會從系統中消失,并且能夠由

registerReceiver()

接收。 當粘性廣播變得不必要時,可以随時用

removeStickyBroadcast()

任意删除它。

由于在預設情況下,粘性廣播被隐式意圖使用。 具有指定

receiverPermission

參數的廣播無法發送。 出于這個原因,通過粘性廣播發送的資訊,可以被多個未指定的應用通路 - 包括惡意軟體 - 是以敏感資訊禁止以這種方式發送。 請注意,粘性廣播在 Android 5.0(API Level 21)中已棄用。

4.2.2.7 注意不指定

receiverPermission

的有序廣播無法傳遞(必需)

不指定

receiverPermission

參數的有序廣播,可以由未指定的大量應用接收,包括惡意軟體。 有序廣播用于接收來自接收器的傳回資訊,并使幾個接收器逐一執行處理。 廣播按優先順序發送給接收器。 是以,如果高優先級惡意軟體先接收廣播并執行

abortBroadcast()

,則廣播将不會傳送到後面的接收器。

4.2.2.8 小心并安全地處理來自廣播接收器的傳回的結果資料(必需)

基本上,考慮到接收結果可能是攻擊資料,結果資料應該被安全地處理,盡管風險取決于傳回結果資料的廣播接收器的類型。

當發送方(源)廣播接收器是公共廣播接收器時,它從未指定的大量應用接收傳回資料。 是以它也可能會收到惡意軟體的攻擊資料。 當發送方(源)廣播接收器是私有廣播接收者時,似乎沒有風險。 然而,其他應用接收的資料可能會間接作為結果資料轉發。 是以,如果沒有任何驗證,結果資料不應該被認為是安全的。 當發送方(源)廣播接收器是内部廣播接收器時,它具有一定程度的風險。 是以,考慮到結果資料可能是攻擊資料,應該以安全的方式處理它。

4.2.2.9 提供二手素材時,素材應該以相同保護級别提供(必需)

當由權限保護的資訊或功能素材被二次提供給其他應用時,有必要通過聲明與目标應用相同的權限來維持保護标準。 在 Android 權限安全模型中,權限僅管理來自應用的受保護素材的直接通路。 由于這些特點,所得素材可能會被提供給其他應用,而無需聲明保護所需的權限。 這實際上與重新授權相同,因為它被稱為重新授權問題。 請參閱“5.2.3.4 重新授權問題”。

繼續閱讀