固定式廣播訊息

透過集合功能整理內容 你可以依據偏好儲存及分類內容。

總覽

Android 應用程式和 Android 系統可以使用廣播訊息做為通訊系統,通知其他應用程式其可能感興趣的事件。「固定式廣播訊息」是一種特殊類型的廣播訊息,系統會在訊息播送完成後,將已傳送的意圖物件保留在快取中。系統可能會將固定式意圖重新播送給日後註冊的接收器。遺憾的是,固定式廣播訊息 API 受到許多安全性相關缺點的影響,因此在 Android 5.0 (API 級別 21) 中已遭淘汰。

任何人皆可存取固定式廣播訊息

系統無法針對擁有特定權限的接收器限制播送固定式廣播訊息,因此這類訊息不適合用於播送機密資訊。您可能會以為在廣播訊息 Intent 中指定應用程式套件名稱,就能限制 BroadcastReceivers 的組合:

Kotlin

val intent = Intent("com.example.NOTIFY").apply {
    setPackage("com.example.myapp")
}
applicationContext.sendBroadcast(intent)

Java

Intent intent = new Intent("com.example.NOTIFY");
intent.setPackage("com.example.myapp");
getApplicationContext().sendBroadcast(intent);

在此範例中,只有 com.example.myapp 套件中的接收器,才能在廣播訊息傳送時收到意圖。然而,如果是從固定式快取重新播送 Intent,系統就不會套用套件名稱篩選器。使用 registerReceiver() 方法註冊接收器時,無論接收器所在的套件為何,系統都會重新播送固定式快取中符合指定篩選器的所有意圖。

任何人皆可傳送固定式廣播訊息

如要傳送固定式廣播訊息,應用程式只需要 android.permission.BROADCAST_STICKY 權限,系統會在安裝應用程式時自動授予這項權限。因此,攻擊者可以傳送任何意圖給任何接收器,進而在未經授權的情況下取得其他應用程式的存取權。廣播接收器可將傳送者限定為擁有特定權限的傳送者。不過這樣一來,該接收器就無法接收來自固定式快取的廣播訊息,因為這類訊息不會在任何應用程式的識別環境中傳送,也不會使用任何權限播送。

任何人皆可修改固定式廣播訊息

當固定式廣播訊息內含意圖時,該意圖會取代任何在固定式快取中具有相同動作、資料、類型、ID、類別和分類的先前執行個體。因此,攻擊者可以從合法的應用程式中,以固定式意圖輕易覆寫額外資料,這樣可能會讓系統將訊息重新播送給其他接收器。

使用 sendStickyOrderedBroadcast() 方法傳送的廣播訊息一次會傳送給一個接收器,讓優先順序較高的接收器先行使用廣播訊息,再傳送給優先順序較低的接收器。 由於每個接收器會按順序執行,因此可將結果傳播至下一個接收器 (例如透過呼叫 setResultData()),或者取消播送,防止後續的接收器接收廣播訊息。如果攻擊者能透過合法應用程式接收固定順序的廣播訊息,可能會建立高優先順序的接收器,藉此竄改廣播訊息的結果資料或完全停止播送。

影響

影響程度取決於固定式廣播訊息的使用方式,以及要將哪些資料傳遞給廣播接收器。一般來說,使用固定式廣播訊息可能導致機密資料外洩、資料竄改、在未經授權情況下存取其他應用程式的執行行為,以及阻斷服務。

因應措施

請勿使用固定式廣播訊息。建議您搭配本機資料庫等其他機制使用非固定式廣播訊息,視需要擷取目前的值。

開發人員可以透過權限,或是在意圖上設定應用程式套件名稱,控制誰可以接收非固定式廣播訊息。此外,如果不需要將廣播訊息傳送給應用程式以外的元件,請使用會執行觀測器模式LiveData

如要進一步瞭解如何保護廣播訊息,請參閱「廣播總覽」頁面。