| From bippy-5f407fcff5a0 Mon Sep 17 00:00:00 2001 |
| From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| To: <linux-cve-announce@vger.kernel.org> |
| Reply-to: <cve@kernel.org>, <linux-kernel@vger.kernel.org> |
| Subject: CVE-2024-53142: initramfs: avoid filename buffer overrun |
| |
| Description |
| =========== |
| |
| In the Linux kernel, the following vulnerability has been resolved: |
| |
| initramfs: avoid filename buffer overrun |
| |
| The initramfs filename field is defined in |
| Documentation/driver-api/early-userspace/buffer-format.rst as: |
| |
| 37 cpio_file := ALGN(4) + cpio_header + filename + "\0" + ALGN(4) + data |
| ... |
| 55 ============= ================== ========================= |
| 56 Field name Field size Meaning |
| 57 ============= ================== ========================= |
| ... |
| 70 c_namesize 8 bytes Length of filename, including final \0 |
| |
| When extracting an initramfs cpio archive, the kernel's do_name() path |
| handler assumes a zero-terminated path at @collected, passing it |
| directly to filp_open() / init_mkdir() / init_mknod(). |
| |
| If a specially crafted cpio entry carries a non-zero-terminated filename |
| and is followed by uninitialized memory, then a file may be created with |
| trailing characters that represent the uninitialized memory. The ability |
| to create an initramfs entry would imply already having full control of |
| the system, so the buffer overrun shouldn't be considered a security |
| vulnerability. |
| |
| Append the output of the following bash script to an existing initramfs |
| and observe any created /initramfs_test_fname_overrunAA* path. E.g. |
| ./reproducer.sh | gzip >> /myinitramfs |
| |
| It's easiest to observe non-zero uninitialized memory when the output is |
| gzipped, as it'll overflow the heap allocated @out_buf in __gunzip(), |
| rather than the initrd_start+initrd_size block. |
| |
| ---- reproducer.sh ---- |
| nilchar="A" # change to "\0" to properly zero terminate / pad |
| 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 )) # plus one to account for terminator |
| |
| 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 ---- |
| |
| Symlink filename fields handled in do_symlink() won't overrun past the |
| data segment, due to the explicit zero-termination of the symlink |
| target. |
| |
| Fix filename buffer overrun by aborting the initramfs FSM if any cpio |
| entry doesn't carry a zero-terminator at the expected (name_len - 1) |
| offset. |
| |
| The Linux kernel CVE team has assigned CVE-2024-53142 to this issue. |
| |
| |
| Affected and fixed versions |
| =========================== |
| |
| Issue introduced in 2.6.12 with commit 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 and fixed in 4.19.325 with commit bb7ac96670ab1d8d681015f9d66e45dad579af4d |
| Issue introduced in 2.6.12 with commit 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 and fixed in 5.4.287 with commit c509b1acbd867d9e09580fe059a924cb5825afb1 |
| Issue introduced in 2.6.12 with commit 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 and fixed in 5.10.231 with commit d3df9f26cff97beaa5643e551031795d5d5cddbe |
| Issue introduced in 2.6.12 with commit 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 and fixed in 5.15.174 with commit 6983b8ac787b3add5571cda563574932a59a99bb |
| Issue introduced in 2.6.12 with commit 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 and fixed in 6.1.120 with commit f892ddcf9f645380c358e73653cb0900f6bc9eb8 |
| Issue introduced in 2.6.12 with commit 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 and fixed in 6.6.64 with commit 1a423bbbeaf9e3e20c4686501efd9b661fe834db |
| Issue introduced in 2.6.12 with commit 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 and fixed in 6.11.11 with commit 49d01e736c3045319e030d1e75fb983011abaca7 |
| Issue introduced in 2.6.12 with commit 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 and fixed in 6.12.2 with commit fb83b093f75806333b6f4ae29b158d2e0e3ec971 |
| Issue introduced in 2.6.12 with commit 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 and fixed in 6.13 with commit e017671f534dd3f568db9e47b0583e853d2da9b5 |
| |
| Please see https://www.kernel.org for a full list of currently supported |
| kernel versions by the kernel community. |
| |
| Unaffected versions might change over time as fixes are backported to |
| older supported kernel versions. The official CVE entry at |
| https://cve.org/CVERecord/?id=CVE-2024-53142 |
| will be updated if fixes are backported, please check that for the most |
| up to date information about this issue. |
| |
| |
| Affected files |
| ============== |
| |
| The file(s) affected by this issue are: |
| init/initramfs.c |
| |
| |
| Mitigation |
| ========== |
| |
| The Linux kernel CVE team recommends that you update to the latest |
| stable kernel version for this, and many other bugfixes. Individual |
| changes are never tested alone, but rather are part of a larger kernel |
| release. Cherry-picking individual commits is not recommended or |
| supported by the Linux kernel community at all. If however, updating to |
| the latest release is impossible, the individual changes to resolve this |
| issue can be found at these commits: |
| https://git.kernel.org/stable/c/bb7ac96670ab1d8d681015f9d66e45dad579af4d |
| https://git.kernel.org/stable/c/c509b1acbd867d9e09580fe059a924cb5825afb1 |
| https://git.kernel.org/stable/c/d3df9f26cff97beaa5643e551031795d5d5cddbe |
| https://git.kernel.org/stable/c/6983b8ac787b3add5571cda563574932a59a99bb |
| https://git.kernel.org/stable/c/f892ddcf9f645380c358e73653cb0900f6bc9eb8 |
| https://git.kernel.org/stable/c/1a423bbbeaf9e3e20c4686501efd9b661fe834db |
| https://git.kernel.org/stable/c/49d01e736c3045319e030d1e75fb983011abaca7 |
| https://git.kernel.org/stable/c/fb83b093f75806333b6f4ae29b158d2e0e3ec971 |
| https://git.kernel.org/stable/c/e017671f534dd3f568db9e47b0583e853d2da9b5 |