Tapjacking

Reading time: 7 minutes

tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks

Información Básica

Tapjacking es un ataque donde una aplicación maliciosa se lanza y se posiciona encima de una aplicación víctima. Una vez que oscurece visiblemente la aplicación víctima, su interfaz de usuario está diseñada de tal manera que engaña al usuario para que interactúe con ella, mientras pasa la interacción a la aplicación víctima.
En efecto, está cegando al usuario para que no sepa que realmente está realizando acciones en la aplicación víctima.

Detección

Para detectar aplicaciones vulnerables a este ataque, debes buscar actividades exportadas en el manifiesto de Android (ten en cuenta que una actividad con un intent-filter se exporta automáticamente por defecto). Una vez que hayas encontrado las actividades exportadas, verifica si requieren algún permiso. Esto se debe a que la aplicación maliciosa también necesitará ese permiso.

También puedes verificar la versión mínima del SDK de la aplicación, comprobando el valor de android:minSdkVersion en el archivo AndroidManifest.xml. Si el valor es inferior a 30, la aplicación es vulnerable a Tapjacking.

Protección

Android 12 (API 31,32) y superior

Según esta fuente, los ataques de tapjacking son automáticamente prevenidos por Android desde Android 12 (API 31 y 30) y superior. Así que, incluso si la aplicación es vulnerable, no podrás explotarla.

filterTouchesWhenObscured

Si android:filterTouchesWhenObscured está configurado en true, la View no recibirá toques siempre que la ventana de la vista esté oscurecida por otra ventana visible.

setFilterTouchesWhenObscured

El atributo setFilterTouchesWhenObscured configurado en true también puede prevenir la explotación de esta vulnerabilidad si la versión de Android es inferior.
Si se establece en true, por ejemplo, un botón puede ser automáticamente deshabilitado si está oscurecido:

xml
<Button android:text="Button"
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:filterTouchesWhenObscured="true">
</Button>

Explotación

Tapjacking-ExportedActivity

La aplicación de Android más reciente que realiza un ataque de Tapjacking (+ invocando antes de una actividad exportada de la aplicación atacada) se puede encontrar en: https://github.com/carlospolop/Tapjacking-ExportedActivity.

Sigue las instrucciones del README para usarlo.

FloatingWindowApp

Un proyecto de ejemplo que implementa FloatingWindowApp, que se puede usar para superponerse a otras actividades para realizar un ataque de clickjacking, se puede encontrar en FloatingWindowApp (un poco antiguo, buena suerte construyendo el apk).

Qark

caution

Parece que este proyecto ahora no está mantenido y esta funcionalidad ya no funciona correctamente

Puedes usar qark con los parámetros --exploit-apk --sdk-path /Users/username/Library/Android/sdk para crear una aplicación maliciosa que pruebe posibles vulnerabilidades de Tapjacking.\

La mitigación es relativamente simple, ya que el desarrollador puede optar por no recibir eventos táctiles cuando una vista está cubierta por otra. Usando la Referencia del Desarrollador de Android:

A veces es esencial que una aplicación pueda verificar que una acción se está realizando con el pleno conocimiento y consentimiento del usuario, como conceder una solicitud de permiso, realizar una compra o hacer clic en un anuncio. Desafortunadamente, una aplicación maliciosa podría intentar engañar al usuario para que realice estas acciones, sin que se dé cuenta, al ocultar el propósito previsto de la vista. Como remedio, el marco ofrece un mecanismo de filtrado de toques que se puede usar para mejorar la seguridad de las vistas que proporcionan acceso a funcionalidades sensibles.

Para habilitar el filtrado de toques, llama a setFilterTouchesWhenObscured(boolean) o establece el atributo de diseño android:filterTouchesWhenObscured en true. Cuando está habilitado, el marco descartará los toques que se reciban siempre que la ventana de la vista esté oscurecida por otra ventana visible. Como resultado, la vista no recibirá toques siempre que un toast, diálogo u otra ventana aparezca sobre la ventana de la vista.


Phishing de Superposición de Accesibilidad (Variante de Troyano Bancario)

Además del Tapjacking clásico, las familias de malware bancario moderno de Android (por ejemplo, ToxicPanda, BrasDex, Sova, etc.) abusan del Servicio de Accesibilidad para colocar una superposición de WebView a pantalla completa sobre la aplicación legítima mientras aún pueden reenviar la entrada del usuario a la vista de abajo. Esto aumenta drásticamente la credibilidad y permite a los atacantes robar credenciales, OTPs o incluso automatizar transacciones fraudulentas.

Cómo funciona

  1. El APK malicioso solicita el permiso altamente sensible BIND_ACCESSIBILITY_SERVICE, generalmente ocultando la solicitud detrás de un falso diálogo de Google/Chrome/visor de PDF.
  2. Una vez que el usuario habilita el servicio, el malware simula programáticamente los toques necesarios para conceder permisos adicionales peligrosos (READ_SMS, SYSTEM_ALERT_WINDOW, REQUEST_INSTALL_PACKAGES, …).
  3. Se infla un WebView y se agrega al administrador de ventanas utilizando el tipo de ventana TYPE_ACCESSIBILITY_OVERLAY. La superposición puede renderizarse totalmente opaca o semitransparente y puede ser marcada como “a través” para que los toques originales aún se entreguen a la actividad de fondo (por lo tanto, la transacción realmente ocurre mientras la víctima solo ve el formulario de phishing).
java
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);

Flujo de trabajo típico utilizado por troyanos bancarios

  • Consultar paquetes instalados (QUERY_ALL_PACKAGES) para averiguar qué aplicación bancaria / de billetera está actualmente abierta.
  • Descargar una plantilla de superposición HTML/JS del C2 que imita perfectamente esa aplicación específica (logo, colores, cadenas i18n…).
  • Mostrar la superposición, recolectar credenciales/PIN/patrón.
  • Usar la API de Accesibilidad (performGlobalAction, GestureDescription) para automatizar transferencias en segundo plano.

Detección y Mitigación

  • Auditar la lista de aplicaciones instaladas con adb shell pm list packages -3 -e BIND_ACCESSIBILITY_SERVICE.
  • Desde el lado de la aplicación (banco / billetera):
  • Habilitar android:accessibilityDataSensitive="accessibilityDataPrivateYes" (Android 14+) en vistas sensibles para bloquear servicios no de Play Store.
  • Combinar con setFilterTouchesWhenObscured(true) y FLAG_SECURE.
  • Endurecimiento del sistema:
  • Deshabilitar Instalar de fuentes desconocidas y Accesibilidad para aplicaciones no confiables.
  • Hacer cumplir PlayProtect y dispositivos actualizados.

Para obtener detalles adicionales sobre el aprovechamiento de los Servicios de Accesibilidad para el control remoto completo del dispositivo (por ejemplo, PlayPraetor, SpyNote, etc.) consulte:

Accessibility Services Abuse

Referencias

tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks