Compromissione di intenti impliciti

Categoria OWASP: MASVS-PLATFORM: Platform Interaction

Panoramica

La vulnerabilità di hijacking dell'intent implicito si verifica quando un'applicazione non specifica un nome di classe o un pacchetto di componenti completo quando richiama un intent. Ciò consente a un'applicazione dannosa di registrare un filtro per intent per intercettare l'intent anziché l'applicazione prevista.

A seconda dei contenuti dell'intent, gli autori di attacchi potrebbero leggere o modificare informazioni sensibili o interagire con oggetti modificabili, come PendingIntent o Binder.

Il dirottamento di un intent implicito può anche consentire a un malintenzionato di eseguire azioni arbitrarie, ad esempio avviare componenti controllati dall'attaccante.

Impatto

Se un intent implicito che gestisce dati sensibili trasmette un token di sessione all'interno di una stringa URL extra per aprire una 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 autori degli attacchi di estrarre dati come PII o token di sessione.

Mitigazioni

A meno che l'applicazione non lo richieda, rendi espliciti gli intent chiamando setPackage(). Ciò consente all'intent di essere interpretato solo da un componente specifico (all'interno dell'app o da altre applicazioni), impedendo alle applicazioni non attendibili di intercettare i dati inviati insieme all'intent. Lo snippet seguente mostra come rendere esplicito un intent:

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 informazioni sensibili o oggetti modificabili che non vuoi esporre. Potrebbe essere necessario utilizzare intent impliciti quando un'app non sa esattamente quale app risolverà l'azione (ad es. comporre un'email, scattare una foto e così via).

Risorse