Compromissione di intenti impliciti

Categoria OWASP: MASVS-PLATFORM: interazione con la piattaforma

Panoramica

La vulnerabilità di pirateria dell'intent implicito si verifica quando un'applicazione non specifica un nome di classe o un pacchetto del componente completamente qualificato quando richiama un intent. In questo modo, un'applicazione dannosa può registrare un filtro per intent per intercettare l'intent anziché l'applicazione prevista.

A seconda dei contenuti dell'intent, gli utenti malintenzionati potrebbero leggere o modificare informazioni sensibili o interagire con oggetti mutabili, ad esempio PendingIntent o Binder mutabili.

Il furto di un'intenzione implicita può anche consentire a un malintenzionato di eseguire azioni arbitrarie come il lancio di componenti controllati dall'utente malintenzionato.

Impatto

Se un'intent implicita che gestisce dati sensibili passa un token di sessione all'interno di una stringa URL aggiuntiva per aprire un WebView, qualsiasi applicazione che specifica i filtri per intent appropriati può leggere questo token. Ciò può consentire a qualsiasi applicazione configurata correttamente sul dispositivo di intercettare l'intent e leggere i dati sensibili al suo interno, consentendo agli attaccanti di esfiltrare dati come PII o token di sessione.

Mitigazioni

A meno che l'applicazione non lo richieda, esplicita gli intent chiamando setPackage(). In questo modo, l'intent può essere interpretato solo da un componente specifico (in-app o di altre applicazioni), impedendo alle applicazioni non attendibili di intercettare i dati inviati insieme all'intent. Lo snippet riportato di seguito mostra come rendere esplicito un'intenzione:

Kotlin

val intent = Intent("android.intent.action.CREATE_DOCUMENT").apply {
    addCategory("android.intent.category.OPENABLE")
    setPackage("com.some.packagename")
    setType("*/*")
    putExtra("android.intent.extra.LOCAL_ONLY", true)
    putExtra("android.intent.extra.TITLE", "Some Title")
}
startActivity(intent)

Java

Intent intent = new Intent("android.intent.action.CREATE_DOCUMENT");
intent.addCategory("android.intent.category.OPENABLE");
intent.setPackage("com.some.packagename");
intent.setType("*/*");
intent.putExtra("android.intent.extra.LOCAL_ONLY", true);
intent.putExtra("android.intent.extra.TITLE", "Some Title");
startActivity(intent);

Se devi utilizzare intent impliciti, ometti le informazioni sensibili o gli oggetti mutevoli che non vuoi esporre. È necessario utilizzare intent impliciti quando un'app non sa esattamente quale app risolverà l'azione (ad es. scrivere un'email, scattare una foto e così via).

Risorse