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 ou pacote totalmente qualificado 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 realize ações arbitrárias, como iniciar componentes controlados por invasores.
Impacto
Se uma intent implícita que processa dados sensíveis transmitir 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, permitindo que invasores exfiltrem 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 em outros apps), impedindo que apps 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