In the Linux kernel, the following vulnerability has been resolved:
rcu/kvfree: Fix data-race in _modtimer / kvfreecallrcu
KCSAN reports a data race when access the krcp->monitorwork.timer.expires variable in the scheduledelayedmonitorwork() function:
<snip> BUG: KCSAN: data-race in _modtimer / kvfreecallrcu
read to 0xffff888237d1cce8 of 8 bytes by task 10149 on cpu 1: scheduledelayedmonitorwork kernel/rcu/tree.c:3520 [inline] kvfreecallrcu+0x3b8/0x510 kernel/rcu/tree.c:3839 trieupdateelem+0x47c/0x620 kernel/bpf/lpmtrie.c:441 bpfmapupdatevalue+0x324/0x350 kernel/bpf/syscall.c:203 genericmapupdatebatch+0x401/0x520 kernel/bpf/syscall.c:1849 bpfmapdobatch+0x28c/0x3f0 kernel/bpf/syscall.c:5143 _sysbpf+0x2e5/0x7a0 _dosysbpf kernel/bpf/syscall.c:5741 [inline] _sesysbpf kernel/bpf/syscall.c:5739 [inline] _x64sysbpf+0x43/0x50 kernel/bpf/syscall.c:5739 x64syscall+0x2625/0x2d60 arch/x86/include/generated/asm/syscalls64.h:322 dosyscallx64 arch/x86/entry/common.c:52 [inline] dosyscall64+0xc9/0x1c0 arch/x86/entry/common.c:83 entrySYSCALL64after_hwframe+0x77/0x7f
write to 0xffff888237d1cce8 of 8 bytes by task 56 on cpu 0: _modtimer+0x578/0x7f0 kernel/time/timer.c:1173 addtimerglobal+0x51/0x70 kernel/time/timer.c:1330 _queuedelayedwork+0x127/0x1a0 kernel/workqueue.c:2523 queuedelayedworkon+0xdf/0x190 kernel/workqueue.c:2552 queuedelayedwork include/linux/workqueue.h:677 [inline] scheduledelayedmonitorwork kernel/rcu/tree.c:3525 [inline] kfreercumonitor+0x5e8/0x660 kernel/rcu/tree.c:3643 processonework kernel/workqueue.c:3229 [inline] processscheduledworks+0x483/0x9a0 kernel/workqueue.c:3310 workerthread+0x51d/0x6f0 kernel/workqueue.c:3391 kthread+0x1d1/0x210 kernel/kthread.c:389 retfromfork+0x4b/0x60 arch/x86/kernel/process.c:147 retfromforkasm+0x1a/0x30 arch/x86/entry/entry64.S:244
Reported by Kernel Concurrency Sanitizer on: CPU: 0 UID: 0 PID: 56 Comm: kworker/u8:4 Not tainted 6.12.0-rc2-syzkaller-00050-g5b7c893ed5ed #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 09/13/2024 Workqueue: eventsunbound kfreercu_monitor <snip>
kfreercumonitor() rearms the work if a "krcp" has to be still offloaded and this is done without holding krcp->lock, whereas the kvfreecallrcu() holds it.
Fix it by acquiring the "krcp->lock" for kfreercumonitor() so both functions do not race anymore.
[
{
"id": "CVE-2024-53160-3ff9f0b5",
"target": {
"file": "kernel/rcu/tree.c"
},
"signature_version": "v1",
"signature_type": "Line",
"digest": {
"line_hashes": [
"141894017335897843415369001308393281223",
"221480073951633952059607043975346487363",
"241564388278180638625850269457728695371",
"233820628753855134852125540000035395615",
"335758379625711869603593776336608836469",
"182075666081627606132364223733187298974",
"335530977699689495716505882470979344323",
"202295538701269550965891199178058798877",
"256248980767719777517043485959158496562",
"149973340317197179854572649480743173364",
"19381055888836101722789316863545763218"
],
"threshold": 0.9
},
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@967a0e61910825d1fad009d836a6cb41f7402395"
},
{
"id": "CVE-2024-53160-729cc67a",
"target": {
"file": "kernel/rcu/tree.c"
},
"signature_version": "v1",
"signature_type": "Line",
"digest": {
"line_hashes": [
"141894017335897843415369001308393281223",
"221480073951633952059607043975346487363",
"241564388278180638625850269457728695371",
"233820628753855134852125540000035395615",
"115962683584132091459617063963237298773",
"24220924652689929285098501306410682368",
"335530977699689495716505882470979344323",
"202295538701269550965891199178058798877",
"256248980767719777517043485959158496562",
"149973340317197179854572649480743173364",
"19381055888836101722789316863545763218"
],
"threshold": 0.9
},
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@5ced426d97ce84299ecfcc7bd8b38f975fd11089"
},
{
"id": "CVE-2024-53160-de87bbba",
"target": {
"file": "kernel/rcu/tree.c"
},
"signature_version": "v1",
"signature_type": "Line",
"digest": {
"line_hashes": [
"141894017335897843415369001308393281223",
"221480073951633952059607043975346487363",
"241564388278180638625850269457728695371",
"233820628753855134852125540000035395615",
"335758379625711869603593776336608836469",
"182075666081627606132364223733187298974",
"335530977699689495716505882470979344323",
"202295538701269550965891199178058798877",
"256248980767719777517043485959158496562",
"149973340317197179854572649480743173364",
"19381055888836101722789316863545763218"
],
"threshold": 0.9
},
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@05b8ea1f16667f07c8e5843fb4bde3e49d49ead8"
},
{
"id": "CVE-2024-53160-e1f786f2",
"target": {
"file": "kernel/rcu/tree.c"
},
"signature_version": "v1",
"signature_type": "Line",
"digest": {
"line_hashes": [
"141894017335897843415369001308393281223",
"221480073951633952059607043975346487363",
"241564388278180638625850269457728695371",
"233820628753855134852125540000035395615",
"115962683584132091459617063963237298773",
"24220924652689929285098501306410682368",
"335530977699689495716505882470979344323",
"202295538701269550965891199178058798877",
"256248980767719777517043485959158496562",
"149973340317197179854572649480743173364",
"19381055888836101722789316863545763218"
],
"threshold": 0.9
},
"deprecated": false,
"source": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git@a23da88c6c80e41e0503e0b481a22c9eea63f263"
}
]