Categoría de OWASP: MASVS-PLATFORM: Interacción con la plataforma
Descripción general
Tapjacking es el equivalente de la app para Android de la vulnerabilidad web "captura de clic": una app maliciosa que engaña al usuario para que haga clic en un control relevante de seguridad (botón de confirmación, etc.) ocultando la IU con una superposición o por otros medios. En esta página, diferenciamos dos variantes de ataque: oclusión completa y parcial. En oclusión completa, el atacante superpone el área táctil, mientras que en la oclusión parcial, el área táctil permanece despejada.
Impacto
En los ataques de tapjacking, se engaña al usuario para que realice determinadas acciones. El impacto depende de la acción que el atacante tenga como objetivo.
Riesgo: Oclusión completa
En oclusión completa, el atacante superpone el área táctil para interceptar el evento táctil:
Mitigaciones
Para evitar la oclusión completa, configura View.setFilterTouchesWhenObscured(true)
en el código. Esto bloquea los toques que pasa una superposición. Si prefieres un enfoque declarativo, también puedes agregar android:filterTouchesWhenObscured="true"
en el archivo de diseño del objeto View
que deseas proteger.
Riesgo: Oclusión parcial
En los ataques de oclusión parcial, el área táctil permanece despejada:
Mitigaciones
Para mitigar la oclusión parcial, se ignoran de forma manual los eventos táctiles que tienen la marca FLAG_WINDOW_IS_PARTIALLY_OBSCURED
. No hay protecciones predeterminadas ante esta situación.
Posible advertencia: Esta mitigación puede interferir con las apps benignas. En algunos casos, no es posible implementar esta corrección, ya que podría afectar de manera negativa la experiencia del usuario cuando una aplicación benigna causa la oclusión parcial.
Riesgos específicos
En esta sección, se recopilan los riesgos que requieren estrategias de mitigación no estándar o que se mitigaron en cierto nivel de SDK y están aquí para lograr una integridad.
Riesgo: android.Manifest.permission.SYSTEM_ALERT_WINDOW
El permiso SYSTEM_ALERT_WINDOW
hace posible que una app cree una ventana que se muestre sobre todas las apps.
Mitigaciones
Las versiones más recientes de Android incorporaron varias mitigaciones, incluidas las siguientes:
- En Android 6 (nivel de API 23) y versiones posteriores, los usuarios deben otorgar explícitamente el permiso para que la app cree una ventana superpuesta.
- En Android 12 (nivel de API 31) y versiones posteriores, las apps pueden pasar
true
aWindow.setHideOverlayWindows()
.
Riesgo: Aviso personalizado
Un atacante puede usar Toast.setView()
para personalizar la apariencia de un mensaje de aviso. En Android 10 (nivel de API 29) y versiones anteriores, las apps maliciosas podrían iniciar estos avisos desde el segundo plano.
Mitigaciones
Si una app se orienta a Android 11 (nivel de API 30) o versiones posteriores, el sistema bloquea los avisos personalizados en segundo plano. Sin embargo, esta mitigación se puede evadir en algunas circunstancias con la ráfaga de avisos, en la que el atacante pone en cola múltiples avisos en primer plano, y se siguen ejecutando incluso después de que una app se va al segundo plano.
A partir de Android 12 (nivel de API 31), los ataques de ráfaga de avisos y avisos en segundo plano se mitigan por completo.
Riesgo: Sándwich de actividad
Si una app maliciosa logra convencer a un usuario de que la abra, aún puede iniciar una actividad desde la app víctima y, luego, superponerla con su propia actividad, lo que forma un sándwich de actividad y crea un ataque de oclusión parcial.
Mitigaciones
Consulta las mitigaciones generales de una oclusión parcial. Para la defensa en profundidad, asegúrate de no exportar actividades que no necesiten exportarse para evitar que un atacante las haga sándwiches.
Recursos
Cambios en la política de nivel de API objetivo de Play Store
Ataques de Android basados en servicios de accesibilidad y compensación de IU
Recomendaciones para ti
- Nota: El texto del vínculo se muestra cuando JavaScript está desactivado
- android:exported
- # Administración de claves {:#key-management}
- Cómo ejecutar código DEX incorporado directamente desde un APK