Tapjacking
Reading time: 7 minutes
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
Informações Básicas
Tapjacking é um ataque onde uma aplicação maliciosa é lançada e se posiciona em cima de uma aplicação vítima. Uma vez que obscurece visivelmente a aplicação vítima, sua interface de usuário é projetada de tal forma a enganar o usuário para interagir com ela, enquanto passa a interação para a aplicação vítima.
Na prática, isso cega o usuário para que ele não saiba que está realmente realizando ações na aplicação vítima.
Detecção
Para detectar aplicativos vulneráveis a este ataque, você deve procurar por atividades exportadas no manifesto android (note que uma atividade com um intent-filter é automaticamente exportada por padrão). Uma vez que você tenha encontrado as atividades exportadas, verifique se elas requerem alguma permissão. Isso ocorre porque a aplicação maliciosa também precisará dessa permissão.
Você também pode verificar a versão mínima do SDK do aplicativo, checando o valor de android:minSdkVersion
no arquivo AndroidManifest.xml
. Se o valor for menor que 30, o aplicativo é vulnerável ao Tapjacking.
Proteção
Android 12 (API 31,32) e superior
De acordo com esta fonte, ataques de tapjacking são automaticamente prevenidos pelo Android a partir do Android 12 (API 31 & 30) e superior. Portanto, mesmo que a aplicação seja vulnerável, você não poderá explorá-la.
filterTouchesWhenObscured
Se android:filterTouchesWhenObscured
estiver definido como true
, a View
não receberá toques sempre que a janela da view estiver obscurecida por outra janela visível.
setFilterTouchesWhenObscured
O atributo setFilterTouchesWhenObscured
definido como verdadeiro também pode prevenir a exploração dessa vulnerabilidade se a versão do Android for inferior.
Se definido como true
, por exemplo, um botão pode ser automaticamente desativado se estiver obscurecido:
<Button android:text="Button"
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:filterTouchesWhenObscured="true">
</Button>
Exploração
Tapjacking-ExportedActivity
O mais recente aplicativo Android realizando um ataque de Tapjacking (+ invocando antes de uma atividade exportada do aplicativo atacado) pode ser encontrado em: https://github.com/carlospolop/Tapjacking-ExportedActivity.
Siga as instruções do README para usá-lo.
FloatingWindowApp
Um projeto de exemplo implementando FloatingWindowApp, que pode ser usado para sobrepor outras atividades para realizar um ataque de clickjacking, pode ser encontrado em FloatingWindowApp (um pouco antigo, boa sorte construindo o apk).
Qark
caution
Parece que este projeto agora não está mais mantido e essa funcionalidade não está funcionando corretamente
Você pode usar qark com os parâmetros --exploit-apk
--sdk-path /Users/username/Library/Android/sdk
para criar um aplicativo malicioso para testar possíveis vulnerabilidades de Tapjacking.\
A mitigação é relativamente simples, pois o desenvolvedor pode optar por não receber eventos de toque quando uma visualização está coberta por outra. Usando a Referência do Desenvolvedor Android:
Às vezes, é essencial que um aplicativo possa verificar se uma ação está sendo realizada com o pleno conhecimento e consentimento do usuário, como conceder uma solicitação de permissão, fazer uma compra ou clicar em um anúncio. Infelizmente, um aplicativo malicioso poderia tentar enganar o usuário para realizar essas ações, sem que ele perceba, ocultando o propósito pretendido da visualização. Como remédio, o framework oferece um mecanismo de filtragem de toque que pode ser usado para melhorar a segurança das visualizações que fornecem acesso a funcionalidades sensíveis.
Para habilitar a filtragem de toque, chame
setFilterTouchesWhenObscured(boolean)
ou defina o atributo de layout android:filterTouchesWhenObscured como verdadeiro. Quando habilitado, o framework descartará toques que forem recebidos sempre que a janela da visualização estiver obscurecida por outra janela visível. Como resultado, a visualização não receberá toques sempre que um toast, diálogo ou outra janela aparecer acima da janela da visualização.
Phishing de Sobreposição de Acessibilidade (Variante de Trojan Bancário)
Além do Tapjacking clássico, famílias modernas de malware bancário Android (por exemplo, ToxicPanda, BrasDex, Sova, etc.) abusam do Serviço de Acessibilidade para colocar uma sobreposição de WebView em tela cheia acima do aplicativo legítimo, enquanto ainda conseguem encaminhar a entrada do usuário para a visualização abaixo. Isso aumenta dramaticamente a credibilidade e permite que os atacantes roubem credenciais, OTPs ou até mesmo automatizem transações fraudulentas.
Como funciona
- O APK malicioso solicita a permissão altamente sensível
BIND_ACCESSIBILITY_SERVICE
, geralmente ocultando a solicitação atrás de um diálogo falso do Google/Chrome/visualizador de PDF. - Assim que o usuário habilita o serviço, o malware simula programaticamente os toques necessários para conceder permissões adicionais perigosas (
READ_SMS
,SYSTEM_ALERT_WINDOW
,REQUEST_INSTALL_PACKAGES
, …). - Um WebView é inflado e adicionado ao gerenciador de janelas usando o tipo de janela
TYPE_ACCESSIBILITY_OVERLAY
. A sobreposição pode ser renderizada totalmente opaca ou semi-transparente e pode ser marcada como “através” para que os toques originais ainda sejam entregues à atividade em segundo plano (assim, a transação realmente acontece enquanto a vítima vê apenas o formulário de phishing).
WebView phishingView = new WebView(getApplicationContext());
phishingView.getSettings().setJavaScriptEnabled(true);
phishingView.loadUrl("file:///android_asset/bank_login.html");
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY, // <-- bypasses SYSTEM_ALERT_WINDOW prompt
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, // «through» flag → forward touches
PixelFormat.TRANSLUCENT);
wm.addView(phishingView, lp);
Fluxo de trabalho típico usado por Trojans bancários
- Consultar pacotes instalados (
QUERY_ALL_PACKAGES
) para descobrir qual aplicativo bancário / de carteira está atualmente aberto. - Baixar um template de sobreposição HTML/JS do C2 que imita perfeitamente esse aplicativo específico (Logo, cores, strings i18n…).
- Exibir a sobreposição, coletar credenciais/PIN/padrão.
- Usar a API de Acessibilidade (
performGlobalAction
,GestureDescription
) para automatizar transferências em segundo plano.
Detecção e Mitigação
- Auditar a lista de aplicativos instalados com
adb shell pm list packages -3 -e BIND_ACCESSIBILITY_SERVICE
. - Do lado do aplicativo (banco / carteira):
- Habilitar
android:accessibilityDataSensitive="accessibilityDataPrivateYes"
(Android 14+) em visualizações sensíveis para bloquear serviços não da Play Store. - Combinar com
setFilterTouchesWhenObscured(true)
eFLAG_SECURE
.
- Dureza do sistema:
- Desativar Instalar de Fontes Desconhecidas e Acessibilidade para aplicativos não confiáveis.
- Aplicar PlayProtect e dispositivos atualizados.
Para detalhes adicionais sobre como aproveitar os Serviços de Acessibilidade para controle total remoto do dispositivo (por exemplo, PlayPraetor, SpyNote, etc.) veja:
Referências
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.