Saltar a contenido

Insecure File Provider Paths Setting

Configuración de rutas de File Provider insegura

Descripción

La aplicación expone un proveedor de archivos (file provider) utilizando androidx.core.content.FileProvider. El proveedor especifica los archivos disponibles en el atributo secundario de metadatos con el nombre android.support.FILE_PROVIDER_PATHS.

El atributo es necesario para generar la URI para los directorios especificados en el archivo de configuración android.support.FILE_PROVIDER_PATHS.

Android define varios tipos de rutas:

<root-path name="name" path="path"/>
  • Al consultar la documentación del FileProvider , no encontrará el <root-path...> entre las rutas disponibles. Esta ruta, aunque no está documentada, está disponible y se puede utilizar para proporcionar acceso al almacenamiento interno de la aplicación junto con /data y sdcard. Esta ruta otorga acceso a partes protegidas de la aplicación y del dispositivo y, por lo tanto, expone el sistema de archivos de la aplicación.
<files-path name="name" path="path"/>
  • Representan archivos en el subdirectorio files/ del área de almacenamiento interno de su aplicación. Este subdirectorio es el mismo que el valor devuelto por Context.getFilesDir().
<cache-path name="name" path="path"/>
  • Representan archivos en el subdirectorio cache del área de almacenamiento interno de su aplicación. La ruta raíz de este subdirectorio es la misma que el valor devuelto por getCacheDir().
<external-path name="name" path="path"/>
  • Representan archivos en la raíz del área de almacenamiento externo. La ruta raíz de este subdirectorio es la misma que el valor devuelto por Environment.getExternalStorageDirectory().
<external-files-path name="name" path="path"/>
  • Representan archivos en la raíz del área de almacenamiento externo de su aplicación. La ruta raíz de este subdirectorio es la misma que el valor devuelto por Context.getExternalFilesDir(null).
<external-cache-path name="name" path="path"/>
  • archivos en la raíz del área de caché externa de su aplicación. La ruta raíz de este subdirectorio es la misma que el valor devuelto por Context.getExternalCacheDir().
<external-media-path name="name" path="path"/>
  • Representan archivos en la raíz del área de medios externos de su aplicación. La ruta raíz de este subdirectorio es la misma que el valor devuelto por el primer resultado de Context.getExternalMediaDirs().

En el siguiente ejemplo, observamos que el proveedor tiene la configuración de carpeta raíz que nos permite acceder al directorio de inicio (que también incluye el directorio /data y /sdcard).

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <root-path name="root" path="/"/>
</paths>
Esta mala configuración se puede encadenar con otras vulnerabilidades como Intent Redirection para robar datos confidenciales o Remote Code Execution sobrescribiendo bibliotecas nativas.

Recomendación

Un proveedor de rutas de archivos inseguro es una vulnerabilidad en las aplicaciones de Android en la que una ruta de archivo se expone a otras aplicaciones o usuarios, lo que podría comprometer datos confidenciales o permitir el acceso no autorizado a los recursos del sistema.

Para proteger su aplicación de Android contra las vulnerabilidades derivadas de proveedores de rutas de archivos inseguros, tenga en cuenta estas recomendaciones:

  • Evite configuraciones permisivas como '.' en declaraciones external-path.
  • Evite usar root-path.
  • Evite asignar / como la ruta raíz
  • Use la etiqueta <grant-uri-permission> para controlar el acceso a archivos compartidos.
  • Prefiera usar el tipo de ruta external-files-path.
  • Use carpetas específicas para los atributos de ruta:

Por ejemplo, aquí hay un proveedor de archivos de ejemplo con la etiqueta external-files-path y un atributo de ruta específico Download/.

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-files-path
        name="downloads"
        path="Download/" />
</paths>

Enlaces

Estándares

  • OWASP_MASVS_L1:
    • MSTG_PLATFORM_4
  • OWASP_MASVS_L2:
    • MSTG_PLATFORM_4
  • CWE_TOP_25:
    • CWE_22
  • GDPR:
    • ART_5
    • ART_32
  • PCI_STANDARDS:
    • REQ_2_2
    • REQ_6_2
    • REQ_11_3
  • OWASP_MASVS_v2_1:
    • MASVS_PLATFORM_1
  • HIPAA_CONTROLS:
    • SECURITY251
    • SECURITY221
    • SECURITY212
    • SECURITY213
  • SOC2_CONTROLS:
    • CC_2_1
    • CC_4_1
    • CC_7_1
    • CC_7_2
    • CC_7_4
    • CC_7_5