Invasão de intent implícita

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