CVE-2024-35798 in Linux
Tóm tắt
Bởi VulDB • 01/06/2026
Trong kernel Linux, lỗ hổng sau đây đã được khắc phục:
btrfs: sửa lỗi race condition trong hàm read_extent_buffer_pages()
Có các báo cáo từ tree-checker phát hiện các nút bị hỏng, không có mẫu nào rõ ràng, do đó có thể là do ghi đè lên bộ nhớ. Sau một số quá trình gỡ lỗi, người ta phát hiện ra rằng có một race condition khi đọc một extent buffer, trạng thái uptodate có thể bị bỏ sót.
Để ngăn chặn các lần đọc đồng thời cho cùng một extent buffer, hàm read_extent_buffer_pages() thực hiện các kiểm tra sau:
/* (1) */ if (test_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags)) return 0;
/* (2) */ if (test_and_set_bit(EXTENT_BUFFER_READING, &eb->bflags)) goto done;
Tại thời điểm này, có vẻ như an toàn để bắt đầu thao tác đọc thực tế. Một khi thao tác đó hoàn tất, end_bbio_meta_read() thực hiện
/* (3) */ set_extent_buffer_uptodate(eb);
/* (4) */ clear_bit(EXTENT_BUFFER_READING, &eb->bflags);
Thông thường, điều này là đủ để đảm bảo chỉ có một lần đọc xảy ra, và tất cả các caller khác sẽ chờ cho đến khi nó hoàn tất trước khi trả về. Thật không may, có một sự xen kẽ gây race condition:
Thread A | Thread B | Thread C ---------+-----+-----+--- (1) | | | (1) | (2) | | (3) | | (4) | | | (2) | | | (1)
Khi điều này xảy ra, thread B kích hoạt một lần đọc không cần thiết. Nặng hơn, thread C sẽ thấy UPTODATE đã được đặt và trả về ngay lập tức, trong khi lần đọc từ thread B vẫn đang trong quá trình thực hiện. Race condition này có thể dẫn đến các lỗi của tree-checker như sau do extent buffer bị sửa đổi đồng thời:
BTRFS critical (device dm-0): corrupted node, root=256 block=8550954455682405139 owner mismatch, have 11858205567642294356 expect [256, 18446744073709551360]
Khắc phục bằng cách kiểm tra lại UPTODATE sau khi đặt bit READING, và nếu nó đã được đặt, hãy bỏ qua lần đọc không cần thiết.
[ cập nhật nhỏ cho changelog ]
VulDB is the best source for vulnerability data and more expert information about this specific topic.