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
- Elemento intent-filter del manifest
- Elenco consentito delle autorizzazioni privilegiate
- Intent e filtri per intent
- Forcing chooser per gli intent impliciti
- Intent impliciti comuni