Overview
About vulnerability
In the Linux kernel, the following vulnerability has been resolved:
libceph: fix potential use-after-free in have_mon_and_osd_map()
The wait loop in __ceph_open_session() can race with the client receiving a new monmap or osdmap shortly after the initial map is received. Both ceph_monc_handle_map() and handle_one_map() install a new map immediately after freeing the old one
kfree(monc->monmap); monc->monmap = monmap;
ceph_osdmap_destroy(osdc->osdmap); osdc->osdmap = newmap;
under client->monc.mutex and client->osdc.lock respectively, but because neither is taken in have_mon_and_osd_map() it’s possible for client->monc.monmap->epoch and client->osdc.osdmap->epoch arms in
client->monc.monmap && client->monc.monmap->epoch && client->osdc.osdmap && client->osdc.osdmap->epoch;
condition to dereference an already freed map. This happens to be reproducible with generic/395 and generic/397 with KASAN enabled:
BUG: KASAN: slab-use-after-free in have_mon_and_osd_map+0x56/0x70
Read of size 4 at addr ffff88811012d810 by task mount.ceph/13305
CPU: 2 UID: 0 PID: 13305 Comm: mount.ceph Not tainted 6.14.0-rc2-build2+ #1266
…
Call Trace:
Allocated by task 13305: ceph_osdmap_alloc+0x16/0x130 ceph_osdc_init+0x27a/0x4c0 ceph_create_client+0x153/0x190 create_fs_client+0x50/0x2a0 ceph_get_tree+0xff/0x680 vfs_get_tree+0x49/0x180 do_new_mount+0x1a3/0x2d0 path_mount+0x6dd/0x730 do_mount+0x99/0xe0 __do_sys_mount+0x141/0x180 do_syscall_64+0x9f/0x100 entry_SYSCALL_64_after_hwframe+0x76/0x7e
Freed by task 9475: kfree+0x212/0x290 handle_one_map+0x23c/0x3b0 ceph_osdc_handle_map+0x3c9/0x590 mon_dispatch+0x655/0x6f0 ceph_con_process_message+0xc3/0xe0 ceph_con_v1_try_read+0x614/0x760 ceph_con_workfn+0x2de/0x650 process_one_work+0x486/0x7c0 process_scheduled_works+0x73/0x90 worker_thread+0x1c8/0x2a0 kthread+0x2ec/0x300 ret_from_fork+0x24/0x40 ret_from_fork_asm+0x1a/0x30
Rewrite the wait loop to check the above condition directly with client->monc.mutex and client->osdc.lock taken as appropriate. While at it, improve the timeout handling (previously mount_timeout could be exceeded in case wait_event_interruptible_timeout() slept more than once) and access client->auth_err under client->monc.mutex to match how it’s set in finish_auth().
monmap_show() and osdmap_show() now take the respective lock before accessing the map as well.
Details
- Affected product:
- AlmaLinux 9.2 ESU , CentOS 7 ELS , CentOS 8.4 ELS , CentOS 8.5 ELS , CentOS Stream 8 ELS , CloudLinux 7 ELS , Oracle Linux 7 ELS , RHEL 7 ELS , TuxCare 9.6 ESU , Ubuntu 20.04 ELS
- Affected packages:
- kernel @ 5.14.0 (+10 more)
Fixes
KernelCare state
Live-patch status from KernelCare for each operating system.
| Operating system | Status | Covered kernels |
|---|---|---|
| AlmaLinux 10 | Will Not Fix |
20 kernels
|
| AlmaLinux 8 | Released |
87 kernels
|
| AlmaLinux 9 | Released |
85 kernels
|
| AlmaLinux 9.2 ESU | Planned | — |
| AlmaLinux 9.6 ESU | Released |
1 kernel
|
| Amazon Linux 2023 | Planned | — |
| CentOS 7 | Released |
35 kernels
|
| CentOS 7 ELS | Planned | — |
| CentOS 7 plus | Released |
23 kernels
|
| CentOS 8 | Released |
21 kernels
|
| CloudLinux OS 6h | Released |
8 kernels
|
| CloudLinux OS 7 | Released |
9 kernels
|
| CloudLinux OS 7h | Released |
88 kernels
|
| CloudLinux OS 8 | Released |
87 kernels
|
| Debian 12 | Released |
32 kernels
|
| Debian 13 | Will Not Fix | — |
| Oracle Linux 10 | Will Not Fix |
21 kernels
|
| Oracle Linux 7 | Released |
50 kernels
|
| Oracle Linux 8 | Released |
100 kernels
|
| Oracle Linux 8 UEK 7 | Released |
83 kernels
|
| Oracle Linux 9 | Released |
93 kernels
|
| Oracle Linux 9 UEK 7 | Released |
83 kernels
|
| Proxmox VE 7 5.15 | Released |
47 kernels
|
| RHEL 10 | Will Not Fix |
23 kernels
|
| RHEL 7 | Released |
51 kernels
|
| RHEL 8 | Released |
95 kernels
|
| RHEL8 EUS 8.6 | Released |
56 kernels
|
| RHEL 9 | Released |
87 kernels
|
| Rocky Linux 10 | Will Not Fix |
15 kernels
|
| Rocky Linux 8 | Released |
74 kernels
|
| Rocky Linux 9 | Released |
73 kernels
|
| Ubuntu 20.04 HWE AWS | Released |
57 kernels
|
| Ubuntu 20.04 HWE Azure | Released |
40 kernels
|
| Ubuntu 22.04 | Released |
90 kernels
|
| Ubuntu 22.04 AWS | Released |
81 kernels
|
| Ubuntu 22.04 Azure | Released |
73 kernels
|
| Ubuntu 24.04 | Planned | — |
| Ubuntu 24.04 AWS | Planned | — |