Trasmissioni persistenti

Categoria OWASP: MASVS-PLATFORM: Interazione con la piattaforma

Panoramica

Le app per Android e il sistema Android possono utilizzare le trasmissioni come sistema di messaggistica per notificare ad altre app gli eventi che potrebbero interessare. Le pubblicità permanenti sono un tipo speciale di annunci per i quali gli oggetti intent inviati rimangono nella cache al termine della pubblicazione. Il sistema potrebbe ritrasmettere gli intenti permanenti alle registrazioni successive dei ricevitori. Purtroppo, l'API di trasmissione fissa presenta una serie di carenze legate alla sicurezza, motivo per cui è stata ritirata in Android 5.0 (livello API 21).

Chiunque può accedere alle trasmissioni fisse

Le trasmissioni fisse non possono essere limitate ai destinatari che dispongono di determinate autorizzazioni. Pertanto, non sono adatti alla trasmissione di informazioni sensibili. Potrebbe essere allettante pensare che la specifica del nome del pacchetto dell'applicazione nella trasmissione Intent limiti l'insieme di 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);

Nell'esempio, solo i ricevitori nel pacchetto com.example.myapp ricevono l'intent quando viene inviata la trasmissione. Tuttavia, il filtro del nome del pacchetto non viene applicato quando l'intent viene ritrasmesso dalla cache appiccicosa. Quando registri un ricevitore utilizzando il metodo registerReceiver(), tutti gli intent nella cache appiccicosa che corrispondono al filtro specificato vengono ritrasmessi al ricevitore, indipendentemente dal nome del pacchetto in cui risiede il ricevitore.

Chiunque può inviare trasmissioni in primo piano

Per inviare annunci permanenti, un'app richiede solo l'autorizzazione android.permission.BROADCAST_STICKY, che viene concessa automaticamente al momento dell'installazione dell'app. Pertanto, gli utenti malintenzionati possono inviare qualsiasi intent a qualsiasi destinatario, ottenendo potenzialmente l'accesso non autorizzato a un'altra app. I destinatari di trasmissione possono limitare i mittenti a coloro che detengono una determinata autorizzazione. Tuttavia, in questo modo il destinatario non può ricevere le trasmissioni dalla cache appiccicosa perché non vengono inviate nel contesto dell'identità di nessuna app e non vengono trasmesse con autorizzazioni.

Chiunque può modificare le trasmissioni in primo piano

Quando un'intenzione fa parte di una trasmissione fissa, sostituisce qualsiasi istanza precedente con la stessa azione, gli stessi dati, lo stesso tipo, lo stesso identificatore, la stessa classe e le stesse categorie nella cache fissa. Pertanto, un malintenzionato può sovrascrivere facilmente i dati aggiuntivi in un'intent persistente di un'app legittima, che potrebbero poi essere ritrasmessi ad altri ricevitori.

Le trasmissioni inviate utilizzando il metodo sendStickyOrderedBroadcast() vengono recapitate a un destinatario alla volta per consentire ai destinatari con priorità più elevata di utilizzare la trasmissione prima che venga recapitata ai destinatari con priorità inferiore. Quando ogni ricevente viene eseguito a turno, può propagare un risultato al ricevente successivo, ad esempio chiamando setResultData(), oppure può interrompere la trasmissione, impedendo ai riceventi successivi di riceverla. Un malintenzionato che può ricevere broadcast ordinati permanenti da un'app legittima può creare un destinatario ad alta priorità per alterare i dati dei risultati del broadcast o interrompere completamente i broadcast.

Impatto

L'impatto varia a seconda del modo in cui vengono utilizzate le trasmissioni fisse e dei dati trasmessi ai relativi ricevitori. In generale, l'utilizzo di trasmissioni permanenti può comportare l'esposizione di dati sensibili, la manomissione dei dati, l'accesso non autorizzato per eseguire il comportamento in un'altra app e il rifiuto di servizio.

Mitigazioni

Le trasmissioni fisse non devono essere utilizzate. Il pattern consigliato è utilizzare le trasmissioni non permanenti con un altro meccanismo, ad esempio un database locale, per recuperare il valore corrente in qualsiasi momento.

Gli sviluppatori possono controllare chi può ricevere le trasmissioni non permanenti utilizzando le autorizzazioni o impostando il nome del pacchetto dell'applicazione nell'intent. Inoltre, se una trasmissione non deve essere inviata a componenti esterni a un'app, utilizza LiveData, che implementa il pattern di osservatore.

Puoi trovare ulteriori informazioni sulla protezione delle trasmissioni nella pagina Panoramica delle trasmissioni.