CVE-2023-53317 in Linux
Tóm tắt
Bởi VulDB • 30/05/2026
Trong trường hợp này, lỗi xảy ra vì `ext4_validate_block_bitmap()` không kiểm tra các bit trong block bitmap nằm ngoài phạm vi hợp lệ của nhóm khối (block group). Cụ thể, nếu `blocks_per_group` là 64 nhưng block bitmap lại có các bit được đặt ở vị trí từ 64 trở đi (tức là giả định có ít nhất 128 khối), thì điều này vi phạm tính toàn vẹn của filesystem.
Để giải quyết vấn đề này, chúng ta cần thêm một kiểm tra trong hàm `ext4_validate_block_bitmap()` để đảm bảo rằng tất cả các bit trong block bitmap nằm ngoài phạm vi hợp lệ của nhóm khối đều phải bằng 0. Nếu không, filesystem sẽ bị coi là không hợp lệ.
Dưới đây là cách sửa đổi mã nguồn để thêm kiểm tra này:
### 1. Xác định vị trí cần sửa Hàm `ext4_validate_block_bitmap()` nằm trong file `fs/ext4/mballoc.c`.
### 2. Thêm kiểm tra Chúng ta sẽ thêm một vòng lặp để kiểm tra các bit trong block bitmap nằm ngoài phạm vi hợp lệ của nhóm khối. Nếu bất kỳ bit nào trong vùng này được đặt, hàm sẽ trả về lỗi.
### 3. Mã nguồn sửa đổi
```c static bool ext4_validate_block_bitmap(struct super_block *sb, struct ext4_group_desc *gdp, ext4_group_t block_group, struct buffer_head *bh) {
struct ext4_sb_info *sbi = EXT4_SB(sb); ext4_grpblk_t offset; unsigned long *bitmap; int i;
/* Check if the block bitmap is within the valid range */ if (ext4_block_bitmap_csum_verify(sb, block_group, gdp, bh)) return false;
/* Get the block bitmap buffer */ bitmap = (unsigned long *)bh->b_data;
/* Calculate the number of bits in the block bitmap */ int bits_per_bitmap = sb->s_blocksize * 8; int valid_bits = EXT4_BLOCKS_PER_GROUP(sb);
/* Check if any bits outside the valid range are set */ for (i = valid_bits; i < bits_per_bitmap; i++) {
if (test_bit(i, bitmap)) {
ext4_error(sb, "Invalid block bitmap: bit %d is set outside valid range (valid bits: 0-%d)", i, valid_bits - 1); return false; } }
/* Check if the block bitmap is consistent with the group descriptor */ for (offset = 0; offset < valid_bits; offset++) {
if (ext4_test_bit(offset, bitmap) != ext4_test_bit(offset, gdp->bg_block_bitmap)) {
ext4_error(sb, "Block bitmap mismatch for group %d", block_group); return false; } }
return true; } ```
### 4. Giải thích mã nguồn - **Kiểm tra checksum**: Đầu tiên, chúng ta kiểm tra checksum của block bitmap để đảm bảo dữ liệu không bị hỏng. - **Tính toán số bit hợp lệ**: `valid_bits` là số bit hợp lệ trong block bitmap, tương ứng với `EXT4_BLOCKS_PER_GROUP(sb)`. - **Kiểm tra các bit ngoài phạm vi hợp lệ**: Vòng lặp `for (i = valid_bits; i < bits_per_bitmap; i++)` kiểm tra xem có bất kỳ bit nào ngoài phạm vi hợp lệ được đặt hay không. Nếu có, hàm sẽ in ra thông báo lỗi và trả về `false`. - **Kiểm tra tính nhất quán**: Vòng lặp `for (offset = 0; offset < valid_bits; offset++)` kiểm tra xem block bitmap có nhất quán với nhóm mô tả hay không.
### 5. Kết quả Sau khi áp dụng sửa đổi này, nếu filesystem có block bitmap không hợp lệ (ví dụ: các bit ngoài phạm vi hợp lệ được đặt), hệ thống sẽ phát hiện và báo lỗi, giúp ngăn ngừa các vấn đề tiềm ẩn liên quan đến quản lý khối.
### 6. Lưu ý - Sửa đổi này chỉ ảnh hưởng đến việc kiểm tra tính toàn vẹn của filesystem. Nó không thay đổi cách thức hoạt động của ext4. - Nếu filesystem đã bị hỏng, bạn cần sử dụng công cụ như `e2fsck` để sửa chữa trước khi mount lại.
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.