hacktricks/mobile-pentesting/android-app-pentesting/android-task-hijacking.md
2023-06-03 01:46:23 +00:00

6.1 KiB

Tareas, pila de retroceso y actividades en primer plano

Una tarea es una colección de actividades con las que los usuarios interactúan al realizar un trabajo determinado. Las actividades se organizan en una pila, la pila de retroceso, en el orden en que se abre cada actividad.

La actividad que se muestra en la pantalla se llama actividad en primer plano y su tarea se llama tarea en primer plano. En un momento dado, solo una tarea en primer plano es visible en la pantalla.

Este es un flujo de actividad simple:

  • Solo hay Activity 1 en primer plano.
  • Se inicia Activity 2 que empuja Activity 1 a la pila de retroceso. Ahora Activity 2 está en primer plano.
  • Se inicia Activity 3 que empuja tanto Activity 1 como 2 a la pila de retroceso.
  • Ahora, cuando se cierra Activity 3, la actividad anterior, es decir, 2, se lleva automáticamente al primer plano. Así es como funciona la navegación de tareas en Android.

Multitarea de Android - Una tarea

Una tarea está compuesta por varias actividades.

Multitarea de Android - Varias tareas

Android generalmente administra varias tareas.

Controles de tareas

Ataque de afinidad de tareas

Afinidad de tareas y modos de lanzamiento

La afinidad de tareas es un atributo que se define en cada etiqueta <activity> en el archivo AndroidManifest.xml. Describe a qué tarea prefiere un Activity unirse.
Por defecto, cada actividad tiene la misma afinidad que el nombre del paquete.

Usaremos esto al crear nuestra aplicación PoC.

<activity android:taskAffinity=""/>

Los modos de lanzamiento permiten definir cómo se asocia una nueva instancia de una actividad con la tarea actual. El atributo launchMode especifica una instrucción sobre cómo se debe lanzar la actividad en una tarea. Hay cuatro modos de lanzamiento diferentes:

  1. estándar (predeterminado)
  2. singleTop
  3. singleTask
  4. singleInstance

Cuando el launchMode se establece en singleTask, el sistema Android evalúa tres posibilidades y una de ellas es la razón por la cual nuestro ataque es posible. Aquí están:

  • Si la instancia de la actividad ya existe:
    Android reanuda la instancia existente en lugar de crear una nueva. Esto significa que hay como máximo una instancia de actividad en el sistema bajo este modo.
  • Si es necesario crear una nueva instancia de actividad:
    El Servicio de Administrador de Actividades (AMS) selecciona una tarea para alojar la instancia recién creada encontrando una tarea "coincidente" en todas las tareas existentes. Una actividad "coincide" con una tarea si tienen la misma afinidad de tarea. Esta es la razón por la cual podemos especificar la misma afinidad de tarea que la aplicación vulnerable en nuestra aplicación de malware/atacante para que se lance en su tarea en lugar de crear la suya propia.
  • Sin encontrar una tarea "coincidente":
    El AMS crea una nueva tarea y hace que la nueva instancia de actividad sea la actividad raíz de la tarea recién creada.

Ataque

La víctima necesita tener la aplicación maliciosa instalada en su dispositivo. Luego, necesita abrirla antes de abrir la aplicación vulnerable. Luego, cuando se abre la aplicación vulnerable, la aplicación maliciosa se abrirá en su lugar. Si esta aplicación maliciosa presenta el mismo inicio de sesión que la aplicación vulnerable, el usuario no tendrá ningún medio para saber que está ingresando sus credenciales en una aplicación maliciosa.

Puede encontrar un ataque implementado aquí: https://github.com/az0mb13/Task_Hijacking_Strandhogg

Prevención del secuestro de tareas

Establecer taskAffinity="" puede ser una solución rápida para este problema. El modo de lanzamiento también se puede establecer en singleInstance si la aplicación no desea que otras actividades se unan a las tareas que le pertenecen. También se puede agregar una función personalizada onBackPressed() para anular el comportamiento predeterminado.

Referencias

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥