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 IU 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

A oclusão parcial é atenuada ao ignorar 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.

Possível ressalva: essa mitigação pode interferir em apps benignos. Em alguns casos, não é possível lançar essa correção, já que isso afetaria negativamente a experiência do usuário quando a oclusão parcial é causada por um aplicativo benigno.


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