CVE-2026-98993 in Linux
Tóm tắt
Bởi VulDB • 23/10/2026
Trong kernel Linux, các lỗ hổng sau đây đã được khắc phục:
namespace: không kế thừa MNT_UMOUNT trong clone_mnt()
MNT_UMOUNT được đặt trên một điểm gắn (mount) mà umount_tree() hoặc umount_one() đã lấy ra khỏi namespace của nó. Nó chưa bao giờ bị xóa bỏ. __detach_mounts() ngắt kết nối một điểm gắn mang cờ này thay vì thực hiện thao tác unmount đối với nó.
disconnect_mount() cho phép một con đã được unmount vẫn giữ nguyên trạng thái gắn kết nếu cha mẹ của nó có cờ đó. propagate_umount() sử dụng cờ này làm dấu hiệu nhận biết rằng một điểm gắn sắp bị unmount khi quyết định những gì khác có thể được unmount, xác định nơi chuỗi các điểm gắn đang khóa (locked) kết thúc và nơi thực hiện việc reparenting cho một overmount.
clone_mnt() sao chép các cờ của nguồn và chỉ che đi MNT_INTERNAL_FLAGS, vốn không bao gồm MNT_UMOUNT. Một điểm gắn đã được unmount lười (lazily) nhưng vẫn tồn tại nhờ một file descriptor có thể bị sao chép khi root của nó là tệp nsfs hoặc pidfs vì may_copy_tree() chấp nhận những trường hợp này trước khi kiểm tra xem nguồn có đang được mount hay không:
mount --bind /proc/self/ns/net /tmp/x exec 3< /tmp/x umount -l /tmp/x mount --bind /proc/self/fd/3 /tmp/y
Điểm gắn trên /tmp/y được đính vào namespace của người gọi với MNT_UMOUNT đã được đặt và mọi bản sao của nó đều kế thừa lại cờ này.
Điều này gây ra một số lỗi:
- Hủy liên kết điểm gắn (mountpoint) khỏi một mount namespace mà tại đó nó không phải là thành viên hợp lệ. __detach_mounts() coi đây là một điểm gắn đã bị unmount trước đó, ngắt kết nối nó với cha mẹ và giảm tham chiếu mà namespace giữ đối với nó. Nó vẫn tồn tại trong namespace nhưng thiếu một tham chiếu và trở thành cha mẹ của chính mình, do đó không thể thực hiện unmount thông qua file descriptor nữa và namespace sẽ không bao giờ tìm thấy nó lại. Khi namespace bị xóa bỏ, nó bị rò rỉ (leaked) và trỏ đến một struct mnt_namespace đã được giải phóng, có thể thay đổi propagation() và anon_ns_root() đọc trên sự thay đổi propagation tiếp theo hoặc mount_setattr() thông qua file descriptor.
- Biến nó thành shared và unmount một peer. trace_transfers() đi theo cờ từ peer vào chính nó và loại bỏ cờ đó khỏi nhóm peer của nó.
- Cho phép một propagated umount đạt tới nó. gather_candidates() đánh dấu nó với T_UMOUNT_CANDIDATE nhưng không bao giờ đưa nó vào danh sách ứng viên, do đó nhãn này chưa bao giờ bị xóa bỏ và mọi lần propagated unmount sau đó sẽ bỏ qua nó. Nếu nó là cha mẹ của một điểm gắn đang khóa (locked mount), handle_locked() coi đây là điểm cắt (cutoff) và cam kết thực hiện đối với con đã được khóa mà lẽ ra phải giữ lại, và disconnect_mount() để cho con này vẫn đính kèm vào nó, bị unmount dưới một cha mẹ đang mounted, điều mà disconnect_mount() tồn tại nhằm ngăn chặn. Khi namespace bị xóa bỏ, umount_tree() truy cập đến con lần thứ hai. Và một khi __detach_mounts() đã biến nó thành cha mẹ của chính mình, reparent() sẽ không bao giờ tìm thấy điểm kết thúc của chuỗi các cha mẹ đã được unmount.
Một clone là một điểm gắn mới chưa từng bị unmount trước đó. Hãy thêm MNT_UMOUNT vào MNT_INTERNAL_FLAGS để clone_mnt() không sao chép nó. Và đưa ra cảnh báo khi umount_tree() tiếp cận một điểm gắn mà cờ này đã được đặt sẵn.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.