CVE-2024-57979
Severity CVSS v4.0:
Pending analysis
Type:
CWE-416
Use After Free
Publication date:
27/02/2025
Last modified:
24/03/2025
Description
In the Linux kernel, the following vulnerability has been resolved:<br />
<br />
pps: Fix a use-after-free<br />
<br />
On a board running ntpd and gpsd, I&#39;m seeing a consistent use-after-free<br />
in sys_exit() from gpsd when rebooting:<br />
<br />
pps pps1: removed<br />
------------[ cut here ]------------<br />
kobject: &#39;(null)&#39; (00000000db4bec24): is not initialized, yet kobject_put() is being called.<br />
WARNING: CPU: 2 PID: 440 at lib/kobject.c:734 kobject_put+0x120/0x150<br />
CPU: 2 UID: 299 PID: 440 Comm: gpsd Not tainted 6.11.0-rc6-00308-gb31c44928842 #1<br />
Hardware name: Raspberry Pi 4 Model B Rev 1.1 (DT)<br />
pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)<br />
pc : kobject_put+0x120/0x150<br />
lr : kobject_put+0x120/0x150<br />
sp : ffffffc0803d3ae0<br />
x29: ffffffc0803d3ae0 x28: ffffff8042dc9738 x27: 0000000000000001<br />
x26: 0000000000000000 x25: ffffff8042dc9040 x24: ffffff8042dc9440<br />
x23: ffffff80402a4620 x22: ffffff8042ef4bd0 x21: ffffff80405cb600<br />
x20: 000000000008001b x19: ffffff8040b3b6e0 x18: 0000000000000000<br />
x17: 0000000000000000 x16: 0000000000000000 x15: 696e6920746f6e20<br />
x14: 7369203a29343263 x13: 205d303434542020 x12: 0000000000000000<br />
x11: 0000000000000000 x10: 0000000000000000 x9 : 0000000000000000<br />
x8 : 0000000000000000 x7 : 0000000000000000 x6 : 0000000000000000<br />
x5 : 0000000000000000 x4 : 0000000000000000 x3 : 0000000000000000<br />
x2 : 0000000000000000 x1 : 0000000000000000 x0 : 0000000000000000<br />
Call trace:<br />
kobject_put+0x120/0x150<br />
cdev_put+0x20/0x3c<br />
__fput+0x2c4/0x2d8<br />
____fput+0x1c/0x38<br />
task_work_run+0x70/0xfc<br />
do_exit+0x2a0/0x924<br />
do_group_exit+0x34/0x90<br />
get_signal+0x7fc/0x8c0<br />
do_signal+0x128/0x13b4<br />
do_notify_resume+0xdc/0x160<br />
el0_svc+0xd4/0xf8<br />
el0t_64_sync_handler+0x140/0x14c<br />
el0t_64_sync+0x190/0x194<br />
---[ end trace 0000000000000000 ]---<br />
<br />
...followed by more symptoms of corruption, with similar stacks:<br />
<br />
refcount_t: underflow; use-after-free.<br />
kernel BUG at lib/list_debug.c:62!<br />
Kernel panic - not syncing: Oops - BUG: Fatal exception<br />
<br />
This happens because pps_device_destruct() frees the pps_device with the<br />
embedded cdev immediately after calling cdev_del(), but, as the comment<br />
above cdev_del() notes, fops for previously opened cdevs are still<br />
callable even after cdev_del() returns. I think this bug has always<br />
been there: I can&#39;t explain why it suddenly started happening every time<br />
I reboot this particular board.<br />
<br />
In commit d953e0e837e6 ("pps: Fix a use-after free bug when<br />
unregistering a source."), George Spelvin suggested removing the<br />
embedded cdev. That seems like the simplest way to fix this, so I&#39;ve<br />
implemented his suggestion, using __register_chrdev() with pps_idr<br />
becoming the source of truth for which minor corresponds to which<br />
device.<br />
<br />
But now that pps_idr defines userspace visibility instead of cdev_add(),<br />
we need to be sure the pps->dev refcount can&#39;t reach zero while<br />
userspace can still find it again. So, the idr_remove() call moves to<br />
pps_unregister_cdev(), and pps_idr now holds a reference to pps->dev.<br />
<br />
pps_core: source serial1 got cdev (251:1)<br />
<br />
pps pps1: removed<br />
pps_core: unregistering pps1<br />
pps_core: deallocating pps1
Impact
Base Score 3.x
7.80
Severity 3.x
HIGH
Vulnerable products and versions
CPE | From | Up to |
---|---|---|
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 3.2.40 (including) | 3.3 (excluding) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 3.4.87 (including) | 3.5 (excluding) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 3.8.1 (including) | 5.4.291 (excluding) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.5 (including) | 5.10.235 (excluding) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.11 (including) | 5.15.179 (excluding) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.16 (including) | 6.1.129 (excluding) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.2 (including) | 6.6.76 (excluding) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.7 (including) | 6.12.13 (excluding) |
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.13 (including) | 6.13.2 (excluding) |
To consult the complete list of CPE names with products and versions, see this page
References to Advisories, Solutions, and Tools
- https://git.kernel.org/stable/c/1a7735ab2cb9747518a7416fb5929e85442dec62
- https://git.kernel.org/stable/c/785c78ed0d39d1717cca3ef931d3e51337b5e90e
- https://git.kernel.org/stable/c/7e5ee3281dc09014367f5112b6d566ba36ea2d49
- https://git.kernel.org/stable/c/85241f7de216f8298f6e48540ea13d7dcd100870
- https://git.kernel.org/stable/c/91932db1d96b2952299ce30c1c693d834d10ace6
- https://git.kernel.org/stable/c/c4041b6b0a7a3def8cf3f3d6120ff337bc4c40f7
- https://git.kernel.org/stable/c/c79a39dc8d060b9e64e8b0fa9d245d44befeefbe
- https://git.kernel.org/stable/c/cd3bbcb6b3a7caa5ce67de76723b6d8531fb7f64