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 使用廣播發送敏感資訊時,限制能收到的接收器(必需)
廣播是所建立的系統,用于向未指定的大量應用廣播資訊或一次通知其時間。 是以,廣播敏感資訊需要謹慎設計,以防止惡意軟體非法擷取資訊。 對于廣播敏感資訊,隻有可靠的廣播接收器可以接收它,而其他廣播接收器則不能。 以下是廣播發送方法的一些示例。
- 方法是,通過使用顯式意圖,将廣播僅僅發送給預期的可靠廣播接收器,來固定位址。
- 當它發送給同一個應用中的廣播接收器時,通過
指定位址。 具體代碼,請參閱“4.2.1.1 私有廣播接收器 - 接收/發送廣播”的示例代碼部分。Intent#setClass(Context, Class)
- 當它發送到其他應用中的廣播接收器時,通過
指定位址。 通過比較目标包中 APK 簽名的開發人員密鑰和白名單來發送廣播,來确認允許的應用。 實際上下面的使用隐式意圖的方法更實用。Intent#setClassName(String, String)
- 當它發送給同一個應用中的廣播接收器時,通過
- 方法是,通過将
指定為内部定義的簽名權限,并使可靠的廣播接收器聲明使用此簽名權限,來發送廣播。具體代碼請參閱“4.2.1.3 内部廣播接收器 - 接收/發送廣播”的示例代碼部分。 另外,實作這種廣播發送方法,需要應用規則“4.2.2.3 在驗證簽名權限由内部應用定義之後,使用内部定義的簽名權限”。receiverPermission
4.2.2.6 粘性廣播中禁止包含敏感資訊(必需)
通常情況下,廣播由可用的廣播接收器接收後會消失。 另一方面,粘性廣播(以下粘性廣播包括粘性有序廣播)即使由可用的廣播接收器接收也不會從系統中消失,并且能夠由
registerReceiver()
接收。 當粘性廣播變得不必要時,可以随時用
removeStickyBroadcast()
任意删除它。
由于在預設情況下,粘性廣播被隐式意圖使用。 具有指定
receiverPermission
參數的廣播無法發送。 出于這個原因,通過粘性廣播發送的資訊,可以被多個未指定的應用通路 - 包括惡意軟體 - 是以敏感資訊禁止以這種方式發送。 請注意,粘性廣播在 Android 5.0(API Level 21)中已棄用。
4.2.2.7 注意不指定 receiverPermission
的有序廣播無法傳遞(必需)
receiverPermission
不指定
receiverPermission
參數的有序廣播,可以由未指定的大量應用接收,包括惡意軟體。 有序廣播用于接收來自接收器的傳回資訊,并使幾個接收器逐一執行處理。 廣播按優先順序發送給接收器。 是以,如果高優先級惡意軟體先接收廣播并執行
abortBroadcast()
,則廣播将不會傳送到後面的接收器。
4.2.2.8 小心并安全地處理來自廣播接收器的傳回的結果資料(必需)
基本上,考慮到接收結果可能是攻擊資料,結果資料應該被安全地處理,盡管風險取決于傳回結果資料的廣播接收器的類型。
當發送方(源)廣播接收器是公共廣播接收器時,它從未指定的大量應用接收傳回資料。 是以它也可能會收到惡意軟體的攻擊資料。 當發送方(源)廣播接收器是私有廣播接收者時,似乎沒有風險。 然而,其他應用接收的資料可能會間接作為結果資料轉發。 是以,如果沒有任何驗證,結果資料不應該被認為是安全的。 當發送方(源)廣播接收器是内部廣播接收器時,它具有一定程度的風險。 是以,考慮到結果資料可能是攻擊資料,應該以安全的方式處理它。
4.2.2.9 提供二手素材時,素材應該以相同保護級别提供(必需)
當由權限保護的資訊或功能素材被二次提供給其他應用時,有必要通過聲明與目标應用相同的權限來維持保護标準。 在 Android 權限安全模型中,權限僅管理來自應用的受保護素材的直接通路。 由于這些特點,所得素材可能會被提供給其他應用,而無需聲明保護所需的權限。 這實際上與重新授權相同,因為它被稱為重新授權問題。 請參閱“5.2.3.4 重新授權問題”。