Cómo solucionar la vulnerabilidad de la inyección de fragmento

Esta información está dirigida a los programadores que usan en sus apps una implementación no segura que provoca que las clases PreferenceActivity sean vulnerables a la inyección de fragmento. Esa implementación puede permitir que apps externas malintencionadas carguen fragmentos que deberían ser privados.

Novedades

A partir del 1 de marzo de 2017, Google Play comenzó a bloquear la publicación de apps nuevas o actualizaciones en las que las clases de PreferenceActivity podrían ser vulnerables a la inyección de fragmento. Consulta la notificación en tu cuenta de Play ConsoleDespués de los plazos que aparecen en Play Console, es posible que se eliminen de Google Play todas las apps que contengan vulnerabilidades de seguridad no resueltas.

Acción necesaria​

  1. Accede a tu cuenta de Play Console y desplázate a la sección "Alertas" para ver qué apps están afectadas, así como los plazos para resolver los problemas.
  2. Actualiza las apps afectadas y corrige la vulnerabilidad.
  3. Envía las versiones actualizadas de las apps afectadas.

Una vez que las hayas reenviado, revisaremos tu app nuevamente. Este proceso puede demorar varias horas. Si la app pasa la revisión y se publica sin problemas, no se requiere ninguna otra acción. Si la app no pasa la revisión, no se publicará la nueva versión, y recibirás una notificación por correo electrónico.

Detalles adicionales

Si es posible, establece exported=false para PreferenceActivity en el manifiesto. De esta manera, impedirás que apps externas envíen intents a esta clase.

Si la PreferenceActivity vulnerable se debe exportar a apps externas, determina por qué la clase es vulnerable y toma las medidas necesarias. Existen dos posibilidades:

  1. Implementación incorrecta de isValidFragment:

Revisa si la clase vulnerable contiene o heredó una implementación de isValidFragment que muestra el resultado como verdadero en todas las rutas de código. Si es así, actualiza la clase para consultar la lista de clases de fragmentos permitidas. Por ejemplo, si PreferenceActivity debe permitir clases MyFragment y no otros fragmentos, implementa una verificación como la siguiente:

         public boolean isValidFragment(String fragmentName) {
            return MyFragment.class.getName().equals(fragmentName);

         }

  1. La targetSdkVersion es menor a diecinueve y no implementa isValidFragment:

Si la app tiene establecida en el manifiesto su targetSdkVersion a un valor menor a diecinueve y la clase vulnerable no contiene ninguna implementación de isValidFragment, la vulnerabilidad proviene de PreferenceActivity.

Para solucionarlo, los programadores deben actualizar targetSdkVersion a diecinueve (o a un valor mayor). Como alternativa, si no se puede actualizar targetSdkVersion, los desarrolladores deben implementar isValidFragment como se describe en el punto 1. para consultar las clases de fragmentos permitidas.

Ten en cuenta que las apps también deben cumplir con el Acuerdo de Distribución para Desarrolladores y la Política de Contenido

Estamos aquí para ayudarte

Si tienes preguntas técnicas sobre la vulnerabilidad, publícalas en Stack Overflow con la etiqueta "android-security". Si tienes dudas sobre los pasos que debes seguir para resolver este problema, comunícate con nuestro equipo de asistencia para desarrolladores.