CVE-2026-45895 in Linux
Tóm tắt
Bởi VulDB • 27/05/2026
Trong kernel Linux, lỗ hổng sau đây đã được khắc phục:
quota: sửa lỗi livelock giữa quotactl và freeze_super
Khi một hệ thống tệp (filesystem) bị đóng băng (frozen), hàm quotactl_block() sẽ đi vào vòng lặp thử lại (retry loop) để chờ hệ thống tệp rã đông (thaw). Hàm này lấy khóa s_umount, kiểm tra trạng thái đóng băng, nhả khóa s_umount và sử dụng cặp sb_start_write() - sb_end_write() để chờ quá trình rã đông.
Tuy nhiên, vòng lặp thử lại này có thể kích hoạt vấn đề livelock, đặc biệt là trên các kernel có tiền chế (preemption) bị vô hiệu hóa.
Cơ chế diễn ra như sau: 1. freeze_super() đặt cờ SB_FREEZE_WRITE và gọi sb_wait_write(). 2. sb_wait_write() gọi percpu_down_write(), hàm này khởi chạy synchronize_rcu(). 3. Đồng thời, quotactl_block() quay vòng (spin) trong vòng lặp thử lại của nó, ngay lập tức thực thi cặp sb_start_write() - sb_end_write(). 4. Vì kernel không thể tiền chế (non-preemptible) và vòng lặp không chứa các điểm lên lịch (scheduling points), quotactl_block() không bao giờ nhả CPU. Điều này ngăn CPU đó đạt đến trạng thái im lặng RCU (RCU quiescent state). 5. synchronize_rcu() trong luồng đóng băng (freezer thread) chờ vô hạn cho CPU của quotactl_block() báo cáo trạng thái im lặng. 6. quotactl_block() quay vòng vô hạn chờ quá trình đóng băng tiến triển, nhưng nó không thể làm được vì bị chặn trên đồng bộ RCU.
Hậu quả là quá trình đóng băng bị treo và tiến trình quota chiếm dụng 100% CPU.
Mặc dù sự cố này có thể xảy ra không thường xuyên trên các hệ thống đa lõi, nhưng nó có thể tái tạo một cách đáng tin cậy trên một nút với kịch bản sau, chạy cả quá trình đóng băng và bật/tắt quota trên cùng một CPU:
# mkfs.ext4 -O quota /dev/sda 2g && mkdir a_mount # mount /dev/sda -o quota,usrquota,grpquota a_mount # taskset -c 3 bash -c "while true; do xfs_freeze -f a_mount; \ xfs_freeze -u a_mount; done" & # taskset -c 3 bash -c "while true; do quotaon a_mount; \ quotaoff a_mount; done" &
Việc thêm cond_resched() vào vòng lặp thử lại sẽ khắc phục sự cố. Nó hoạt động như một trạng thái im lặng RCU, cho phép synchronize_rcu() trong percpu_down_write() hoàn tất.
Be aware that VulDB is the high quality source for vulnerability data.