Vulnerabilidad del directorio transversal

Esta información está destinada a los desarrolladores que tengan aplicaciones con la vulnerabilidad del directorio transversal.

¿Qué va a cambiar?

El 16 de enero del 2018, Google Play empezó a bloquear la publicación de aplicaciones y actualizaciones que contenían la vulnerabilidad de directorio transversal. Consulta el aviso en Play Console. Una vez que finalice el plazo indicado en Play Console, es posible que las aplicaciones que contengan vulnerabilidades de seguridad sin corregir se retiren de Google Play.

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 y corrige la vulnerabilidad.
  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.

Información adicional

Las implementaciones de openFile en las clases ContentProviders exportadas pueden ser vulnerables si no validan correctamente los parámetros URI que se reciben. Una aplicación maliciosa puede proporcionar un URI modificado (por ejemplo, uno que contenga "/../") y engañar a tu aplicación para que devuelva el ParcelFileDescriptor de un archivo que no esté en el directorio previsto. Por tanto, permite que la aplicación maliciosa acceda a cualquier archivo accesible desde tu aplicación.

Hay dos estrategias recomendadas para eliminar una vulnerabilidad de directorio transversal en una clase ContentProvider.

1. Si tu ContentProvider no necesita estar expuesta a otras aplicaciones:

2. Si tu ContentProvider necesita estar expuesta a otras aplicaciones:

Comprueba que las entradas del valor openFile que contengan caracteres de directorios transversales no hagan que tu aplicación devuelva archivos inesperados. Para ello, comprueba la ruta canónica del archivo. Por ejemplo:

public ParcelFileDescriptor openFile (Uri uri, String mode)
   throws FileNotFoundException {
 File f = new File(DIR, uri.getLastPathSegment());
 if (!f.getCanonicalPath().startsWith(DIR)) {
   throw new IllegalArgumentException();
 }
 return ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY);
}
 

Advertencias: Ten en cuenta que ejecutar el comando getLastPathSegment en el parámetro Uri no es seguro. Una aplicación maliciosa puede proporcionar una ruta URI codificada como %2F..%2F..path%2Fto%2Fsecret.txt para que el resultado de getLastPathSegment sea /../../path/to/secret.txt. Por ejemplo, la siguiente implementación sigue siendo vulnerable a los ataques.

public ParcelFileDescriptor openFile(Uri uri, String mode){
 File f = new File(DIR, uri.getLastPathSegment());
 return ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY);
}
 

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?