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.appy la actividad A1. Una aplicación maliciosa tiene dos actividades M1 y M2 dondeM2.taskAffinity = com.mySecureApp.appyM2.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 conM2.taskAffinity = com.mySecureApp.apppuede secuestrar la pila de tareas de la aplicación objetivo. -
Reasignación de Tarea (Task Reparenting): la aplicación ha establecido
taskReparentingentrue. 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>delAndroidManifest.xmlpara 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:launchModeensingleInstance.singleInstanceasegura que no se crearán otras actividades en la misma tarea. -
No especifique el modo de lanzamiento en
singleTaskni agregue soporte para un servicio de monitoreo para detectar la presencia de tareas maliciosas en primer plano. -
No establezca la bandera
FLAG_ACTIVITY_NEW_TASKen los intents de lanzamiento de actividades, o utilícelo conFLAG_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
allowReparentingcontaskAffinityni 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
- Understand Tasks and Back Stack - Android Documentation
- Towards Discovering and Understanding Task Hijacking in Android
- StrandHogg Attack
- StandHogg Attack 2.0
- Task Hijacking exploited by Mobile Banking Malware
- CVE-2020-0267: WindowManager Confused Deputy
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