Tapjacking

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 app víctima, su interfaz de usuario está diseñada de tal manera que engaña al usuario para que interactúe con ella, mientras reenvía la interacción a la app víctima.
En efecto, está cegando al usuario para que no sepa que en realidad está realizando acciones en la app víctima.

Detección

  • Busca actividades exportadas en el manifest de Android (una activity con un intent-filter está exportada por defecto). Si una actividad exportada está protegida por un permiso, la aplicación atacante necesitará el mismo permiso, lo que limita la explotabilidad.
  • Revisa la versión de SDK mínimo android:minSdkVersion en AndroidManifest.xml. Si es inferior a 30, comportamientos predeterminados más antiguos pueden hacer que tapjacking sea más fácil de explotar.
  • En tiempo de ejecución, usa logcat para detectar toques bloqueados en Android 12+: el sistema registra Untrusted touch due to occlusion by <package> cuando las superposiciones son filtradas.

Protección

Android 12+ default blocking & compat flags

Android 12 (API 31) introdujo “Block untrusted touches”: los toques que provienen de otra ventana con distinto UID del tipo TYPE_APPLICATION_OVERLAY (opacidad ≥0.8) son descartados. Esto está habilitado por defecto. Durante las pruebas puedes alternarlo:

# disable blocking for a specific package (for PoC crafting)
adb shell am compat disable BLOCK_UNTRUSTED_TOUCHES com.example.victim
# re‑enable
adb shell am compat reset BLOCK_UNTRUSTED_TOUCHES com.example.victim

Las ventanas de confianza (accessibility, IME, assistant) siguen recibiendo eventos. Las superposiciones invisibles o totalmente transparentes también evaden el bloqueo; los atacantes intentan abusar manteniendo alpha < 0.8.

Manejo de oclusión parcial

Las superposiciones parciales que dejan visible el área objetivo no se bloquean automáticamente. Para mitigarlo en vistas sensibles, rechace eventos con la bandera FLAG_WINDOW_IS_PARTIALLY_OBSCURED:

@Override
public boolean onFilterTouchEventForSecurity(MotionEvent event) {
if ((event.getFlags() & MotionEvent.FLAG_WINDOW_IS_PARTIALLY_OBSCURED) != 0) {
return false; // drop tap when anything partially obscures us
}
return super.onFilterTouchEventForSecurity(event);
}

filterTouchesWhenObscured

Si android:filterTouchesWhenObscured está establecido en true, la View no recibirá toques cuando la ventana de la vista esté cubierta por otra ventana visible.

setFilterTouchesWhenObscured

El atributo setFilterTouchesWhenObscured establecido en true también puede prevenir la explotación de esta vulnerabilidad si la versión de Android es más antigua.
Si se establece en true, por ejemplo, un botón puede deshabilitarse automáticamente si está oculto:

<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 Android más reciente que realiza un ataque de Tapjacking (+ invocando antes una exported activity 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 puede usarse para ponerse encima de otras activities y realizar un ataque de clickjacking, se puede encontrar en FloatingWindowApp (un poco antiguo, buena suerte construyendo el apk).

Qark

Caution

Parece que este proyecto ya no se mantiene 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: el desarrollador puede optar por no recibir eventos táctiles cuando una view está cubierta por otra. Usando la Android Developer’s Reference:

Sometimes it is essential that an application be able to verify that an action is being performed with the full knowledge and consent of the user, such as granting a permission request, making a purchase or clicking on an advertisement. Unfortunately, a malicious application could try to spoof the user into performing these actions, unaware, by concealing the intended purpose of the view. As a remedy, the framework offers a touch filtering mechanism that can be used to improve the security of views that provide access to sensitive functionality.

To enable touch filtering, call setFilterTouchesWhenObscured(boolean) or set the android:filterTouchesWhenObscured layout attribute to true. When enabled, the framework will discard touches that are received whenever the view’s window is obscured by another visible window. As a result, the view will not receive touches whenever a toast, dialog or other window appears above the view’s window.


Recent overlay-based malware techniques

  • Hook/Ermac variants usan overlays casi transparentes (p. ej., prompts NFC falsos) para capturar gestos y PINs de la pantalla de bloqueo mientras reenvían los toques al fondo, entregados vía módulos Accessibility-ATS.
  • Anatsa/TeaBot droppers incluyen overlays para cientos de apps banking/crypto y muestran overlays a pantalla completa de “maintenance” para retrasar a las víctimas mientras ATS completa las transferencias.
  • Hidden-VNC banking RATs muestran brevemente overlays de phishing para capturar credenciales, luego se apoyan en un VNC encubierto más Accessibility para reproducir taps con menos artefactos en el dispositivo.

Conclusión práctica para red teams: mezcla un overlay con alpha < 0.8 para evadir el bloqueo de Android 12, y luego escala a un overlay de accessibility a pantalla completa una vez que el usuario active el servicio. Instrumenta GestureDescription o un headless VNC para mantener el control después de capturar credenciales.


Accessibility Overlay Phishing (Variante de troyano bancario)

Además del Tapjacking clásico, las familias modernas de malware bancario en Android (p. ej. ToxicPanda, BrasDex, Sova, etc.) abusan del Accessibility Service para colocar un overlay WebView a pantalla completa por encima de la aplicación legítima mientras siguen pudiendo reenviar la entrada del usuario a la view subyacente. Esto incrementa 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, normalmente ocultando la solicitud detrás de un diálogo falso de Google/Chrome/visor de PDF.
  2. Una vez que el usuario habilita el servicio, el malware simula programáticamente los taps necesarios para conceder permisos adicionales peligrosos (READ_SMS, SYSTEM_ALERT_WINDOW, REQUEST_INSTALL_PACKAGES, …).
  3. Se infla un WebView y se añade al window manager usando el tipo de ventana TYPE_ACCESSIBILITY_OVERLAY. El overlay puede renderizarse totalmente opaco o semitransparente y puede marcarse como “through” para que los toques originales sigan llegando a la activity de fondo (así la transacción realmente ocurre mientras la víctima solo ve el formulario 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);

Flujo de trabajo típico usado por troyanos bancarios

  • Consultar los paquetes instalados (QUERY_ALL_PACKAGES) para averiguar qué aplicación bancaria / wallet está actualmente abierta.
  • Descargar una plantilla overlay HTML/JS desde el C2 que imite perfectamente esa aplicación específica (Logo, colores, cadenas i18n…).
  • Mostrar el overlay, recolectar credenciales/PIN/patrón.
  • Usar la Accessibility API (performGlobalAction, GestureDescription) para automatizar transferencias en segundo plano.

Detección y mitigación

  • Auditar la lista de apps instaladas con adb shell pm list packages -3 -e BIND_ACCESSIBILITY_SERVICE.
  • Desde el lado de la aplicación (banco / wallet):
  • Habilitar android:accessibilityDataSensitive="accessibilityDataPrivateYes" (Android 14+) en vistas sensibles para bloquear servicios fuera de Play Store.
  • Combinar con setFilterTouchesWhenObscured(true) y FLAG_SECURE.

Para más detalles sobre cómo aprovechar Accessibility Services para control remoto total del dispositivo (p. ej. PlayPraetor, SpyNote, etc.) ver:

Accessibility Services Abuse

References

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