Categoria do OWASP: MASVS-PLATFORM - Interação com plataformas
Visão geral
A vulnerabilidade de invasão de intent implícita ocorre quando um aplicativo não especifica um nome de classe de componente totalmente qualificado ou um pacote ao invocar uma intent. Isso permite que um aplicativo malicioso registre um filtro de intent para interceptar a intent, em vez do aplicativo pretendido.
Dependendo do conteúdo da intent, os invasores podem ler ou modificar informações sensíveis ou interagir com objetos mutáveis, como PendingIntents mutáveis ou Binders.
A invasão de uma intent implícita também pode permitir que um invasor execute ações arbitrárias, como iniciar componentes controlados por ele.
Impacto
Se uma intent implícita que processa dados sensíveis passar um token de sessão em uma string de URL extra para abrir uma WebView, qualquer aplicativo que especifique os filtros de intent adequados poderá ler esse token. Isso permite que qualquer aplicativo configurado corretamente no dispositivo intercepte a intent e leia os dados sensíveis nela, permitindo que os invasores extraiam dados, como PII ou tokens de sessão.
Mitigações
A menos que o aplicativo exija, torne as intents explícitas chamando setPackage(). Isso permite que a intent seja interpretada apenas por um componente específico (no app ou de outros aplicativos), impedindo que aplicativos não confiáveis interceptem os dados enviados com a intent. O snippet a seguir mostra como tornar uma intent explícita:
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 você precisar usar intents implícitas, omita as informações sensíveis ou os objetos mutáveis que não quiser expor. Pode ser necessário usar intents implícitas quando um app não tiver conhecimento exato sobre qual aplicativo vai resolver a ação (por exemplo, escrever um e-mail, tirar uma foto etc.).
Recursos
- Elemento do filtro de intent do manifesto
- Lista de permissões privilegiadas
- Intents e filtros de intents
- Como forçar o seletor para intents implícitas
- Intents implícitas comuns