Solución de la vulnerabilidad de redirección de intents

Esta información va dirigida a desarrolladores que tengan aplicaciones con la vulnerabilidad de redirección de intents.

¿Qué está pasando?

Una o varias de tus aplicaciones contienen la vulnerabilidad de redirección de intents, que puede permitir el acceso de aplicaciones maliciosas a componentes privados de las aplicaciones. Consulta los pasos detallados a continuación para solucionar el problema con tus aplicaciones. Una vez que finalicen los plazos que se indican en Play Console, se retirarán de Google Play todas las aplicaciones que contengan vulnerabilidades de seguridad sin resolver.

Acción necesaria​

  1. Inicia sesión en Play Console y ve a la sección Alertas para consultar qué aplicaciones están afectadas y las fechas límite para resolver estos problemas.
  2. Actualiza las aplicaciones afectadas siguiendo los pasos destacados más abajo.
  3. Envía las versiones actualizadas de las aplicaciones afectadas.

Cuando vuelvas a enviar tus aplicaciones, se revisarán de nuevo. Este proceso puede tardar varias horas en completarse. Si una aplicación supera el proceso de revisión y se publica, no tendrás que hacer nada más. De lo contrario, la nueva versión de la aplicación no se publicará y recibirás una notificación por correo electrónico.

Otros datos

Las aplicaciones que extraen intents del campo Extras de un intent que no sea de confianza y publican componentes ejecutando startActivity (o startService) en un intent extraído se pueden manipular para publicar componentes privados no esperados. Esto puede hacer 1) que se lleven a cabo acciones sensibles con argumentos contaminados o 2) que se roben archivos sensibles mediante permisos de URI concendidos.

Te recomendamos que evites esta vulnerabilidad de una de estas formas:

Opción 1: Hacer que el componente afectado de la aplicación (a partir del que se redirige el intent extraído) sea privado

Si el componente afectado de la aplicación no necesita recibir intents de otras aplicaciones, puedes hacer que sea privado. Para ello, define android:exported="false" en el archivo de manifiesto. 

Opción 2: Asegurarse de que el intent extraído procede de una fuente fiable

Puedes verificar que la actividad causante es de confianza con métodos como getCallingActivity. Por ejemplo: 

 // check if the originating Activity is from trusted package
 if (getCallingActivity().getPackageName().equals(“known”)) {
   Intent intent = getIntent();
   // extract the nested Intent
   Intent forward = (Intent) intent.getParcelableExtra(“key”);
   // redirect the nested Intent
   startActivity(forward);
 }

Opción 3: Asegurarse de que el intent que se redirige no es dañino

Debes verificar que el intent redirigido:

  1. No se enviará a ninguno de los componentes privados de tu aplicación.
  2. No dará permisos de URI a uno de los proveedores de contenido privado de tu aplicación.

Las aplicaciones pueden comprobar qué componente se usará para gestionar el intent antes de redirigirlo con métodos como resolveActivity. Por ejemplo:

 Intent intent = getIntent();
 // extract the nested Intent
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // get the component name
 ComponentName name = forward.resolveActivity(getPackageManager());
 // check that the package name and class name are as intended
 if (name.getPackageName().equals(“safe_package”) &&
     name.getClassName().equals(“safe_class”)) {
   // redirect the nested Intent
   startActivity(forward);
 }

Las aplicaciones pueden comprobar si un intent da permiso de URI con métodos como getFlags. Por ejemplo:

 // extract the nested Intent
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // get the flags
 int flags = forward.getFlags();
 // check that the nested intent does not grant URI permissions
 if ((flags & Intent.FLAG_GRANT_READ_URI_PERMISSION > 0) ||
     (flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION > 0) {
   // redirect the nested Intent
   startActivity(forward);
 }

Queremos ayudarte

Si tienes alguna pregunta técnica sobre esta vulnerabilidad, puedes publicarla en Stack Overflow con la etiqueta "android-security". Ponte en contacto con nuestro equipo de asistencia para desarrolladores si necesitas más información para resolver este problema.

¿Te ha resultado útil esta información?
¿Cómo podemos mejorar esta página?