Trasmissioni persistenti

Categoria OWASP: MASVS-PLATFORM: Platform Interaction

Panoramica

Le app per Android e il sistema Android possono utilizzare le trasmissioni come sistema di messaggistica per notificare ad altre app eventi che potrebbero interessarle. Gli annunci permanenti sono un tipo speciale di annuncio per cui gli intent inviati rimangono nella cache al termine dell'annuncio. Il sistema potrebbe ritrasmettere gli intent permanenti alle registrazioni successive dei ricevitori. Purtroppo, l'API per le trasmissioni permanenti presenta una serie di carenze relative alla sicurezza, motivo per cui è stata ritirata in Android 5.0 (livello API 21).

Chiunque può accedere alle trasmissioni in evidenza

Le trasmissioni permanenti 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 specificare il 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 inviato il broadcast. Tuttavia, il filtro del nome del pacchetto non viene applicato quando l'intent viene ritrasmesso dalla cache permanente. Quando registri un ricevitore utilizzando il metodo registerReceiver(), tutti gli intent nella cache permanente che corrispondono al filtro specificato vengono ritrasmessi al ricevitore indipendentemente dal nome del pacchetto in cui si trova il ricevitore.

Chiunque può inviare trasmissioni in evidenza

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 autori di attacchi possono inviare qualsiasi intent a qualsiasi destinatario, ottenendo potenzialmente l'accesso non autorizzato a un'altra app. I ricevitori di trasmissioni possono limitare i mittenti a quelli in possesso di una determinata autorizzazione. Tuttavia, in questo modo il destinatario non può ricevere trasmissioni dalla cache permanente perché non vengono inviate nel contesto dell'identità di alcuna app e non vengono trasmesse con alcuna autorizzazione.

Chiunque può modificare le trasmissioni in evidenza

Quando un intent fa parte di una trasmissione permanente, 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 permanente. Pertanto, un malintenzionato può sovrascrivere facilmente i dati aggiuntivi in un intent permanente di un'app legittima, che potrebbe poi essere ritrasmesso ad altri destinatari.

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

Impatto

L'impatto varia a seconda di come vengono utilizzate le trasmissioni permanenti e di quali dati vengono trasmessi ai ricevitori di trasmissione. In generale, l'utilizzo di trasmissioni permanenti può comportare l'esposizione di dati sensibili, la manomissione dei dati, l'accesso non autorizzato per eseguire comportamenti in un'altra app e il denial of service.

Mitigazioni

Le trasmissioni in evidenza non devono essere utilizzate. Il pattern consigliato è quello di utilizzare trasmissioni non permanenti con un altro meccanismo, ad esempio un database locale, per recuperare il valore corrente ogni volta che vuoi.

Gli sviluppatori possono controllare chi può ricevere 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 Observer.

Per ulteriori informazioni sulla protezione delle trasmissioni, consulta la pagina Panoramica delle trasmissioni.