CVE-2024-38613
Severity CVSS v4.0:
Pending analysis
Type:
CWE-362
Concurrent Execution using Shared Resource with Improper Synchronization ('Race Condition')
Publication date:
19/06/2024
Last modified:
17/09/2025
Description
In the Linux kernel, the following vulnerability has been resolved:<br />
<br />
m68k: Fix spinlock race in kernel thread creation<br />
<br />
Context switching does take care to retain the correct lock owner across<br />
the switch from &#39;prev&#39; to &#39;next&#39; tasks. This does rely on interrupts<br />
remaining disabled for the entire duration of the switch.<br />
<br />
This condition is guaranteed for normal process creation and context<br />
switching between already running processes, because both &#39;prev&#39; and<br />
&#39;next&#39; already have interrupts disabled in their saved copies of the<br />
status register.<br />
<br />
The situation is different for newly created kernel threads. The status<br />
register is set to PS_S in copy_thread(), which does leave the IPL at 0.<br />
Upon restoring the &#39;next&#39; thread&#39;s status register in switch_to() aka<br />
resume(), interrupts then become enabled prematurely. resume() then<br />
returns via ret_from_kernel_thread() and schedule_tail() where run queue<br />
lock is released (see finish_task_switch() and finish_lock_switch()).<br />
<br />
A timer interrupt calling scheduler_tick() before the lock is released<br />
in finish_task_switch() will find the lock already taken, with the<br />
current task as lock owner. This causes a spinlock recursion warning as<br />
reported by Guenter Roeck.<br />
<br />
As far as I can ascertain, this race has been opened in commit<br />
533e6903bea0 ("m68k: split ret_from_fork(), simplify kernel_thread()")<br />
but I haven&#39;t done a detailed study of kernel history so it may well<br />
predate that commit.<br />
<br />
Interrupts cannot be disabled in the saved status register copy for<br />
kernel threads (init will complain about interrupts disabled when<br />
finally starting user space). Disable interrupts temporarily when<br />
switching the tasks&#39; register sets in resume().<br />
<br />
Note that a simple oriw 0x700,%sr after restoring sr is not enough here<br />
- this leaves enough of a race for the &#39;spinlock recursion&#39; warning to<br />
still be observed.<br />
<br />
Tested on ARAnyM and qemu (Quadra 800 emulation).
Impact
Base Score 3.x
4.70
Severity 3.x
MEDIUM
Vulnerable products and versions
| CPE | From | Up to |
|---|---|---|
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 3.7 (including) | 4.19.316 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 4.20 (including) | 5.4.278 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.5 (including) | 5.10.219 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.11 (including) | 5.15.161 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 5.16 (including) | 6.1.93 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.2 (including) | 6.6.33 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.7 (including) | 6.8.12 (excluding) |
| cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:* | 6.9 (including) | 6.9.3 (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/0d9ae1253535f6e85a016e09c25ecbe6f7f59ef0
- https://git.kernel.org/stable/c/2a8d1d95302c7d52c6ac8fa5cb4a6948ae0d3a14
- https://git.kernel.org/stable/c/4eeffecc8e3cce25bb559502c2fd94a948bcde82
- https://git.kernel.org/stable/c/5213cc01d0464c011fdc09f318705603ed3a746b
- https://git.kernel.org/stable/c/77b2b67a0f8bce260c53907e5749d61466d90c87
- https://git.kernel.org/stable/c/95f00caf767b5968c2c51083957b38be4748a78a
- https://git.kernel.org/stable/c/da89ce46f02470ef08f0f580755d14d547da59ed
- https://git.kernel.org/stable/c/f1d4274a84c069be0f6098ab10c3443fc1f7134c
- https://git.kernel.org/stable/c/f3baf0f4f92af32943ebf27b960e0552c6c082fd
- https://git.kernel.org/stable/c/0d9ae1253535f6e85a016e09c25ecbe6f7f59ef0
- https://git.kernel.org/stable/c/2a8d1d95302c7d52c6ac8fa5cb4a6948ae0d3a14
- https://git.kernel.org/stable/c/4eeffecc8e3cce25bb559502c2fd94a948bcde82
- https://git.kernel.org/stable/c/5213cc01d0464c011fdc09f318705603ed3a746b
- https://git.kernel.org/stable/c/77b2b67a0f8bce260c53907e5749d61466d90c87
- https://git.kernel.org/stable/c/95f00caf767b5968c2c51083957b38be4748a78a
- https://git.kernel.org/stable/c/da89ce46f02470ef08f0f580755d14d547da59ed
- https://git.kernel.org/stable/c/f1d4274a84c069be0f6098ab10c3443fc1f7134c
- https://git.kernel.org/stable/c/f3baf0f4f92af32943ebf27b960e0552c6c082fd



