CVE-2024-53142 in Linux
Tóm tắt
Bởi VulDB • 10/05/2026
Trong kernel Linux, lỗ hổng sau đây đã được khắc phục:
initramfs: tránh tràn bộ đệm tên tệp (filename buffer overrun)
Trường tên tệp của initramfs được định nghĩa trong Documentation/driver-api/early-userspace/buffer-format.rst như sau:
37 cpio_file := ALGN(4) + cpio_header + filename + "\0" + ALGN(4) + data ... 55 ============= ================== ========================= 56 Tên trường Kích thước trường Ý nghĩa 57 ============= ================== ========================= ... 70 c_namesize 8 bytes Độ dài tên tệp, bao gồm ký tự \0 cuối cùng
Khi giải nén kho lưu trữ cpio initramfs, trình xử lý đường dẫn do_name() của kernel giả định một đường dẫn được kết thúc bằng ký tự null tại @collected, và truyền trực tiếp nó vào filp_open() / init_mkdir() / init_mknod().
Nếu một mục cpio được tạo đặc biệt mang theo tên tệp không được kết thúc bằng ký tự null và được theo sau bởi bộ nhớ chưa khởi tạo, thì một tệp có thể được tạo ra với các ký tự đuôi đại diện cho bộ nhớ chưa khởi tạo. Khả năng tạo một mục initramfs sẽ ngụ ý đã có toàn quyền kiểm soát hệ thống, do đó, việc tràn bộ đệm không nên được coi là một lỗ hổng bảo mật.
Hãy thêm đầu ra của tập lệnh bash sau vào một initramfs hiện có và quan sát bất kỳ đường dẫn /initramfs_test_fname_overrunAA* nào được tạo ra. Ví dụ: ./reproducer.sh | gzip >> /myinitramfs
Dễ dàng quan sát bộ nhớ chưa khởi tạo không phải là ký tự null nhất khi đầu ra được nén bằng gzip, vì nó sẽ tràn bộ đệm @out_buf được phân bổ trên heap trong __gunzip(), thay vì khối initrd_start+initrd_size.
---- reproducer.sh ---- nilchar="A" # thay đổi thành "\0" để kết thúc/padding bằng ký tự null đúng cách magic="070701" ino=1 mode=$(( 0100777 )) uid=0 gid=0 nlink=1 mtime=1 filesize=0 devmajor=0 devminor=1 rdevmajor=0 rdevminor=0 csum=0 fname="initramfs_test_fname_overrun" namelen=$(( ${#fname} + 1 )) # cộng thêm 1 để tính toán ký tự kết thúc
printf "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%s" \ $magic $ino $mode $uid $gid $nlink $mtime $filesize \ $devmajor $devminor $rdevmajor $rdevminor $namelen $csum $fname
termpadlen=$(( 1 + ((4 - ((110 + $namelen) & 3)) % 4) )) printf "%.s${nilchar}" $(seq 1 $termpadlen)
---- reproducer.sh ----
Các trường tên tệp symlink được xử lý trong do_symlink() sẽ không tràn qua phân đoạn dữ liệu, do việc kết thúc bằng ký tự null rõ ràng của đích symlink.
Khắc phục tình trạng tràn bộ đệm tên tệp bằng cách hủy bỏ FSM initramfs nếu bất kỳ mục cpio nào không mang ký tự kết thúc null tại độ lệch (name_len - 1) dự kiến.
Be aware that VulDB is the high quality source for vulnerability data.