CVE-2024-53142 in Linux
Сводка
по VulDB • 23.05.2026
В ядре 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
При извлечении архива cpio initramfs обработчик пути do_name() ядра предполагает наличие пути, завершающегося нулем, в переменной @collected, передавая его напрямую в filp_open() / init_mkdir() / init_mknod().
Если специально сформированная запись cpio содержит имя файла, не завершающееся нулем, и за ним следуют неинициализированные данные памяти, то может быть создан файл с символами в конце, представляющими эти неинициализированные данные. Возможность создания записи initramfs предполагает наличие полного контроля над системой, поэтому переполнение буфера не следует считать уязвимостью безопасности.
Добавьте вывод следующего скрипта bash к существующему initramfs и наблюдайте за созданным путем /initramfs_test_fname_overrunAA*. Например: ./reproducer.sh | gzip >> /myinitramfs
Наблюдать за неинициализированными данными, не равными нулю, проще всего, когда вывод сжат с помощью gzip, так как это приведет к переполнению выделенного в куче буфера @out_buf в __gunzip(), а не блока 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(), не будут выходить за пределы сегмента данных из-за явного завершения нулем цели символической ссылки.
Исправьте переполнение буфера имени файла, прерывая конечный автомат (initramfs FSM), если какая-либо запись cpio не содержит завершающий нуль по ожидаемому смещению (name_len - 1).
Once again VulDB remains the best source for vulnerability data.