Saltar a contenido

Task Hijacking

Secuestro de tareas

Descripción

Una tarea (task) de Android es una colección de actividades con las que los usuarios interactúan al realizar un determinado trabajo. Las actividades de diferentes aplicaciones pueden residir en la misma tarea, lo cual puede ser utilizado para reubicar una actividad maliciosa en la tarea de su aplicación mediante la manipulación de los siguientes parámetros:

  • Task Affinity controlado por el atributo taskAffinity
  • Task Reparenting controlado por el atributo allowTaskReparenting

Task Affinity es un atributo de actividad definido en la etiqueta <activity> en el archivo AndroidManifest.xml. Task Affinity especifica a qué tarea desea unirse la actividad. De forma predeterminada, todas las actividades en una aplicación tienen la misma afinidad, que es el nombre del paquete de la aplicación.

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="co.secureApp.app">
    <application>
        <activity android:name=".ActivityA"></activity>
        <activity android:name=".ActivityB" android:taskAffinity="co.ostorlab.Myapp:taskB"></activity>
    </application>
</manifest>

Cuando allowTaskReparenting se establece en true para una actividad A, y cuando una nueva tarea con la misma afinidad se trae al frente, el sistema mueve la actividad reubicable A desde su tarea de alojamiento original a la nueva pila de tareas en primer plano.

Los ataques de secuestro de tareas se presentan en diferentes variantes:

  • Control de Afinidad de Tarea (Task Affinity Control): la aplicación tiene un nombre de paquete com.mySecureApp.app y la actividad A1. Una aplicación maliciosa tiene dos actividades M1 y M2 donde M2.taskAffinity = com.mySecureApp.app y M2.allowTaskReparenting = true. Si la aplicación maliciosa está abierta en M2, una vez que inicie su aplicación, M2 se reubica al frente y el usuario interactuará con la aplicación maliciosa.

  • Modo de Tarea Única (Single Task Mode): la aplicación ha establecido el modo de lanzamiento en singleTask. Una aplicación maliciosa con M2.taskAffinity = com.mySecureApp.app puede secuestrar la pila de tareas de la aplicación objetivo.

  • Reasignación de Tarea (Task Reparenting): la aplicación ha establecido taskReparenting en true. Una aplicación maliciosa puede mover la tarea de la aplicación objetivo a la pila de la aplicación maliciosa.

El secuestro de tareas se puede utilizar para realizar phishing, ataques de denegación de uso, y ha sido explotado en el pasado por troyanos de malware bancario. Las nuevas variantes de los ataques (StrandHogg 2.0) son extremadamente difíciles de detectar, ya que son ataques basados en código.

El secuestro de tareas se ha solucionado en la versión 11 de Android como parte de la corrección del 'confused deputy' de WindowManager CVE-2020-0267.

Recomendación

Diferentes formas de vulnerabilidades de secuestro de tareas requieren soluciones diferentes:

  • Establezca la afinidad de tareas de las actividades de la aplicación en "" (cadena vacía) en la etiqueta <activity> del AndroidManifest.xml para forzar a las actividades a usar una afinidad de tarea generada aleatoriamente, o establézcalo en la etiqueta <application> para aplicarlo a todas las actividades en la aplicación.

O

  • Establezca android:launchMode en singleInstance. singleInstance asegura que no se crearán otras actividades en la misma tarea.

  • No especifique el modo de lanzamiento en singleTask ni agregue soporte para un servicio de monitoreo para detectar la presencia de tareas maliciosas en primer plano.

  • No establezca la bandera FLAG_ACTIVITY_NEW_TASK en los intents de lanzamiento de actividades, o utilícelo con FLAG_ACTIVITY_CLEAR_TASK:

Intent i = new Intent(this, AnActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);
  • No especifique allowReparenting con taskAffinity ni agregue soporte a un servicio de monitoreo para detectar la presencia de tareas maliciosas en primer plano.

  • Prefiera el uso de un intent explícito (Explicit intent), que especifica qué aplicación satisfará el intent, proporcionando el nombre del paquete de la aplicación objetivo o un nombre de clase de componente completamente calificado. El intent implícito (Implicit intent) solo especifica la acción general.

Enlaces

Estándares

  • OWASP_MASVS_L2:
    • MSTG_PLATFORM_9
  • GDPR:
    • ART_5
    • ART_25
    • ART_32
  • PCI_STANDARDS:
    • REQ_2_2
    • REQ_6_2
    • REQ_6_3
    • REQ_11_3
  • HIPAA_CONTROLS:
    • SECURITY221
    • SECURITY212
    • SECURITY213
  • SOC2_CONTROLS:
    • CC_2_1
    • CC_4_1
    • CC_7_1
    • CC_7_2
    • CC_7_4
    • CC_7_5