Tapjacking

Categoria do OWASP: MASVS-PLATFORM - Interação com plataformas

Visão geral

Tapjacking é o equivalente no app Android da vulnerabilidade de cliques da Web (link em inglês): um app malicioso engana o usuário para que ele clique em um controle relevante para a segurança (botão de confirmação etc.) ao ocultar a interface com uma sobreposição ou por outros meios. Nesta página, diferenciamos duas variantes de ataque: a oclusão completa e a parcial. Na oclusão completa, o invasor se sobrepõe à área de toque; na oclusão parcial, a área de toque permanece desobstruída.

Impacto

Ataques de hacker são usados para induzir os usuários a executar determinadas ações. O impacto depende da ação desejada pelo invasor.

Risco: oclusão completa

Na oclusão completa, o invasor se sobrepõe à área de toque para invadir o evento de toque:

Imagem de oclusão completa

Mitigações

Para evitar a oclusão completa, defina View.setFilterTouchesWhenObscured(true) no código. Isso bloqueia toques transmitidos por uma sobreposição. Caso prefira uma abordagem declarativa, também é possível adicionar android:filterTouchesWhenObscured="true" ao arquivo de layout do objeto View que você quer proteger.


Risco: oclusão parcial

Em ataques de oclusão parcial, a área de toque permanece desobstruída:

Imagem de oclusão parcial

Mitigações

Para reduzir a oclusão parcial, ignore manualmente os eventos de toque que têm a flag FLAG_WINDOW_IS_PARTIALLY_OBSCURED. Não há proteções padrão nesse cenário.

Android 14 e accessibilityDataSensitive: no Android 14 (nível 34 da API) e versões mais recentes, use a flag accessibilityDataSensitive para proteger dados sensíveis contra serviços de acessibilidade maliciosos. Quando você define essa flag em visualizações sensíveis, como telas de login ou de confirmação de transação, apenas os serviços que declaram android:isAccessibilityTool="true" podem ler os dados da visualização ou realizar ações de acessibilidade nela. No Android 16 (nível 36 da API) e versões mais recentes, o accessibilityDataSensitive também bloqueia gestos de toque simulados injetados com AccessibilityService.dispatchGesture por serviços que não declaram android:isAccessibilityTool="true". Isso oferece proteção no nível do sistema contra ataques de interceptação e ataques de injeção de cliques, que são característicos de cenários de oclusão parcial. É possível ativar implicitamente o accessibilityDataSensitive especificando android:filterTouchesWhenObscured="true" nos arquivos de layout.


Riscos específicos

Esta seção reúne riscos que exigem estratégias de mitigação não padrão ou que foram mitigados em determinados níveis do SDK e estão aqui para referência.

Risco: android.Manifest.permission.SYSTEM_ALERT_WINDOW

A permissão SYSTEM_ALERT_WINDOW possibilita que um app crie uma janela mostrada sobre todos os apps.

Mitigações

As versões mais recentes do Android introduziram várias mitigações, incluindo:

  • No Android 6 (nível 23 da API) e versões mais recentes, os usuários precisam conceder explicitamente a permissão para que o app crie uma janela de sobreposição.
  • No Android 12 (nível 31 da API) e versões mais recentes, os apps podem transmitir true para Window.setHideOverlayWindows().

Risco: aviso personalizado

Um invasor pode usar o Toast.setView() para personalizar a aparência de uma mensagem de aviso. No Android 10 (nível 29 da API) e versões anteriores, apps maliciosos podem iniciar esses avisos em segundo plano.

Mitigações

Se um app for direcionado ao Android 11 (nível 30 da API) ou a versões mais recentes, o sistema vai bloquear os avisos personalizados em segundo plano. No entanto, essa mitigação pode ser contornada em algumas circunstâncias usando o burst de avisos, em que o invasor enfileira vários avisos em primeiro plano que continuam sendo iniciados mesmo depois que um app é acessado em segundo plano.

Os avisos em segundo plano e os ataques de burst foram reduzidos no Android 12 (nível 31 da API) e versões mais recentes.


Risco: sanduíche de atividades

Se um app malicioso convencer um usuário a abri-lo, ele vai poder iniciar uma atividade no app da vítima e, em seguida, sobrepô-la com a própria atividade, formando um sanduíche de atividades e criando um ataque de oclusão parcial.

Mitigações

Confira as mitigações gerais para oclusão parcial. Para uma proteção maior, é importante não exportar atividades que não precisam ser exportadas para evitar que um invasor as coloque em sanduíche.


Recursos