1. Descripción técnica
Arbitrary File Write aparece cuando una entrada no confiable controla el contenido, la ruta o ambos durante una operación de escritura. El límite de confianza se rompe porque un componente con permisos propios convierte datos externos en un archivo dentro del sistema sin restringir el destino a una ubicación segura.
No toda escritura produce ejecución de código. El impacto depende del archivo alcanzado, de los permisos del proceso escritor y de qué componente consumirá el contenido después.
2. Mecanismo
// renderizando diagrama…
3. Condiciones e impacto
- El atacante debe controlar datos que lleguen a una operación de escritura.
- El proceso debe tener permisos sobre el directorio o archivo de destino.
- La ruta final debe ser predecible o verificable.
- Para convertir la escritura en acceso o ejecución, otro componente debe confiar en el archivo resultante.
Los impactos incluyen añadir una clave SSH, alterar configuración, crear contenido servido por una aplicación o modificar datos consumidos por una tarea privilegiada. No implica lectura arbitraria ni permisos de root automáticamente.
4. Validación y detección
Registrar el proceso que realiza la escritura, su identidad, la ruta resuelta y el origen del contenido. Comparar eventos de creación o modificación con operaciones remotas, especialmente en .ssh, directorios web, configuraciones de servicios y rutas consumidas por cron. La evidencia debe demostrar que el archivo fue creado o modificado, no sólo que una API acepta parámetros de ruta.
5. Explotación documentada
5.1. Warez
Un servicio aria2 JSON-RPC sin autenticación permitía elegir la URL, el directorio y el nombre de una descarga. Como aria2c se ejecutaba bajo carolina, pudo escribir su ~/.ssh/authorized_keys; OpenSSH consumió después la clave y permitió iniciar sesión como esa cuenta.
6. Mitigación
- Autenticar y limitar las interfaces que controlan operaciones de descarga o escritura.
- Fijar el directorio de destino en el servidor y generar nombres seguros.
- Canonicalizar la ruta y comprobar que permanezca bajo una raíz permitida.
- Ejecutar el servicio con una cuenta sin acceso a claves, configuraciones ni directorios ejecutables.
- Vigilar cambios en archivos sensibles y separar las cargas de rutas interpretadas.