| 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-43853: cgroup/cpuset: Prevent UAF in proc_cpuset_show() |
| |
| Description |
| =========== |
| |
| In the Linux kernel, the following vulnerability has been resolved: |
| |
| cgroup/cpuset: Prevent UAF in proc_cpuset_show() |
| |
| An UAF can happen when /proc/cpuset is read as reported in [1]. |
| |
| This can be reproduced by the following methods: |
| 1.add an mdelay(1000) before acquiring the cgroup_lock In the |
| cgroup_path_ns function. |
| 2.$cat /proc/<pid>/cpuset repeatly. |
| 3.$mount -t cgroup -o cpuset cpuset /sys/fs/cgroup/cpuset/ |
| $umount /sys/fs/cgroup/cpuset/ repeatly. |
| |
| The race that cause this bug can be shown as below: |
| |
| (umount) | (cat /proc/<pid>/cpuset) |
| css_release | proc_cpuset_show |
| css_release_work_fn | css = task_get_css(tsk, cpuset_cgrp_id); |
| css_free_rwork_fn | cgroup_path_ns(css->cgroup, ...); |
| cgroup_destroy_root | mutex_lock(&cgroup_mutex); |
| rebind_subsystems | |
| cgroup_free_root | |
| | // cgrp was freed, UAF |
| | cgroup_path_ns_locked(cgrp,..); |
| |
| When the cpuset is initialized, the root node top_cpuset.css.cgrp |
| will point to &cgrp_dfl_root.cgrp. In cgroup v1, the mount operation will |
| allocate cgroup_root, and top_cpuset.css.cgrp will point to the allocated |
| &cgroup_root.cgrp. When the umount operation is executed, |
| top_cpuset.css.cgrp will be rebound to &cgrp_dfl_root.cgrp. |
| |
| The problem is that when rebinding to cgrp_dfl_root, there are cases |
| where the cgroup_root allocated by setting up the root for cgroup v1 |
| is cached. This could lead to a Use-After-Free (UAF) if it is |
| subsequently freed. The descendant cgroups of cgroup v1 can only be |
| freed after the css is released. However, the css of the root will never |
| be released, yet the cgroup_root should be freed when it is unmounted. |
| This means that obtaining a reference to the css of the root does |
| not guarantee that css.cgrp->root will not be freed. |
| |
| Fix this problem by using rcu_read_lock in proc_cpuset_show(). |
| As cgroup_root is kfree_rcu after commit d23b5c577715 |
| ("cgroup: Make operations on the cgroup root_list RCU safe"), |
| css->cgroup won't be freed during the critical section. |
| To call cgroup_path_ns_locked, css_set_lock is needed, so it is safe to |
| replace task_get_css with task_css. |
| |
| [1] https://syzkaller.appspot.com/bug?extid=9b1ff7be974a403aa4cd |
| |
| The Linux kernel CVE team has assigned CVE-2024-43853 to this issue. |
| |
| |
| Affected and fixed versions |
| =========================== |
| |
| Issue introduced in 4.6 with commit a79a908fd2b080977b45bf103184b81c9d11ad07 and fixed in 4.19.321 with commit 27d6dbdc6485d68075a0ebf8544d6425c1ed84bb |
| Issue introduced in 4.6 with commit a79a908fd2b080977b45bf103184b81c9d11ad07 and fixed in 5.4.283 with commit 10aeaa47e4aa2432f29b3e5376df96d7dac5537a |
| Issue introduced in 4.6 with commit a79a908fd2b080977b45bf103184b81c9d11ad07 and fixed in 5.10.225 with commit 688325078a8b5badd6e07ae22b27cd04e9947aec |
| Issue introduced in 4.6 with commit a79a908fd2b080977b45bf103184b81c9d11ad07 and fixed in 5.15.166 with commit 4e8d6ac8fc9f843e940ab7389db8136634e07989 |
| Issue introduced in 4.6 with commit a79a908fd2b080977b45bf103184b81c9d11ad07 and fixed in 6.1.103 with commit 29a8d4e02fd4840028c38ceb1536cc8f82a257d4 |
| Issue introduced in 4.6 with commit a79a908fd2b080977b45bf103184b81c9d11ad07 and fixed in 6.6.44 with commit 96226fbed566f3f686f53a489a29846f2d538080 |
| Issue introduced in 4.6 with commit a79a908fd2b080977b45bf103184b81c9d11ad07 and fixed in 6.10.3 with commit 29ac1d238b3bf126af36037df80d7ecc4822341e |
| Issue introduced in 4.6 with commit a79a908fd2b080977b45bf103184b81c9d11ad07 and fixed in 6.11 with commit 1be59c97c83ccd67a519d8a49486b3a8a73ca28a |
| |
| 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-43853 |
| 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: |
| kernel/cgroup/cpuset.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/27d6dbdc6485d68075a0ebf8544d6425c1ed84bb |
| https://git.kernel.org/stable/c/10aeaa47e4aa2432f29b3e5376df96d7dac5537a |
| https://git.kernel.org/stable/c/688325078a8b5badd6e07ae22b27cd04e9947aec |
| https://git.kernel.org/stable/c/4e8d6ac8fc9f843e940ab7389db8136634e07989 |
| https://git.kernel.org/stable/c/29a8d4e02fd4840028c38ceb1536cc8f82a257d4 |
| https://git.kernel.org/stable/c/96226fbed566f3f686f53a489a29846f2d538080 |
| https://git.kernel.org/stable/c/29ac1d238b3bf126af36037df80d7ecc4822341e |
| https://git.kernel.org/stable/c/1be59c97c83ccd67a519d8a49486b3a8a73ca28a |