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
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
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:
<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
- 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. - 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
, …). - 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).
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)
yFLAG_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:
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
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.