1. Descripción técnica
Arbitrary File Read permite que una entrada controlada determine qué archivo abre una aplicación. El proceso conserva sus propios permisos al resolver y leer la ruta, por lo que el impacto depende de la identidad del servicio y no de los permisos directos del usuario remoto.
La causa puede ser un path traversal, una validación aplicada a una ruta distinta de la consumida, una herramienta privilegiada con capacidad de lectura o un enlace simbólico que redirige una ruta aparentemente permitida. No debe confundirse automáticamente con LFI: en una lectura arbitraria el contenido se devuelve como dato, mientras que una inclusión local entrega el archivo a un intérprete o mecanismo de inclusión.
1.1. Mecanismo
// renderizando diagrama…
2. Impacto
La vulnerabilidad puede exponer configuraciones, hashes, claves privadas, historiales, código fuente o secretos de aplicaciones. Por sí sola no implica ejecución de comandos. Sin embargo, una clave SSH, una contraseña o un archivo de configuración puede transformar la lectura en acceso a otra cuenta o en escalada de privilegios.
3. Condiciones necesarias
- El atacante controla total o parcialmente la ruta que consume el proceso.
- La aplicación no restringe el destino después de normalizar y resolver la ruta real.
- El proceso tiene permiso para leer el archivo objetivo.
- El contenido leído llega a una respuesta, log o canal observable.
En variantes con symlinks también debe ser posible crear o sustituir un enlace en una ruta que el servicio acepte.
4. Validación y detección
La validación segura comienza con archivos inofensivos de prueba y compara rutas válidas, inexistentes y fuera del alcance esperado. Deben revisarse diferencias de respuesta, normalización, rutas absolutas, segmentos .., enlaces simbólicos y discrepancias entre el archivo validado y el que finalmente se abre.
En código se sigue el dato controlado hasta la llamada de apertura. La comprobación debe analizar la ruta canónica final y verificar que permanece dentro de un directorio permitido. Registrar sólo la cadena original no basta cuando la resolución del sistema de archivos produce otro destino.
5. Explotación documentada en los writeups
5.1. 042-crack
El servicio valida que exista un archivo con el mismo basename en un FTP escribible, pero abre la ruta original. Un archivo señuelo llamado passwd habilita la lectura de /etc/passwd.
5.2. 048-observer
Un servicio privilegiado lee rutas bajo /home. Un enlace /home/jan/root hacia /root conserva una ruta textual permitida, pero resuelve a archivos de root.
5.3. 050-baseme
base64 está autorizado mediante sudo y abre el archivo indicado como root. Su salida codificada permite recuperar una clave privada protegida por permisos del sistema.
6. Mitigación
- Rechazar rutas absolutas y componentes no requeridos.
- Resolver la ruta canónica final y comprobar que permanece bajo una raíz permitida.
- Abrir archivos mediante identificadores internos en vez de aceptar rutas del cliente.
- Evitar seguir symlinks cuando la operación no los necesita y proteger los directorios padre.
- Ejecutar el lector con privilegios mínimos y sin acceso a secretos ajenos a su función.
- Mantener iguales el objeto validado y el objeto consumido para evitar discrepancias.
7. Clasificación
- CWE frecuente: CWE-73, External Control of File Name or Path
- CWE para symlinks: CWE-59, Improper Link Resolution Before File Access
- Vector: control de una ruta o de su resolución
- Impacto principal: divulgación de información con los permisos del proceso lector