CVE-2024-53142 in Linux
摘要
由 VulDB • 2026-05-30
在 Linux 内核中,已修复以下漏洞:
initramfs:避免文件名缓冲区溢出
initramfs 文件名字段在 Documentation/driver-api/early-userspace/buffer-format.rst 中定义如下:
37 cpio_file := ALGN(4) + cpio_header + filename + "\0" + ALGN(4) + data ... 55 ============= ================== ========================= 56 字段名称 字段大小 含义 57 ============= ================== ========================= ... 70 c_namesize 8 字节 文件名长度,包括最后的 \0
在提取 initramfs cpio 归档文件时,内核的 do_name() 路径处理程序假设 @collected 处存在以零结尾的路径,并将其直接传递给 filp_open() / init_mkdir() / init_mknod()。
如果特别构造的 cpio 条目携带一个未以零结尾的文件名,并且其后跟随未初始化的内存,则可能会创建一个带有代表未初始化内存的尾部字符的文件。能够创建 initramfs 条目意味着已经拥有对系统的完全控制权,因此该缓冲区溢出不应被视为安全漏洞。
将以下 bash 脚本的输出追加到现有的 initramfs 中,并观察任何创建的 /initramfs_test_fname_overrunAA* 路径。例如: ./reproducer.sh | gzip >> /myinitramfs
当输出被 gzip 压缩时,最容易观察到非零的未初始化内存,因为它会溢出 __gunzip() 中堆分配的 @out_buf,而不是 initrd_start+initrd_size 块。
---- reproducer.sh ---- nilchar="A" # 更改为 "\0" 以正确以零结尾/填充 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 )) # 加一以包含终止符
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 ----
do_symlink() 中处理的符号链接文件名字段不会超出数据段,因为符号链接目标具有明确的以零结尾。
通过在任何 cpio 条目未在预期 (name_len - 1) 偏移处携带以零结尾的情况下中止 initramfs 有限状态机 (FSM),来修复文件名缓冲区溢出问题。
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.