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 corregir.
¿Qué tienes que hacer?
- 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.
- Actualiza las aplicaciones afectadas siguiendo los pasos destacados más abajo.
- 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. Si no lo supera, la nueva versión de la aplicación no se publicará y recibirás una notificación por correo electrónico.
Detalles adicionales
Usar un intent que no sea de confianza para ejecutar un componente (por ejemplo, llamando a startActivity) o para devolver datos (por ejemplo, llamando a setResult) es peligroso y puede permitir que las aplicaciones maliciosas causen los siguientes problemas:
- Robo de información sensible, como archivos o datos del sistema (por ejemplo, mensajes SMS), desde tu aplicación.
- Ejecución de componentes privados de tu aplicación con argumentos contaminados.
Es importante que la aplicación no llame a startActivity, startService, sendBroadcast o setResult en intents que no sean de confianza si estos no se han validado ni protegido.
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:
// comprobar si la actividad causante es de un paquete de confianza
if (getCallingActivity().getPackageName().equals(“known”)) {
Intent intent = getIntent();
// extraer el intent anidado
Intent forward = (Intent) intent.getParcelableExtra(“key”);
// redireccionar el intent anidado
startActivity(forward);
}
Nota:
- Comprobar que getCallingActivity() devuelva un valor que no sea nulo no es suficiente para evitar la vulnerabilidad. Las aplicaciones maliciosas pueden proporcionar un valor nulo para esta función.
- En el caso de Google Play Services SMS Retriever Auth, que protege al receptor de emisión que tiene el permiso SEND_PERMISSION, se confirmará que el intent proceda de Servicios de Play.
Opción 3: Asegurarse de que el intent que se redirige no es dañino.
Debes verificar que el intent redirigido:
- No se enviará a ninguno de los componentes privados de tu aplicación.
- No se enviará al componente de una aplicación externa. Si el redireccionamiento apunta a una aplicación externa, asegúrate de que el intent no dé 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();
// extraer el intent anidado
Intent forward = (Intent) intent.getParcelableExtra(“key”);
// comprobar el nombre del componente
ComponentName name = forward.resolveActivity(getPackageManager());
// comprobar si el nombre del paquete y el nombre de clase son los que deberían
if (name.getPackageName().equals(“safe_package”) &&
name.getClassName().equals(“safe_class”)) {
// redireccionar el intent anidado
startActivity(forward);
}
Las aplicaciones pueden comprobar si un intent da permisos de URI con métodos como getFlags. Por ejemplo:
// extraer el intent anidado
Intent forward = (Intent) intent.getParcelableExtra(“key”);
// comprobar las marcas
int flags = forward.getFlags();
// comprobar si el intent anidado no da permisos de URI
if ((flags & Intent.FLAG_GRANT_READ_URI_PERMISSION == 0) &&
(flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION == 0)) {
// redireccionar el intent anidado
startActivity(forward);
}
Las aplicaciones también pueden retirar permisos de URI mediante removeFlags. Por ejemplo:
// intent no fiable
Intent intent = getIntent();
// retirar los permisos de URI en el intent que no es de confianza
intent.removeFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.removeFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
// transferir el intent que no es de confianza
setResult(intent);
Descripción de las alertas y elección de una opción de prevención
En las alertas de Play Console se indica en qué parte de tu aplicación se llama a startActivity, startActivityForResult, startService, sendBroadcast o setResult mediante un intent que no es de confianza. Si quieres saber cuál es la opción de prevención más adecuada en tu caso, haz un seguimiento de los llamadores de los métodos para averiguar dónde se origina el intent que no es de confianza. Por ejemplo, en el caso de la opción 1, haz un seguimiento para determinar qué componente debes hacer que sea privado.
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 instrucciones para resolver este problema.