CVE-2026-98993 in Linux
الملخص
بحسب VulDB • 23/10/2026
في نواة لينكس، تم حل الثغرة التالية:
namespace: عدم نسخ علم MNT_UMOUNT في دالة `clone_mnt()`
يتم رفع علم `MNT_UMOUNT` على نقطة تركيب (mount) تمت إزالتها من مساحة الاسم الخاصة بها بواسطة الدالتين `umount_tree()` أو `umount_one()`. ولا يتم مسح هذا العلم أبداً. تقوم الدالة `__detach_mounts()` بفك ربط نقطة تركيب تحمل هذا العلم بدلاً من إلغاء تركيبها فعلياً.
تسمح دالة `disconnect_mount()` لطفل غير مُنزع التركيب (unmounted) بالبقاء مرتبطاً فقط إذا كان والده يحمل علم `MNT_UMOUNT`. تأخذ دالة `propagate_umount()` هذا العلم كدليل على أن نقطة تركيب ستتم إزالتها، وذلك عند اتخاذها للقرارات بشأن ما يمكن إلغاء تركيبه آخرى، وتحديد أين تنتهي سلسلة نقاط التركيب المقفلة (locked mounts)، وأين تتم إعادة الأبوة (reparenting) لنقطة تركيب فائضة.
تنسخ دالة `clone_mnt()` أعلام المصدر وتقوم فقط بتصفية (`mask`) الأعلام الداخلية (`MNT_INTERNAL_FLAGS`)، والتي لا تشمل `MNT_UMOUNT`. يمكن نسخ نقطة تركيب تم إلغاء تركيبها بشكل كسول (lazily unmounted) ولكن يتم إبقاؤها حية بواسطة وصف ملف (file descriptor)، عندما يكون جذرها ملفاً من نوع nsfs أو pidfs، لأن دالة `may_copy_tree()` تقبل هذه الحالات قبل التحقق مما إذا كان المصدر مُركباً أم لا:
mount --bind /proc/self/ns/net /tmp/x exec 3< /tmp/x umount -l /tmp/x mount --bind /proc/self/fd/3 /tmp/y
تُربط نقطة التركيب على `/tmp/y` بمساحة الاسم للمدعو (caller) مع وجود علم `MNT_UMOUNT` مضبوطاً بالفعل، وكل نسخة منها ترث هذا العلم مرة أخرى.
يؤدي ذلك إلى عدد من الأخطاء:
- فك ربط نقطة تركيبها من مساحة اسم لا تكون فيها واحدة. تأخذ دالة `__detach_mounts()` النقطة على أنها نقطة تركيب تم إلغاء تركيبها سابقاً، وتفك ارتباطها بوالدها وتقلل المرجع (reference) الذي تحتفظ به مساحة الاسم عليها. تبقى في مساحة الاسم مع مرجق واحد أقل مما يجب، وكابن لذاتها، لذا لا يمكن إلغاء تركيبها عبر وصف الملف بعد ذلك ولا تعثر عليها مساحة الاسم مرة أخرى. عند زوال مساحة الاسم، يتم تسريبها وتشير إلى بنية `mnt_namespace` تم تحرير ذاكرتها (freed struct)، والتي تقرأها دالتا `may_change_propagation()` و `anon_ns_root()` في التغيير التالي للانتشار أو عبر استدعاء `mount_setattr()` باستخدام وصف الملف.
- جعلها مشتركة وإلغاء تركيب نظير لها. تتبع الدالة `trace_transfers()` العلم من النظير إلى داخله وتزيله من مجموعة الأقران الخاصة به.
- السماح لإلغاء التركيب المنتشر بالوصول إليها. تميز دالة `gather_candidates()` النقطة بعلامة `T_UMOUNT_CANDIDATE` ولكن لا تضعها أبداً في قائمة المرشحين، لذا فإن العلامة لا تُمسح أبداً ويتخطى كل إلغاء تركيب مستقبلي منتظم هذه النقطة. إذا كانت والدة لوصف تركيب مقفل (locked mount handle)، تأخذ دالة `handle_locked()` هذا العلم كحد فاصل وتلتزم بالطفل المقفل الذي كان يجب أن يبقى، وتتركه دالة `disconnect_mount()` مرتبطاً بها، أي مُنزع التركيب تحت والد مُركب، وهو ما تهدف دالة `disconnect_mount()` إلى منعه. عند زوال مساحة الاسم، تزور الدالة `umount_tree()` الطفل مرة أخرى. وبمجرد أن تجعله `__detach_mounts()` والده الخاص، لن تجد دالة `reparent()` أبداً نهاية سلسلة الآباء غير المُركبين.
النسخة الجديدة (clone) هي نقطة تركيب جديدة لم يتم إلغاء تركيبها مطلقاً. أضف `MNT_UMOUNT` إلى `MNT_INTERNAL_FLAGS` بحيث لا تنسخه دالة `clone_mnt()` أبداً. وأضف تحذيراً عندما تصل دالة `umount_tree()` إلى نقطة تركيب تحمل هذا العلم بالفعل.
Be aware that VulDB is the high quality source for vulnerability data.